diff options
author | zankin <[email protected]> | 2024-11-25 00:52:54 +0300 |
---|---|---|
committer | zankin <[email protected]> | 2024-11-25 01:05:07 +0300 |
commit | 3977356f84191df044aa91e606ed9836859428e8 (patch) | |
tree | 24d4ff69ae44f5e0997882767af38b941731c943 | |
parent | 1ab4c9de1bdddd2cded74f0f047d40c71c987d64 (diff) |
util/ysaveload: support std::unordered_map std::unordered_set
commit_hash:e6d07240418ce606f7bdc9fef30cf2d87f1f456f
-rw-r--r-- | util/ysaveload.h | 11 | ||||
-rw-r--r-- | util/ysaveload_ut.cpp | 222 |
2 files changed, 208 insertions, 25 deletions
diff --git a/util/ysaveload.h b/util/ysaveload.h index ab6efa767ac..47698b13889 100644 --- a/util/ysaveload.h +++ b/util/ysaveload.h @@ -10,6 +10,9 @@ #include <util/stream/input.h> #include <util/system/compiler.h> +#include <unordered_map> +#include <unordered_set> + #ifndef __NVCC__ // cuda is compiled in C++14 mode at the time #include <optional> @@ -603,6 +606,10 @@ template <class T1, class T2, class T3, class T4, class T5> class TSerializer<THashMap<T1, T2, T3, T4, T5>>: public TMapSerializer<THashMap<T1, T2, T3, T4, T5>, false> { }; +template <class K, class T, class C, class A> +class TSerializer<std::unordered_map<K, T, C, A>>: public TMapSerializer<std::unordered_map<K, T, C, A>, false> { +}; + template <class T1, class T2, class T3, class T4, class T5> class TSerializer<THashMultiMap<T1, T2, T3, T4, T5>>: public TMapSerializer<THashMultiMap<T1, T2, T3, T4, T5>, false> { }; @@ -619,6 +626,10 @@ template <class T1, class T2, class T3, class T4> class TSerializer<THashSet<T1, T2, T3, T4>>: public TSetSerializer<THashSet<T1, T2, T3, T4>, false> { }; +template <class K, class C, class A> +class TSerializer<std::unordered_set<K, C, A>>: public TSetSerializer<std::unordered_set<K, C, A>, false> { +}; + template <class T1, class T2> class TSerializer<TQueue<T1, T2>> { public: diff --git a/util/ysaveload_ut.cpp b/util/ysaveload_ut.cpp index 078478ee41e..56d75a6e046 100644 --- a/util/ysaveload_ut.cpp +++ b/util/ysaveload_ut.cpp @@ -143,6 +143,16 @@ private: } { + std::map<ui16, ui32> map; + + map[(ui16)1] = 2; + map[(ui16)2] = 3; + map[(ui16)3] = 4; + + Save(&S_, map); + } + + { TMultiMap<ui16, ui32> multimap; multimap.emplace((ui16)1, 2); @@ -155,6 +165,88 @@ private: } { + std::multimap<ui16, ui32> multimap; + + multimap.emplace((ui16)1, 2); + multimap.emplace((ui16)2, 3); + multimap.emplace((ui16)2, 4); + multimap.emplace((ui16)2, 5); + multimap.emplace((ui16)3, 6); + + Save(&S_, multimap); + } + + { + THashMap<ui16, ui32> hmap; + + hmap[(ui16)1] = 2; + hmap[(ui16)2] = 3; + hmap[(ui16)3] = 4; + + Save(&S_, hmap); + } + + { + std::unordered_map<ui16, ui32> umap; + + umap[(ui16)1] = 2; + umap[(ui16)2] = 3; + umap[(ui16)3] = 4; + + Save(&S_, umap); + } + + { + THashMultiMap<TString, int> mm; + + mm.insert({"one", 1}); + mm.insert({"two", 2}); + mm.insert({"two", 22}); + + Save(&S_, mm); + } + + { + TSet<int> s; + + s.insert(2); + s.insert(3); + s.insert(4); + + Save(&S_, s); + } + + { + std::set<int> s; + + s.insert(2); + s.insert(3); + s.insert(4); + + Save(&S_, s); + } + + { + THashSet<int> hs; + + hs.insert(2); + hs.insert(3); + hs.insert(4); + + Save(&S_, hs); + } + + { + std::unordered_set<int> us; + + us.insert(2); + us.insert(3); + us.insert(4); + + Save(&S_, us); + } + + { TSaveHelper helper; Save(&S_, helper); @@ -214,16 +306,6 @@ private: Save(&S_, h); } - { - THashMultiMap<TString, int> mm; - - mm.insert({"one", 1}); - mm.insert({"two", 2}); - mm.insert({"two", 22}); - - Save(&S_, mm); - } - // load part { ui8 val; @@ -274,6 +356,16 @@ private: } { + std::map<ui16, ui32> map; + + Load(&S_, map); + UNIT_ASSERT_EQUAL(map.size(), 3); + UNIT_ASSERT_EQUAL(map[(ui16)1], 2); + UNIT_ASSERT_EQUAL(map[(ui16)2], 3); + UNIT_ASSERT_EQUAL(map[(ui16)3], 4); + } + + { TMultiMap<ui16, ui32> multimap; Load(&S_, multimap); @@ -294,6 +386,101 @@ private: } { + std::multimap<ui16, ui32> multimap; + + Load(&S_, multimap); + UNIT_ASSERT_EQUAL(multimap.size(), 5); + UNIT_ASSERT_EQUAL(multimap.find((ui16)1)->second, 2); + UNIT_ASSERT_EQUAL(multimap.find((ui16)3)->second, 6); + + std::set<ui32> values; + auto range = multimap.equal_range((ui16)2); + for (auto i = range.first; i != range.second; ++i) { + values.insert(i->second); + } + + UNIT_ASSERT_EQUAL(values.size(), 3); + UNIT_ASSERT_EQUAL(values.contains(3), true); + UNIT_ASSERT_EQUAL(values.contains(4), true); + UNIT_ASSERT_EQUAL(values.contains(5), true); + } + + { + THashMap<ui16, ui32> hmap; + + Load(&S_, hmap); + UNIT_ASSERT_EQUAL(hmap.size(), 3); + UNIT_ASSERT_EQUAL(hmap[(ui16)1], 2); + UNIT_ASSERT_EQUAL(hmap[(ui16)2], 3); + UNIT_ASSERT_EQUAL(hmap[(ui16)3], 4); + } + + { + std::unordered_map<ui16, ui32> umap; + + Load(&S_, umap); + UNIT_ASSERT_EQUAL(umap.size(), 3); + UNIT_ASSERT_EQUAL(umap[(ui16)1], 2); + UNIT_ASSERT_EQUAL(umap[(ui16)2], 3); + UNIT_ASSERT_EQUAL(umap[(ui16)3], 4); + } + + { + THashMultiMap<TString, int> mm; + + Load(&S_, mm); + + UNIT_ASSERT_EQUAL(mm.size(), 3); + UNIT_ASSERT_EQUAL(mm.count("one"), 1); + auto oneIter = mm.equal_range("one").first; + UNIT_ASSERT_EQUAL(oneIter->second, 1); + UNIT_ASSERT_EQUAL(mm.count("two"), 2); + auto twoIter = mm.equal_range("two").first; + UNIT_ASSERT_EQUAL(twoIter->second, 2); + UNIT_ASSERT_EQUAL((++twoIter)->second, 22); + } + + { + TSet<int> s; + + Load(&S_, s); + UNIT_ASSERT_EQUAL(s.size(), 3); + UNIT_ASSERT_EQUAL(s.contains(2), true); + UNIT_ASSERT_EQUAL(s.contains(3), true); + UNIT_ASSERT_EQUAL(s.contains(4), true); + } + + { + std::set<int> s; + + Load(&S_, s); + UNIT_ASSERT_EQUAL(s.size(), 3); + UNIT_ASSERT_EQUAL(s.contains(2), true); + UNIT_ASSERT_EQUAL(s.contains(3), true); + UNIT_ASSERT_EQUAL(s.contains(4), true); + } + + { + THashSet<int> hs; + + Load(&S_, hs); + UNIT_ASSERT_EQUAL(hs.size(), 3); + UNIT_ASSERT_EQUAL(hs.contains(2), true); + UNIT_ASSERT_EQUAL(hs.contains(3), true); + UNIT_ASSERT_EQUAL(hs.contains(4), true); + } + + { + std::unordered_set<int> us; + + Load(&S_, us); + UNIT_ASSERT_EQUAL(us.size(), 3); + UNIT_ASSERT_EQUAL(us.contains(2), true); + UNIT_ASSERT_EQUAL(us.contains(3), true); + UNIT_ASSERT_EQUAL(us.contains(4), true); + } + + { TSaveHelper helper; Load(&S_, helper); @@ -363,21 +550,6 @@ private: Load(&S_, h); UNIT_ASSERT(!h); } - - { - THashMultiMap<TString, int> mm; - - Load(&S_, mm); - - UNIT_ASSERT_EQUAL(mm.size(), 3); - UNIT_ASSERT_EQUAL(mm.count("one"), 1); - auto oneIter = mm.equal_range("one").first; - UNIT_ASSERT_EQUAL(oneIter->second, 1); - UNIT_ASSERT_EQUAL(mm.count("two"), 2); - auto twoIter = mm.equal_range("two").first; - UNIT_ASSERT_EQUAL(twoIter->second, 2); - UNIT_ASSERT_EQUAL((++twoIter)->second, 22); - } } inline void TestSaveLoadEmptyStruct() { |