12#ifndef SST_CORE_SERIALIZATION_SERIALIZE_H
13#define SST_CORE_SERIALIZATION_SERIALIZE_H
15#include "sst/core/from_string.h"
16#include "sst/core/serialization/objectMap.h"
17#include "sst/core/serialization/serializer.h"
18#include "sst/core/warnmacros.h"
32#define SST_FRIEND_SERIALIZE() \
33 template <class SER> \
34 friend class pvt::serialize
46using ser_opt_t = uint32_t;
62 as_ptr_elem = 1u << 2,
64 map_read_only = 1u << 3,
77 return flags &
static_cast<ser_opt_t
>(option);
81namespace Core::Serialization {
84void sst_ser_object(
serializer& ser, T&& obj, ser_opt_t options = SerOption::none,
const char* name =
nullptr);
89constexpr decltype(
auto)
92 if constexpr ( std::is_pointer_v<T> )
108template <
typename T,
typename =
void>
111 template <
typename,
typename =
void>
112 struct has_serialize_order : std::false_type
115 template <
typename U>
116 struct has_serialize_order<U,
117 std::void_t<decltype(std::declval<U>().serialize_order(std::declval<serializer&>()))>> : std::true_type
120 static_assert(std::is_class_v<std::remove_pointer_t<T>> && !std::is_polymorphic_v<std::remove_pointer_t<T>>,
121 "Trying to serialize an object that is not serializable.");
123 static_assert(has_serialize_order<std::remove_pointer_t<T>>::value,
124 "Serializable class does not have serialize_order() method");
127 void operator()(T& t,
serializer& ser, ser_opt_t UNUSED(options))
129 const auto& tPtr = get_ptr(t);
130 const auto mode = ser.mode();
131 if ( mode == serializer::MAP ) {
134 ser.report_object_map(map);
135 ser.mapper().map_hierarchy_start(ser.getMapName(), map);
137 else if constexpr ( std::is_pointer_v<T> ) {
138 if ( mode == serializer::UNPACK ) {
139 t =
new std::remove_pointer_t<T>();
140 ser.report_new_pointer(
reinterpret_cast<uintptr_t
>(t));
145 tPtr->serialize_order(ser);
147 if ( mode == serializer::MAP ) ser.mapper().map_hierarchy_end();
163 friend void SST::Core::Serialization::sst_ser_object(
serializer& ser, U&& obj, ser_opt_t options,
const char* name);
175 void serialize_and_track_pointer(T& t,
serializer& ser, ser_opt_t options)
177 if ( !ser.is_pointer_tracking_enabled() )
return serialize_impl<T>()(t, ser, options);
180 uintptr_t ptr =
reinterpret_cast<uintptr_t
>(&t);
182 switch ( ser.mode() ) {
183 case serializer::SIZER:
188 if ( ser.check_pointer_pack(ptr) ) {
197 case serializer::PACK:
200 ser.check_pointer_pack(ptr);
206 case serializer::UNPACK:
212 uintptr_t ptr_stored;
213 ser.unpack(ptr_stored);
216 ser.report_real_pointer(ptr_stored, ptr);
220 case serializer::MAP:
231 friend void SST::Core::Serialization::sst_ser_object(
serializer& ser, U&& obj, ser_opt_t options,
const char* name);
232 void operator()(T*& t,
serializer& ser, ser_opt_t options)
235 if ( !ser.is_pointer_tracking_enabled() ) {
237 char null_char = (
nullptr == t ? 0 : 1);
238 switch ( ser.mode() ) {
239 case serializer::SIZER:
245 if ( null_char == 0 )
return;
250 case serializer::PACK:
256 if ( null_char == 0 )
return;
261 case serializer::UNPACK:
264 ser.unpack(null_char);
267 if ( 0 == null_char ) {
274 case serializer::MAP:
282 uintptr_t ptr =
reinterpret_cast<uintptr_t
>(t);
283 if (
nullptr == t ) ptr = 0;
285 switch ( ser.mode() ) {
286 case serializer::SIZER:
291 if ( 0 == ptr )
return;
295 if ( !ser.check_pointer_pack(ptr) ) {
299 case serializer::PACK:
304 if ( 0 == ptr )
return;
306 if ( !ser.check_pointer_pack(ptr) ) {
310 case serializer::UNPACK:
313 uintptr_t ptr_stored;
314 ser.unpack(ptr_stored);
317 if ( 0 == ptr_stored ) {
322 uintptr_t real_ptr = ser.check_pointer_unpack(ptr_stored);
325 t =
reinterpret_cast<T*
>(real_ptr);
329 ser.report_real_pointer(ptr_stored,
reinterpret_cast<uintptr_t
>(t));
333 case serializer::MAP:
335 ObjectMap* map = ser.check_pointer_map(
reinterpret_cast<uintptr_t
>(t));
336 if ( map !=
nullptr ) {
339 ser.mapper().map_existing_object(ser.getMapName(), map);
357class serialize_impl<T, std::enable_if_t<std::is_arithmetic_v<T> || std::is_enum_v<T>>>
360 void operator()(T& t,
serializer& ser, ser_opt_t options)
362 if ( ser.mode() == serializer::MAP ) {
364 if ( SerOption::is_set(options, SerOption::map_read_only) ) {
365 ser.mapper().setNextObjectReadOnly();
367 ser.mapper().map_primitive(ser.getMapName(), obj_map);
373 SST_FRIEND_SERIALIZE();
384class serialize_impl<T*, std::enable_if_t<std::is_arithmetic_v<T> || std::is_enum_v<T>>>
386 void operator()(T*& t,
serializer& ser, ser_opt_t UNUSED(options))
388 switch ( ser.mode() ) {
389 case serializer::SIZER:
392 case serializer::PACK:
395 case serializer::UNPACK:
399 case serializer::MAP:
402 if ( SerOption::is_set(options, SerOption::map_read_only) ) {
403 ser.mapper().setNextObjectReadOnly();
405 ser.mapper().map_primitive(ser.getMapName(), obj_map);
410 SST_FRIEND_SERIALIZE();
422sst_ser_object(
serializer& ser, T&& obj, ser_opt_t options,
const char* name)
428 if ( !ser.is_pointer_tracking_enabled() ) {
434 if ( ser.mode() == serializer::MAP ) {
437 if ( SerOption::is_set(options, SerOption::no_map) )
return;
439 pvt::serialize<std::remove_reference_t<T>>()(obj, ser, options);
443 if constexpr ( !std::is_pointer_v<std::remove_reference_t<T>> ) {
445 if ( SerOption::is_set(options, SerOption::as_ptr) ) {
446 pvt::serialize<std::remove_reference_t<T>>().serialize_and_track_pointer(obj, ser, options);
449 pvt::serialize<std::remove_reference_t<T>>()(obj, ser, options);
463 "The ser& format for serialization has been deprecated and will be removed in SST 16. Please use SST_SER macro "
464 "for serializing data. The macro "
465 "supports additional options to control the details of serialization. See SerOption enum for details.")]]
469 SST::Core::Serialization::sst_ser_object(ser, obj, SerOption::no_map);
473[[deprecated(
"The ser| format for serialization has been deprecated and will be removed in SST 16. Please use SST_SER "
475 "SerOption::as_ptr flag for serializing data. The macro supports additional options to control the "
476 "details of serialization. See SerOption enum for details.")]]
480 SST::Core::Serialization::sst_ser_object(ser, obj, SerOption::no_map | SerOption::as_ptr);
485#define SST_SER(obj, ...) \
486 SST::Core::Serialization::sst_ser_object( \
487 ser, (obj), SST::Core::Serialization::pvt::sst_ser_or_helper(__VA_ARGS__), #obj)
489#define SST_SER_NAME(obj, name, ...) \
490 SST::Core::Serialization::sst_ser_object( \
491 ser, (obj), SST::Core::Serialization::pvt::sst_ser_or_helper(__VA_ARGS__), name)
497template <
typename... Args>
499sst_ser_or_helper(Args... args)
501 return (SerOption::none | ... | args);
511#define SST_INCLUDING_SERIALIZE_H
512#include "sst/core/serialization/impl/serialize_adapter.h"
513#include "sst/core/serialization/impl/serialize_array.h"
514#include "sst/core/serialization/impl/serialize_atomic.h"
515#include "sst/core/serialization/impl/serialize_insertable.h"
516#include "sst/core/serialization/impl/serialize_string.h"
517#include "sst/core/serialization/impl/serialize_tuple.h"
521#undef SST_INCLUDING_SERIALIZE_H
ObjectMap object for non-fundamental, non-container types.
Definition objectMap.h:609
ObjectMap context which is saved in a virtual stack when name or other information changes.
Definition serializer.h:278
ObjectMap representing fundamental types, and classes treated as fundamental types.
Definition objectMap.h:753
Base class for objects created by the serializer mapping mode used to map the variables for objects.
Definition objectMap.h:112
Serialization "gateway" object called by sst_ser_object().
Definition serialize.h:161
Base serialize class.
Definition serialize.h:110
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition serializer.h:45
Definition serialize.h:49
Options
Options use to control how serialization acts for specific elements that are serialized.
Definition serialize.h:54