#pragma once #include "Utils/IO/DataStream.hpp" #include #include #include namespace DataStreamAdapters { template struct TslRobinMap { template static void ReadFromDataStream(InputDataStream& s, tsl::robin_map& map) { static_assert(std::is_default_constructible_v); static_assert(std::is_move_constructible_v); uint64_t size; s.Read(size); map.reserve(size); for (uint64_t i = 0; i < size; ++i) { TKey key; if constexpr (std::is_same_v) { s.ReadGeneric(key); } else { s.ReadObjectAdapted(key); } TValue value; if constexpr (std::is_same_v) { s.ReadGeneric(value); } else { s.ReadObjectAdapted(value); } map.insert(std::move(key), std::move(value)); } } template static void WriteToDataStream(OutputDataStream& s, const tsl::robin_map& map) { s.Write((uint64_t)map.size()); for (auto it = map.begin(); it != map.end(); ++it) { if constexpr (std::is_same_v) { s.WriteGeneric(it.key()); } else { s.WriteObjectAdapted(it.key()); } if constexpr (std::is_same_v) { s.WriteGeneric(it.value()); } else { s.WriteObjectAdapted(it.value()); } } } }; template struct TslRobinSet { template static void ReadFromDataStream(InputDataStream& s, tsl::robin_set& set) { static_assert(std::is_default_constructible_v); static_assert(std::is_move_constructible_v); uint64_t size; s.Read(size); set.reserve(size); for (uint64_t i = 0; i < size; ++i) { TElement element; if constexpr (std::is_same_v) { s.ReadGeneric(element); } else { s.ReadObjectAdapted(element); } set.insert(std::move(element)); } } template static void WriteToDataStream(OutputDataStream& s, const tsl::array_set& set) { s.Write((uint64_t)set.size()); for (auto& element : set) { if constexpr (std::is_same_v) { s.WriteGeneric(element); } else { s.WriteObjectAdapted(element); } } } }; } // namespace DataStreamAdapters