mirror of
https://codeberg.org/comaps/comaps
synced 2025-12-20 13:23:59 +00:00
Organic Maps sources as of 02.04.2025 (fad26bbf22ac3da75e01e62aa01e5c8e11861005)
To expand with full Organic Maps and Maps.ME commits history run: git remote add om-historic [om-historic.git repo url] git fetch --tags om-historic git replace squashed-history historic-commits
This commit is contained in:
190
base/std_serialization.hpp
Normal file
190
base/std_serialization.hpp
Normal file
@@ -0,0 +1,190 @@
|
||||
#pragma once
|
||||
|
||||
#include <array>
|
||||
#include <map>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
|
||||
/// @name std containers serialization
|
||||
/// TArchive should be an archive class in global namespace.
|
||||
//@{
|
||||
template <class TArchive, class T1, class T2>
|
||||
TArchive & operator << (TArchive & ar, std::pair<T1, T2> const & t)
|
||||
{
|
||||
ar << t.first << t.second;
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T1, class T2>
|
||||
TArchive & operator >> (TArchive & ar, std::pair<T1, T2> & t)
|
||||
{
|
||||
ar >> t.first >> t.second;
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class TCont>
|
||||
void save_like_map(TArchive & ar, TCont const & rMap)
|
||||
{
|
||||
uint32_t const count = static_cast<uint32_t>(rMap.size());
|
||||
ar << count;
|
||||
|
||||
for (typename TCont::const_iterator i = rMap.begin(); i != rMap.end(); ++i)
|
||||
ar << i->first << i->second;
|
||||
}
|
||||
|
||||
template <class TArchive, class TCont>
|
||||
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 <class TArchive, class TCont>
|
||||
void save_like_vector(TArchive & ar, TCont const & rCont)
|
||||
{
|
||||
uint32_t const count = static_cast<uint32_t>(rCont.size());
|
||||
ar << count;
|
||||
|
||||
for (uint32_t i = 0; i < count; ++i)
|
||||
ar << rCont[i];
|
||||
}
|
||||
|
||||
template <class TArchive, class TCont>
|
||||
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 <class TArchive, class TCont>
|
||||
void save_like_set(TArchive & ar, TCont const & rSet)
|
||||
{
|
||||
uint32_t const count = static_cast<uint32_t>(rSet.size());
|
||||
ar << count;
|
||||
|
||||
for (typename TCont::const_iterator it = rSet.begin(); it != rSet.end(); ++it)
|
||||
ar << *it;
|
||||
}
|
||||
|
||||
template <class TArchive, class TCont>
|
||||
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 <class TArchive, class T1, class T2>
|
||||
TArchive & operator << (TArchive & ar, std::map<T1, T2> const & rMap)
|
||||
{
|
||||
save_like_map(ar, rMap);
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T1, class T2>
|
||||
TArchive & operator >> (TArchive & ar, std::map<T1, T2> & rMap)
|
||||
{
|
||||
load_like_map(ar, rMap);
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T1, class T2>
|
||||
TArchive & operator << (TArchive & ar, std::multimap<T1, T2> const & rMap)
|
||||
{
|
||||
save_like_map(ar, rMap);
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T1, class T2>
|
||||
TArchive & operator >> (TArchive & ar, std::multimap<T1, T2> & rMap)
|
||||
{
|
||||
load_like_map(ar, rMap);
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T1, class T2>
|
||||
TArchive & operator << (TArchive & ar, std::unordered_map<T1, T2> const & rMap)
|
||||
{
|
||||
save_like_map(ar, rMap);
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T1, class T2>
|
||||
TArchive & operator >> (TArchive & ar, std::unordered_map<T1, T2> & rMap)
|
||||
{
|
||||
load_like_map(ar, rMap);
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T>
|
||||
TArchive & operator << (TArchive & ar, std::vector<T> const & rVector)
|
||||
{
|
||||
save_like_vector(ar, rVector);
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T>
|
||||
TArchive & operator >> (TArchive & ar, std::vector<T> & rVector)
|
||||
{
|
||||
load_like_vector(ar, rVector);
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T>
|
||||
TArchive & operator << (TArchive & ar, std::set<T> const & rSet)
|
||||
{
|
||||
save_like_set(ar, rSet);
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T>
|
||||
TArchive & operator >> (TArchive & ar, std::set<T> & rSet)
|
||||
{
|
||||
load_like_set(ar, rSet);
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T, size_t N>
|
||||
TArchive & operator << (TArchive & ar, std::array<T, N> const & rArray)
|
||||
{
|
||||
for (size_t i = 0; i < N; ++i)
|
||||
ar << rArray[i];
|
||||
return ar;
|
||||
}
|
||||
|
||||
template <class TArchive, class T, size_t N>
|
||||
TArchive & operator >> (TArchive & ar, std::array<T, N> & rArray)
|
||||
{
|
||||
for (size_t i = 0; i < N; ++i)
|
||||
ar >> rArray[i];
|
||||
return ar;
|
||||
}
|
||||
//@}
|
||||
Reference in New Issue
Block a user