12 #ifndef SST_CORE_SERIALIZATION_IMPL_SERIALIZE_ARRAY_H 13 #define SST_CORE_SERIALIZATION_IMPL_SERIALIZE_ARRAY_H 15 #ifndef SST_INCLUDING_SERIALIZE_H 17 "The header file sst/core/serialization/impl/serialize_array.h should not be directly included as it is not part of the stable public API. The file is included in sst/core/serialization/serialize.h" 20 #include "sst/core/serialization/serializer.h" 24 #include <type_traits> 33 template <
typename ELEM_T,
typename SIZE_T>
40 template <
typename ELEM_T>
47 void serialize_array(
serializer& ser,
void* data, ser_opt_t opt,
size_t size,
48 void serialize_array_element(
serializer& ser,
void* data, ser_opt_t opt,
size_t index));
50 void serialize_array_map(
serializer& ser,
void* data, ser_opt_t opt,
size_t size,
ObjectMap* map,
51 void serialize_array_map_element(
serializer& ser,
void* data, ser_opt_t opt,
size_t index,
const char* name));
55 template <
typename ELEM_T>
57 serialize_array_element(
serializer& ser,
void* data, ser_opt_t opt,
size_t index)
59 SST_SER(static_cast<ELEM_T*>(data)[index], opt);
64 template <
typename ELEM_T>
66 serialize_array_map_element(
serializer& ser,
void* data, ser_opt_t opt,
size_t index,
const char* name)
68 SST_SER_NAME(static_cast<ELEM_T*>(data)[index], name, opt);
75 template <
typename OBJ_TYPE,
typename ELEM_T,
size_t SIZE>
78 void operator()(OBJ_TYPE& ary,
serializer& ser, ser_opt_t opt)
80 ser_opt_t elem_opt = SerOption::is_set(opt, SerOption::as_ptr_elem) ? SerOption::as_ptr : SerOption::none;
81 const auto& aPtr = get_ptr(ary);
82 switch ( ser.mode() ) {
85 serialize_array_map_element<ELEM_T>);
88 case serializer::UNPACK:
89 if constexpr ( std::is_pointer_v<OBJ_TYPE> ) {
91 ary =
reinterpret_cast<OBJ_TYPE
>(
new std::remove_pointer_t<OBJ_TYPE>);
98 if constexpr ( is_trivially_serializable_v<ELEM_T> )
99 ser.raw(&(*aPtr)[0],
sizeof(ELEM_T) * SIZE);
101 serialize_array(ser, &(*aPtr)[0], elem_opt, SIZE, serialize_array_element<ELEM_T>);
110 template <
typename ELEM_T,
size_t SIZE>
113 SST_FRIEND_SERIALIZE();
116 template <
typename ELEM_T,
size_t SIZE>
119 SST_FRIEND_SERIALIZE();
122 template <
typename ELEM_T,
size_t SIZE>
125 SST_FRIEND_SERIALIZE();
128 template <
typename ELEM_T,
size_t SIZE>
132 SST_FRIEND_SERIALIZE();
136 template <
typename ELEM_T,
typename SIZE_T>
141 ser_opt_t elem_opt = SerOption::is_set(opt, SerOption::as_ptr_elem) ? SerOption::as_ptr : SerOption::none;
142 const auto mode = ser.mode();
145 if ( mode != serializer::UNPACK )
146 size = get_array_size(ary.size,
"Serialization Error: Array size in SST::Core::Serialization::array() " 147 "cannot fit inside size_t. size_t should be used for array sizes.\n");
149 if ( mode == serializer::MAP ) {
150 if constexpr ( !std::is_void_v<ELEM_T> ) {
152 pvt::serialize_array_map_element<ELEM_T>);
159 if constexpr ( std::is_void_v<ELEM_T> || is_trivially_serializable_v<ELEM_T> )
160 ser.binary(ary.ptr, size);
163 if ( mode == serializer::UNPACK ) ary.ptr =
new ELEM_T[size];
164 pvt::serialize_array(ser, ary.ptr, elem_opt, size, pvt::serialize_array_element<ELEM_T>);
166 if ( mode == serializer::UNPACK ) ary.size =
static_cast<SIZE_T
>(size);
169 SST_FRIEND_SERIALIZE();
178 template <
typename ELEM_T>
182 SST_FRIEND_SERIALIZE();
187 template <
typename ELEM_T,
typename SIZE_T>
189 array(ELEM_T*& ptr, SIZE_T& size)
191 return { ptr, size };
194 template <
typename SIZE_T>
195 pvt::array_wrapper<void, SIZE_T>
196 buffer(
void*& ptr, SIZE_T& size)
198 return { ptr, size };
201 template <
typename ELEM_T>
202 pvt::raw_ptr_wrapper<ELEM_T>
203 raw_ptr(ELEM_T*& ptr)
210 #endif // SST_CORE_SERIALIZATION_IMPL_SERIALIZE_ARRAY_H Definition: serialize_array.h:34
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition: serializer.h:42
Base serialize class.
Definition: serialize.h:113
Base class for objects created by the serializer mapping mode used to map the variables for objects...
Definition: objectMap.h:158
Class used to map arrays.
Definition: objectMap.h:1480
Definition: serialize_array.h:76
Definition: serialize_array.h:41