44 #ifndef CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_ 45 #define CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_ 59 #define CEREAL_BIND_TO_ARCHIVES(T) \ 63 struct init_binding<T> { \ 64 static bind_to_archives<T> const & b; \ 65 static void unused() { (void)b; } \ 67 bind_to_archives<T> const & init_binding<T>::b = \ 68 ::cereal::detail::StaticObject< \ 70 >::getInstance().bind(); \ 86 template <
class Archive>
94 typedef std::function<void(void*, void const *)>
Serializer;
99 Serializer shared_ptr,
104 std::map<std::type_index, Serializers>
map;
108 template<
class T>
struct EmptyDeleter {
void operator()(T *)
const {} };
115 template <
class Archive>
126 typedef std::function<void(void*, std::unique_ptr<void, EmptyDeleter<void>> & )>
UniqueSerializer;
136 std::map<std::string, Serializers>
map;
155 auto lb = map.lower_bound(key);
157 if (lb != map.end() && lb->first == key)
163 [](
void * arptr, std::shared_ptr<void> & dptr)
165 Archive & ar = *
static_cast<Archive*
>(arptr);
166 std::shared_ptr<T> ptr;
168 ar(
CEREAL_NVP_(
"ptr_wrapper", ::cereal::memory_detail::make_ptr_wrapper(ptr)) );
174 [](
void * arptr, std::unique_ptr<void, EmptyDeleter<void>> & dptr)
176 Archive & ar = *
static_cast<Archive*
>(arptr);
177 std::unique_ptr<T> ptr;
179 ar(
CEREAL_NVP_(
"ptr_wrapper", ::cereal::memory_detail::make_ptr_wrapper(ptr)) );
181 dptr.reset(ptr.release());
184 map.insert( lb, { std::move(key), std::move(serializers) } );
200 std::uint32_t
id = ar.registerPolymorphicType(name);
206 if(
id & detail::msb_32bit )
208 std::string namestring(name);
231 #ifdef _LIBCPP_VERSION 233 wrappedPtr = std::shared_ptr<T const>(
234 std::const_pointer_cast<T
const>(
235 std::shared_ptr<T>( refCount,
static_cast<T *
>(
const_cast<void *
>(dptr) ))));
236 #else // NOT _LIBCPP_VERSION 237 wrappedPtr = std::shared_ptr<T const>( refCount,
static_cast<T
const *
>(dptr) );
238 #endif // _LIBCPP_VERSION 242 inline std::shared_ptr<T const>
const &
operator()()
const {
return wrappedPtr; }
245 std::shared_ptr<void> refCount;
246 std::shared_ptr<T const> wrappedPtr;
261 ar(
CEREAL_NVP_(
"ptr_wrapper", memory_detail::make_ptr_wrapper( psptr() ) ) );
275 ar(
CEREAL_NVP_(
"ptr_wrapper", memory_detail::make_ptr_wrapper( psptr() ) ) );
282 auto key = std::type_index(
typeid(T));
283 auto lb = map.lower_bound(key);
285 if (lb != map.end() && lb->first == key)
291 [&](
void * arptr,
void const * dptr)
293 Archive & ar = *
static_cast<Archive*
>(arptr);
299 #else // not _MSC_VER 300 savePolymorphicSharedPtr( ar, dptr, typename ::cereal::traits::has_shared_from_this<T>::type() );
305 [&](
void * arptr,
void const * dptr)
307 Archive & ar = *
static_cast<Archive*
>(arptr);
311 std::unique_ptr<T const, EmptyDeleter<T const>>
const ptr(static_cast<T const *>(dptr));
313 ar(
CEREAL_NVP_(
"ptr_wrapper", memory_detail::make_ptr_wrapper(ptr)) );
316 map.insert( { std::move(key), std::move(serializers) } );
326 namespace {
struct polymorphic_binding_tag {}; }
329 template <
class Archive,
class T>
344 inline static void load(std::false_type) {}
345 inline static void save(std::false_type) {}
357 template <
class Archive,
class T>
360 #if defined(_MSC_VER) && !defined(__INTEL_COMPILER) 364 #else // NOT _MSC_VER 374 template <
class Archive,
class T>
378 std::is_base_of<detail::OutputArchiveBase, Archive>::value &&
382 std::is_base_of<detail::InputArchiveBase, Archive>::value &&
391 template <
class T,
class Tag = polymorphic_binding_tag>
395 void bind(std::false_type)
const 401 void bind(std::true_type)
const 409 static_assert( std::is_polymorphic<T>::value,
410 "Attempting to register non polymorphic type" );
411 bind( std::is_abstract<T>() );
417 template <
class T,
class Tag = polymorphic_binding_tag>
432 template <
class T,
typename BindingTag>
437 #endif // CEREAL_DETAILS_POLYMORPHIC_IMPL_HPP_ #define CEREAL_NVP_(name, value)
Convenience for creating a templated NVP.
Definition: helpers.hpp:197
void instantiate_polymorphic_binding(T *, int, BindingTag, adl_tag)
Base case overload for instantiation.
Definition: polymorphic_impl.hpp:433
static void savePolymorphicSharedPtr(Archive &ar, void const *dptr, std::true_type)
Does the actual work of saving a polymorphic shared_ptr.
Definition: polymorphic_impl.hpp:257
Definition: helpers.hpp:232
Struct containing the serializer functions for all pointer types.
Definition: polymorphic_impl.hpp:97
When specialized, causes the compiler to instantiate its parameter.
Definition: polymorphic_impl.hpp:350
Used to hide the static object used to bind T to registered archives.
Definition: polymorphic_impl.hpp:418
Definition: memory.hpp:117
Serializer unique_ptr
Serializer function for unique pointers.
Definition: polymorphic_impl.hpp:99
Holds a properly typed shared_ptr to the polymorphic type.
Definition: polymorphic_impl.hpp:214
std::shared_ptr< T const > const & operator()() const
Get the wrapped shared_ptr */.
Definition: polymorphic_impl.hpp:242
bind_to_archives const & bind() const
Binds the type T to all registered archives.
Definition: polymorphic_impl.hpp:407
Determine if T or any base class of T has inherited from std::enable_shared_from_this.
Definition: traits.hpp:1140
void bind(std::false_type) const
Binding for non abstract types.
Definition: polymorphic_impl.hpp:395
Definition: access.hpp:39
Serializer shared_ptr
Serializer function for shared/weak pointers.
Definition: polymorphic_impl.hpp:99
OutputBindingCreator()
Initialize the binding.
Definition: polymorphic_impl.hpp:279
static CEREAL_DLL_EXPORT void instantiate() CEREAL_USED
Definition: polymorphic_impl.hpp:375
Definition: traits.hpp:1035
Definition: polymorphic_impl.hpp:322
Creates a binding (map entry) between an output archive type and a polymorphic type.
Definition: polymorphic_impl.hpp:193
Support for types found in <string>
Causes the static object bindings between an archive type and a serializable type T...
Definition: polymorphic_impl.hpp:330
static void writeMetadata(Archive &ar)
Writes appropriate metadata to the archive for this polymorphic type.
Definition: polymorphic_impl.hpp:196
An empty noop deleter.
Definition: polymorphic_impl.hpp:108
std::map< std::type_index, Serializers > map
A map of serializers for pointers of all registered types.
Definition: polymorphic_impl.hpp:104
instantiate_function< instantiate > unused
This typedef causes the compiler to instantiate this static function.
Definition: polymorphic_impl.hpp:369
Binds a compile time type with a user defined string.
Definition: polymorphic_impl.hpp:79
PolymorphicSharedPointerWrapper(void const *dptr)
Definition: polymorphic_impl.hpp:229
Definition: helpers.hpp:228
std::function< void(void *, void const *)> Serializer
A serializer function.
Definition: polymorphic_impl.hpp:94
#define CEREAL_DLL_EXPORT
Prevent link optimization from removing non-referenced static objects.
Definition: static_object.hpp:45
Begins the binding process of a type to all registered archives.
Definition: polymorphic_impl.hpp:392
A static, pre-execution object.
Definition: static_object.hpp:61
static void savePolymorphicSharedPtr(Archive &ar, void const *dptr, std::false_type)
Does the actual work of saving a polymorphic shared_ptr.
Definition: polymorphic_impl.hpp:272
A structure holding a map from type_indices to output serializer functions.
Definition: polymorphic_impl.hpp:87
Support for types found in <memory>
Internal polymorphism static object support.
void bind(std::true_type) const
Binding for abstract types.
Definition: polymorphic_impl.hpp:401