35#include <gtest/gtest.h>
38#include <unordered_map>
61 size_t h = 1469598103934665603ULL;
62 for (
const char c : s)
65 h *= 1099511628211ULL;
72 bool operator () (
const std::string &a,
const std::string &b)
const noexcept
74 if (a.size() != b.size())
76 for (
size_t i = 0; i < a.size(); ++i)
86 bool moved_from =
false;
88 explicit MoveTracked(
const int v = 0)
noexcept
94 MoveTracked(
const MoveTracked &rhs)
noexcept
100 MoveTracked(MoveTracked &&rhs)
noexcept
103 rhs.moved_from =
true;
106 MoveTracked &operator = (
const MoveTracked &rhs)
noexcept
113 MoveTracked &operator = (MoveTracked &&rhs)
noexcept
117 rhs.moved_from =
true;
147 auto m3 =
m2.insert(
"bar", 99);
162 auto duplicate =
m2.
insert(
"foo", 99);
165 ASSERT_NE(duplicate.find(
"foo"),
nullptr);
168 auto updated =
m2.insert_or_assign(
"foo", 99);
183 MoveTracked replacement{99};
184 auto duplicate =
m2.
insert(
"foo", std::move(replacement));
188 ASSERT_NE(duplicate.find(
"foo"),
nullptr);
189 EXPECT_EQ(duplicate.find(
"foo")->value, 42);
198 auto items = map.
items();
202 std::unordered_map<std::string, int>
seen;
203 for (
size_t i = 0; i < items.size(); ++i)
204 seen.emplace(items[i].first, items[i].second);
222 auto m3 =
m2.erase(
"b");
232 auto m4 =
m3.erase(
"a").erase(
"c");
240 std::vector<PersistentHashMap<std::string, int>>
versions;
243 for (
int i = 0; i < 100; ++i)
245 map = map.
insert(std::to_string(i), i * 10);
251 for (
int i = 0; i < 100; ++i)
258 auto items = map.
items();
263 for (
size_t i = 0; i <
keys.size(); ++i)
267 for (
size_t i = 0; i < items.size(); ++i)
272 for (
int i = 0; i < 100; ++i)
274 const std::string key = std::to_string(i);
281 for (
int i = 0; i <= 100; ++i)
284 for (
int i = 0; i < 100; ++i)
286 map = map.
erase(std::to_string(i));
297 auto duplicate = base.
insert(
"a", 99);
302 auto updated = base.insert_or_assign(
"a", 99);
318 auto duplicate =
m1.
insert(
"aleph", 2);
322 ASSERT_NE(duplicate.find(
"ALEPH"),
nullptr);
333 std::mt19937
rng(42);
334 std::uniform_int_distribution<int>
dist_op(0, 2);
335 std::uniform_int_distribution<int>
dist_key(0, 500);
338 std::unordered_map<int, std::string>
stdmap;
339 std::vector<PersistentHashMap<int, std::string>>
versions;
343 for (
int i = 0; i < 5000; ++i)
350 const std::string val =
"insert" + std::to_string(key) +
"_" + std::to_string(i);
356 const std::string val =
"assign" + std::to_string(key) +
"_" + std::to_string(i);
357 pmap =
pmap.insert_or_assign(key, val);
373 for (
const auto &[
k, v] :
stdmap)
size_t size_t int32_t value
constexpr size_t size() const noexcept
Return the number of elements stored in the stack.
Immutable unordered map backed by a Hash Array Mapped Trie (HAMT).
bool is_empty() const noexcept
Return true when this version has no bindings.
PersistentHashMap insert_or_assign(const Key &key, const T &value) const
Return a new version with key bound to value.
bool verify() const
Verify HAMT routing, collision, uniqueness and size invariants.
Array< std::pair< Key, T > > items() const
Return all key/value bindings in unspecified order.
PersistentHashMap insert(const Key &key, const T &value) const
Return a new version with key inserted if absent.
Array< Key > keys() const
Return all keys in unspecified order.
PersistentHashMap erase(const Key &key) const
Return a new version without key.
const T * find(const Key &key) const
Find a mapped value.
size_t size() const noexcept
Return the number of bindings stored in this version.
size_t blossom_maximum_cardinality_matching(const GT &g, DynDlist< typename GT::Arc * > &matching, SA sa=SA())
Alias of compute_maximum_cardinality_general_matching().
Main namespace for Aleph-w library functions.
size_t size(Node *root) noexcept
and
Check uniqueness with explicit hash + equality functors.
Immutable path-copying hash map backed by a HAMT.