19template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
23template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
26 : comparator(comparator), value_comparator(comparator),
27 tree(value_comparator, allocator) {}
29template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
34template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
37 : comparator(other.comparator), value_comparator(other.comparator),
40template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
44 comparator = other.comparator;
45 value_comparator = other.comparator;
50template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
53 : comparator(std::move(other.comparator)),
54 value_comparator(std::move(other.comparator)),
55 tree(std::move(other.tree)) {}
57template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
61 comparator = std::move(other.comparator);
62 value_comparator = std::move(other.comparator);
63 tree = std::move(other.tree);
67template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
74template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
77 return tree.get_allocator();
80template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
86template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
89 return value_comparator;
94template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
96 TAlloc>::mapped_type *>
100 std::vector<const mapped_type *> values;
101 for (
auto node : nodes) {
102 values.push_back(&node->item.second);
107template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
112 if (node ==
nullptr) {
115 return &node->item.second;
118template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
122 return node !=
nullptr;
127template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
130 return tree.size(version) == 0;
133template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
137 return tree.size(version);
140template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
143 return tree.get_height(version);
148template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
153template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
158 auto [node, inserted] =
159 tree.insert(item.first, [&]() { return item; }, version,
false);
161 return std::make_pair(inserted, node->version);
164template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
169 auto [node, inserted] = tree.insert(
170 item.first, [&]() { return std::move(item); }, version,
false);
172 return std::make_pair(inserted, node->version);
175template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
176template <
class TMapped>
181 auto [node, inserted] = tree.insert(
182 key, [&]() {
return value_type(key, std::forward<TMapped>(value)); },
185 return std::make_pair(inserted, node->version);
188template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
189template <
class TMapped>
194 auto [node, inserted] = tree.insert(
197 return value_type(std::move(key), std::forward<TMapped>(value));
201 return std::make_pair(inserted, node->version);
204template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
205template <
class... Args>
211 auto insert_callback = [&]() {
212 return value_type(std::piecewise_construct, std::forward_as_tuple(key),
213 std::forward_as_tuple(std::forward<Args>(args)...));
216 auto [node, inserted] = tree.insert(key, insert_callback, version,
false);
218 return std::make_pair(inserted, node->version);
221template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
222template <
class... Args>
228 auto insert_callback = [&]() {
230 std::forward_as_tuple(std::move(key)),
231 std::forward_as_tuple(std::forward<Args>(args)...));
234 auto [node, inserted] = tree.insert(key, insert_callback, version,
false);
236 return std::make_pair(inserted, node->version);
239template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
244 return tree.erase(key, version);
247template <
class TKey,
class TValue,
class TKeyComp,
class TAlloc>
250 std::swap(tree, other.tree);
251 std::swap(comparator, other.comparator);
252 std::swap(value_comparator, other.value_comparator);
typename base::node_ptr node_ptr
Definition _persistent_avl.hpp:107
A persistent map type using an AVL tree as the underlying structure.
Definition persistent_map.hpp:51
std::pair< bool, version_type > erase(const key_type &key, version_type version) noexcept
Erases an item with the given key.
Definition persistent_map.ipp:242
~persistent_map() noexcept
Definition persistent_map.ipp:68
void clear() noexcept
Erases the whole tree with all its versions.
Definition persistent_map.ipp:149
std::pair< const key_type, const mapped_type > value_type
Definition persistent_map.hpp:59
int get_height(version_type version) const noexcept
Returns the height of the underlying tree in the given version.
Definition persistent_map.ipp:141
typename alloc_traits::size_type size_type
Definition persistent_map.hpp:105
bool contains(const key_type &key, version_type version) const noexcept
Checks whether there exists an item with given key in the tree.
Definition persistent_map.ipp:119
TValue mapped_type
Definition persistent_map.hpp:58
bool empty(version_type version) const noexcept
Checks whether the map contains any values in a given version.
Definition persistent_map.ipp:128
std::pair< bool, version_type > try_emplace(const key_type &key, version_type version, Args &&...args)
Construct an item in-place.
value_compare value_comp() const noexcept
Returns the function that compares keys in the key, value pairs.
Definition persistent_map.ipp:88
std::vector< const mapped_type * > list_in_order(version_type version) const noexcept
Returns a vector of values sorted by keys.
Definition persistent_map.ipp:97
persistent_map()
Definition persistent_map.ipp:20
size_type size(version_type version) const noexcept
Returns the current number of items in the given version.
Definition persistent_map.ipp:135
std::pair< bool, version_type > insert_or_assign(const key_type &key, TMapped &&value, version_type version)
Inserts an item or assigns the value.
void swap(persistent_map &other) noexcept
Swaps the content.
Definition persistent_map.ipp:248
TAlloc allocator_type
Definition persistent_map.hpp:103
std::pair< bool, version_type > insert(const value_type &item, version_type version)
Inserts an item.
Definition persistent_map.ipp:156
typename tree_type::version_type version_type
Definition persistent_map.hpp:124
persistent_map & operator=(const persistent_map &other)
Definition persistent_map.ipp:42
TKey key_type
Definition persistent_map.hpp:57
const mapped_type * find(const key_type &key, version_type version) const noexcept
Access specified item.
Definition persistent_map.ipp:109
key_compare key_comp() const noexcept
Returns the function that compares keys.
Definition persistent_map.ipp:82
TKeyComp key_compare
Definition persistent_map.hpp:66
allocator_type get_allocator() const noexcept
Returns the associated allocator.
Definition persistent_map.ipp:76
Declarations of the persistent map.
Definition _avl.hpp:14
Definition persistent_map.hpp:73