#pragma once #include "base/base.hpp" #include #include #include #include #include #include /// @name std containers serialization /// TArchive should be an archive class in global namespace. //@{ template TArchive & operator << (TArchive & ar, std::pair const & t) { ar << t.first << t.second; return ar; } template TArchive & operator >> (TArchive & ar, std::pair & t) { ar >> t.first >> t.second; return ar; } template void save_like_map(TArchive & ar, TCont const & rMap) { uint32_t const count = static_cast(rMap.size()); ar << count; for (typename TCont::const_iterator i = rMap.begin(); i != rMap.end(); ++i) ar << i->first << i->second; } template void load_like_map(TArchive & ar, TCont & rMap) { rMap.clear(); uint32_t count; ar >> count; while (count > 0) { typename TCont::key_type t1; typename TCont::mapped_type t2; ar >> t1 >> t2; rMap.insert(make_pair(t1, t2)); --count; } } template void save_like_vector(TArchive & ar, TCont const & rCont) { uint32_t const count = static_cast(rCont.size()); ar << count; for (uint32_t i = 0; i < count; ++i) ar << rCont[i]; } template void load_like_vector(TArchive & ar, TCont & rCont) { rCont.clear(); uint32_t count; ar >> count; rCont.resize(count); for (uint32_t i = 0; i < count; ++i) ar >> rCont[i]; } template void save_like_set(TArchive & ar, TCont const & rSet) { uint32_t const count = static_cast(rSet.size()); ar << count; for (typename TCont::const_iterator it = rSet.begin(); it != rSet.end(); ++it) ar << *it; } template void load_like_set(TArchive & ar, TCont & rSet) { rSet.clear(); uint32_t count; ar >> count; for (uint32_t i = 0; i < count; ++i) { typename TCont::value_type val; ar >> val; rSet.insert(val); } } template TArchive & operator << (TArchive & ar, std::map const & rMap) { save_like_map(ar, rMap); return ar; } template TArchive & operator >> (TArchive & ar, std::map & rMap) { load_like_map(ar, rMap); return ar; } template TArchive & operator << (TArchive & ar, std::multimap const & rMap) { save_like_map(ar, rMap); return ar; } template TArchive & operator >> (TArchive & ar, std::multimap & rMap) { load_like_map(ar, rMap); return ar; } template TArchive & operator << (TArchive & ar, std::unordered_map const & rMap) { save_like_map(ar, rMap); return ar; } template TArchive & operator >> (TArchive & ar, std::unordered_map & rMap) { load_like_map(ar, rMap); return ar; } template TArchive & operator << (TArchive & ar, std::vector const & rVector) { save_like_vector(ar, rVector); return ar; } template TArchive & operator >> (TArchive & ar, std::vector & rVector) { load_like_vector(ar, rVector); return ar; } template TArchive & operator << (TArchive & ar, std::set const & rSet) { save_like_set(ar, rSet); return ar; } template TArchive & operator >> (TArchive & ar, std::set & rSet) { load_like_set(ar, rSet); return ar; } template TArchive & operator << (TArchive & ar, std::array const & rArray) { for (size_t i = 0; i < N; ++i) ar << rArray[i]; return ar; } template TArchive & operator >> (TArchive & ar, std::array & rArray) { for (size_t i = 0; i < N; ++i) ar >> rArray[i]; return ar; } //@}