template <typename K, typename V>
class ConcurrentMap {
std::unordered_map<K, V> map;
std::atomic<hazard_pointer<std::unordered_map<K, V>>> new_map;
public:
V get(K key) {
return map[key];
}
void put(K key, V value) {
std::unordered_map<K, V>* old_map;
while (!(old_map = new_map.load()->get())) {}
map[key] = value;
new_map.store(hazard_pointer<std::unordered_map<K, V>>(&map, old_map));
}
void remove(K key) {
std::unordered_map<K, V>* old_map;
while (!(old_map = new_map.load()->get())) {}
map.erase(key);
new_map.store(hazard_pointer<std::unordered_map<K, V>>(&map, old_map));
}
};