Ver Fonte

Added proper serialization for unordered_map

Ivan Savenko há 1 ano atrás
pai
commit
2ed355952c

+ 20 - 13
lib/CGeneralTextHandler.h

@@ -196,24 +196,31 @@ public:
 	template <typename Handler>
 	void serialize(Handler & h)
 	{
-		std::string key;
-		int64_t sz = stringsLocalizations.size();
-		h & sz;
-		if(h.saving)
+		if (h.version >= Handler::Version::SIMPLE_TEXT_CONTAINER_SERIALIZATION)
 		{
-			for(auto s : stringsLocalizations)
-			{
-				key = s.first;
-				h & key;
-				h & s.second;
-			}
+			h & stringsLocalizations;
 		}
 		else
 		{
-			for(size_t i = 0; i < sz; ++i)
+			std::string key;
+			int64_t sz = stringsLocalizations.size();
+			h & sz;
+			if(h.saving)
+			{
+				for(auto s : stringsLocalizations)
+				{
+					key = s.first;
+					h & key;
+					h & s.second;
+				}
+			}
+			else
 			{
-				h & key;
-				h & stringsLocalizations[key];
+				for(size_t i = 0; i < sz; ++i)
+				{
+					h & key;
+					h & stringsLocalizations[key];
+				}
 			}
 		}
 	}

+ 13 - 0
lib/serializer/BinaryDeserializer.h

@@ -487,6 +487,19 @@ public:
 		load(data.second);
 	}
 
+	template <typename T1, typename T2>
+	void load(std::unordered_map<T1,T2> &data)
+	{
+		ui32 length = readAndCheckLength();
+		data.clear();
+		T1 key;
+		for(ui32 i=0;i<length;i++)
+		{
+			load(key);
+			load(data[key]);
+		}
+	}
+
 	template <typename T1, typename T2>
 	void load(std::map<T1,T2> &data)
 	{

+ 10 - 0
lib/serializer/BinarySerializer.h

@@ -407,6 +407,16 @@ public:
 		save(data.second);
 	}
 	template <typename T1, typename T2>
+	void save(const std::unordered_map<T1,T2> &data)
+	{
+		*this & ui32(data.size());
+		for(auto i = data.begin(); i != data.end(); i++)
+		{
+			save(i->first);
+			save(i->second);
+		}
+	}
+	template <typename T1, typename T2>
 	void save(const std::map<T1,T2> &data)
 	{
 		*this & ui32(data.size());

+ 1 - 0
lib/serializer/ESerializationVersion.h

@@ -47,6 +47,7 @@ enum class ESerializationVersion : int32_t
 	COMPACT_STRING_SERIALIZATION,
 	COMPACT_INTEGER_SERIALIZATION,
 	REMOVE_FOG_OF_WAR_POINTER,
+	SIMPLE_TEXT_CONTAINER_SERIALIZATION,
 
 	CURRENT = REMOVE_FOG_OF_WAR_POINTER
 };