41 #ifndef CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_
42 #define CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_
44 #include <cereal/details/static_object.hpp>
45 #include <cereal/types/memory.hpp>
46 #include <cereal/types/string.hpp>
55 #define CEREAL_BIND_TO_ARCHIVES(T) \
59 struct init_binding<T> { \
60 static bind_to_archives<T> const & b; \
62 bind_to_archives<T> const & init_binding<T>::b = \
63 ::cereal::detail::StaticObject< \
64 bind_to_archives<T > \
65 >::getInstance().bind(); \
81 template <
class Archive>
89 typedef std::function<void(void*, void const *)>
Serializer;
99 std::map<std::type_index, Serializers>
map;
107 template <
class Archive>
128 std::map<std::string, Serializers>
map;
132 template<
class T>
struct EmptyDeleter {
void operator()(T *)
const {} };
151 [](
void * arptr, std::shared_ptr<void> & dptr)
153 Archive & ar = *
static_cast<Archive*
>(arptr);
154 std::shared_ptr<T> ptr;
156 ar( ::cereal::memory_detail::make_ptr_wrapper(ptr) );
162 [](
void * arptr, std::unique_ptr<void> & dptr)
164 Archive & ar = *
static_cast<Archive*
>(arptr);
165 std::unique_ptr<T> ptr;
167 ar( ::cereal::memory_detail::make_ptr_wrapper(ptr) );
169 dptr.reset(ptr.release());
188 std::uint32_t
id = ar.registerPolymorphicType(name);
191 ar( _CEREAL_NVP(
"polymorphic_id",
id) );
194 if(
id & detail::msb_32bit )
196 std::string namestring(name);
197 ar( _CEREAL_NVP(
"polymorphic_name", namestring) );
207 [](
void * arptr,
void const * dptr)
209 Archive & ar = *
static_cast<Archive*
>(arptr);
215 ar( _CEREAL_NVP(
"ptr_wrapper", memory_detail::make_ptr_wrapper(ptr)) );
219 [](
void * arptr,
void const * dptr)
221 Archive & ar = *
static_cast<Archive*
>(arptr);
225 std::unique_ptr<T const, EmptyDeleter<T const>>
const ptr(static_cast<T const *>(dptr));
227 ar( _CEREAL_NVP(
"ptr_wrapper", memory_detail::make_ptr_wrapper(ptr)) );
239 template <
class Archive,
class T>
254 inline static void load(std::false_type) {}
255 inline static void save(std::false_type) {}
267 template <
class Archive,
class T>
278 template <
class Archive,
class T>
295 void bind(std::false_type)
const
297 instantiate_polymorphic_binding( (T*)0, 0,
adl_tag{} );
301 void bind(std::true_type)
const
309 bind( std::is_abstract<T>() );
331 void instantiate_polymorphic_binding( T*,
int,
adl_tag ) {};
335 #endif // CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_