Add serialization for unique_ptr and shared_ptr
This commit is contained in:
parent
44adf683ad
commit
0e85204a10
1 changed files with 59 additions and 0 deletions
|
@ -13,6 +13,7 @@
|
|||
#include <ios>
|
||||
#include <limits>
|
||||
#include <map>
|
||||
#include <memory>
|
||||
#include <set>
|
||||
#include <stdint.h>
|
||||
#include <string>
|
||||
|
@ -24,6 +25,20 @@
|
|||
|
||||
static const unsigned int MAX_SIZE = 0x02000000;
|
||||
|
||||
/**
|
||||
* Dummy data type to identify deserializing constructors.
|
||||
*
|
||||
* By convention, a constructor of a type T with signature
|
||||
*
|
||||
* template <typename Stream> T::T(deserialize_type, Stream& s)
|
||||
*
|
||||
* is a deserializing constructor, which builds the type by
|
||||
* deserializing it from s. If T contains const fields, this
|
||||
* is likely the only way to do so.
|
||||
*/
|
||||
struct deserialize_type {};
|
||||
constexpr deserialize_type deserialize {};
|
||||
|
||||
/**
|
||||
* Used to bypass the rule against non-const reference to temporary
|
||||
* where it makes sense with wrappers such as CFlatData or CTxDB
|
||||
|
@ -521,7 +536,17 @@ template<typename Stream, typename K, typename T, typename Pred, typename A> voi
|
|||
template<typename Stream, typename K, typename Pred, typename A> void Serialize(Stream& os, const std::set<K, Pred, A>& m);
|
||||
template<typename Stream, typename K, typename Pred, typename A> void Unserialize(Stream& is, std::set<K, Pred, A>& m);
|
||||
|
||||
/**
|
||||
* shared_ptr
|
||||
*/
|
||||
template<typename Stream, typename T> void Serialize(Stream& os, const std::shared_ptr<const T>& p);
|
||||
template<typename Stream, typename T> void Unserialize(Stream& os, std::shared_ptr<const T>& p);
|
||||
|
||||
/**
|
||||
* unique_ptr
|
||||
*/
|
||||
template<typename Stream, typename T> void Serialize(Stream& os, const std::unique_ptr<const T>& p);
|
||||
template<typename Stream, typename T> void Unserialize(Stream& os, std::unique_ptr<const T>& p);
|
||||
|
||||
|
||||
|
||||
|
@ -775,6 +800,40 @@ void Unserialize(Stream& is, std::set<K, Pred, A>& m)
|
|||
|
||||
|
||||
|
||||
/**
|
||||
* unique_ptr
|
||||
*/
|
||||
template<typename Stream, typename T> void
|
||||
Serialize(Stream& os, const std::unique_ptr<const T>& p)
|
||||
{
|
||||
Serialize(os, *p);
|
||||
}
|
||||
|
||||
template<typename Stream, typename T>
|
||||
void Unserialize(Stream& is, std::unique_ptr<const T>& p)
|
||||
{
|
||||
p.reset(new T(deserialize, is));
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* shared_ptr
|
||||
*/
|
||||
template<typename Stream, typename T> void
|
||||
Serialize(Stream& os, const std::shared_ptr<const T>& p)
|
||||
{
|
||||
Serialize(os, *p);
|
||||
}
|
||||
|
||||
template<typename Stream, typename T>
|
||||
void Unserialize(Stream& is, std::shared_ptr<const T>& p)
|
||||
{
|
||||
p = std::make_shared<const T>(deserialize, is);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Support for ADD_SERIALIZE_METHODS and READWRITE macro
|
||||
*/
|
||||
|
|
Loading…
Reference in a new issue