summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorzankin <[email protected]>2024-11-25 00:52:54 +0300
committerzankin <[email protected]>2024-11-25 01:05:07 +0300
commit3977356f84191df044aa91e606ed9836859428e8 (patch)
tree24d4ff69ae44f5e0997882767af38b941731c943
parent1ab4c9de1bdddd2cded74f0f047d40c71c987d64 (diff)
util/ysaveload: support std::unordered_map std::unordered_set
commit_hash:e6d07240418ce606f7bdc9fef30cf2d87f1f456f
-rw-r--r--util/ysaveload.h11
-rw-r--r--util/ysaveload_ut.cpp222
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() {