#pragma once
#include <algorithm>
#include <array>
#include <utility>
#include "util/autovector.h"
namespace
rocksdb {
template
<
typename
K,
typename
V,
size_t
size = 128>
class
HashMap {
std::array<autovector<std::pair<K, V>, 1>, size> table_;
public
:
bool
Contains(K key) {
auto
& bucket = table_[key % size];
auto
it = std::find_if(
bucket.begin(), bucket.end(),
[key](
const
std::pair<K, V>& p) {
return
p.first == key; });
return
it != bucket.end();
}
void
Insert(K key, V value) {
auto
& bucket = table_[key % size];
bucket.push_back({key, value});
}
void
Delete(K key) {
auto
& bucket = table_[key % size];
auto
it = std::find_if(
bucket.begin(), bucket.end(),
[key](
const
std::pair<K, V>& p) {
return
p.first == key; });
if
(it != bucket.end()) {
auto
last = bucket.end() - 1;
if
(it != last) {
*it = *last;
}
bucket.pop_back();
}
}
V& Get(K key) {
auto
& bucket = table_[key % size];
auto
it = std::find_if(
bucket.begin(), bucket.end(),
[key](
const
std::pair<K, V>& p) {
return
p.first == key; });
return
it->second;
}
};
}