1#ifndef UTIL_PERSISTENT_MAP_H_
2#define UTIL_PERSISTENT_MAP_H_
6#include <immer/algorithm.hpp>
7#include <immer/map.hpp>
8#include <immer/map_transient.hpp>
9#include <immer/memory_policy.hpp>
10#include <immer/set.hpp>
29template <
typename K,
typename V,
typename Hash>
32 using memory_policy = immer::memory_policy<
33 immer::default_heap_policy,
34 immer::unsafe_refcount_policy,
35 immer::no_lock_policy>;
36 using map_t = immer::map<K, V, Hash, std::equal_to<K>, memory_policy>;
50 return m_.size() == 0;
55 const V *
find(
const K &k)
const
62 const V &
at(
const K &k)
const
68 void set(
const K &k,
const V &v)
70 m_ = std::move(m_).set(k, v);
75 void set(
const K &k, V &&v)
77 m_ = std::move(m_).set(k, std::move(v));
86 m_ = std::move(m_).update(k, std::forward<Fn>(fn));
92 std::size_t n = m_.size();
93 m_ = std::move(m_).erase(k);
94 return m_.size() != n;
118 template <
class Added,
class Removed,
class Changed>
123 Changed &&changed)
const
129 std::forward<Added>(added),
130 std::forward<Removed>(removed),
131 std::forward<Changed>(changed)));
143template <
typename K,
typename Hash>
146 using memory_policy = immer::memory_policy<
147 immer::default_heap_policy,
148 immer::unsafe_refcount_policy,
149 immer::no_lock_policy>;
150 using set_t = immer::set<K, Hash, std::equal_to<K>, memory_policy>;
164 return s_.size() == 0;
176 s_ = std::move(s_).insert(k);
182 std::size_t n = s_.size();
183 s_ = std::move(s_).erase(k);
184 return s_.size() != n;
201 template <
class Added,
class Removed>
208 std::forward<Added>(added), std::forward<Removed>(removed)));
bool erase(const K &k)
Definition persistent_map.h:90
const V * find(const K &k) const
Definition persistent_map.h:55
void diff(const persistent_map &other, Added &&added, Removed &&removed, Changed &&changed) const
Definition persistent_map.h:119
const_iterator begin() const
Definition persistent_map.h:103
void set(const K &k, const V &v)
Definition persistent_map.h:68
const V & at(const K &k) const
Definition persistent_map.h:62
void clear()
Definition persistent_map.h:97
std::size_t size() const
Definition persistent_map.h:43
bool empty() const
Definition persistent_map.h:48
const_iterator end() const
Definition persistent_map.h:107
void set(const K &k, V &&v)
Definition persistent_map.h:75
void update(const K &k, Fn &&fn)
Definition persistent_map.h:84
typename map_t::iterator const_iterator
Definition persistent_map.h:102
std::size_t size() const
Definition persistent_map.h:157
const_iterator end() const
Definition persistent_map.h:192
bool empty() const
Definition persistent_map.h:162
typename set_t::iterator const_iterator
Definition persistent_map.h:187
const_iterator begin() const
Definition persistent_map.h:188
void diff(const persistent_set &other, Added &&added, Removed &&removed) const
Definition persistent_map.h:202
std::size_t count(const K &k) const
Definition persistent_map.h:168
void insert(const K &k)
Definition persistent_map.h:174
bool erase(const K &k)
Definition persistent_map.h:180
@ other
Definition converter_compare.cpp:887