// // Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2022 // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #include "td/utils/common.h" #include "td/utils/FlatHashMap.h" #include "td/utils/tests.h" #include #include "td/utils/Random.h" #include "td/utils/algorithm.h" TEST(FlatHashMap, basic) { { td::FlatHashMap map; map[1] = 2; ASSERT_EQ(2, map[1]); ASSERT_EQ(1, map.find(1)->first); ASSERT_EQ(2, map.find(1)->second); // ASSERT_EQ(1, map.find(1)->key()); // ASSERT_EQ(2, map.find(1)->value()); for (auto &kv : map) { ASSERT_EQ(1, kv.first); ASSERT_EQ(2, kv.second); } map.erase(map.find(1)); auto map_copy = map; } td::FlatHashMap, 20>> x; auto y = std::move(x); x[12]; x.erase(x.find(12)); { td::FlatHashMap map = {{1, "hello"}, {2, "world"}}; ASSERT_EQ("hello", map[1]); ASSERT_EQ("world", map[2]); ASSERT_EQ(2u, map.size()); ASSERT_EQ("", map[3]); ASSERT_EQ(3u, map.size()); } { td::FlatHashMap map = {{1, "hello"}, {1, "world"}}; ASSERT_EQ("world", map[1]); ASSERT_EQ(1u, map.size()); } } template auto extract_kv(const T &reference) { auto expected = td::transform(reference, [](auto &it) {return std::make_pair(it.first, it.second);}); std::sort(expected.begin(), expected.end()); return expected; } TEST(FlatHashMap, remove_if_basic) { td::Random::Xorshift128plus rnd(123); for (int test_i = 0; test_i < 1000000; test_i++) { std::unordered_map reference; td::FlatHashMap table; LOG_IF(ERROR, test_i % 1000 == 0) << test_i; int N = rnd.fast(1, 1000); for (int i = 0; i < N; i++) { auto key = rnd(); auto value = i; reference[key] = value; table[key] = value; } ASSERT_EQ(extract_kv(reference), extract_kv(table)); std::vector> kv; td::table_remove_if(table, [&](auto &it) {kv.emplace_back(it.first, it.second); return it.second % 2 == 0; }); std::sort(kv.begin(), kv.end()); ASSERT_EQ(extract_kv(reference), kv); td::table_remove_if(reference, [](auto &it) {return it.second % 2 == 0;}); ASSERT_EQ(extract_kv(reference), extract_kv(table)); } }