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"
26namespace SST::Core::Serialization {
33template <
typename ELEM_T,
typename SIZE_T>
40template <
typename ELEM_T>
50template <
typename ELEM_T,
typename SIZE_T>
52array(ELEM_T*& ptr, SIZE_T& size)
57template <
typename SIZE_T>
58pvt::array_wrapper<void, SIZE_T>
59buffer(
void*& ptr, SIZE_T& size)
64template <
typename ELEM_T>
74template <
class ELEM_T,
class SIZE_T>
75class ObjectMapArray :
public ObjectMapContainer<ELEM_T>
81 virtual size_t getSize()
const {
return size_; }
82 ObjectMapArray(ELEM_T* addr, SIZE_T& size) :
83 ObjectMapContainer<ELEM_T>(addr),
89 for (
const auto& [name, child] : this->
variables_ )
90 if ( child !=
nullptr ) child->decRefCount();
97 std::move(
dynamic_cast<ObjectMapArray&
>(*ObjectMapSerialization(array(this->addr_, size_))).
variables_);
105void serialize_array(
serializer& ser,
void* data, ser_opt_t opt,
size_t size,
106 void serialize_array_element(
serializer& ser,
void* data, ser_opt_t opt,
size_t index));
108void serialize_array_map(
serializer& ser,
void* data, ser_opt_t opt,
size_t size,
ObjectMap* map,
109 void serialize_array_map_element(
serializer& ser,
void* data, ser_opt_t opt,
size_t index,
const char* name));
113template <
typename ELEM_T>
115serialize_array_element(
serializer& ser,
void* data, ser_opt_t opt,
size_t index)
117 SST_SER(
static_cast<ELEM_T*
>(data)[index], opt);
122template <
typename ELEM_T>
124serialize_array_map_element(
serializer& ser,
void* data, ser_opt_t opt,
size_t index,
const char* name)
126 SST_SER_NAME(
static_cast<ELEM_T*
>(data)[index], name, opt);
133template <
typename OBJ_TYPE,
typename ELEM_T,
size_t SIZE>
136 void operator()(OBJ_TYPE& ary,
serializer& ser, ser_opt_t opt)
138 using T = std::remove_pointer_t<OBJ_TYPE>;
139 ser_opt_t elem_opt = SerOption::is_set(opt, SerOption::as_ptr_elem) ? SerOption::as_ptr : SerOption::none;
140 const auto& aPtr = get_ptr(ary);
141 switch ( ser.mode() ) {
142 case serializer::MAP:
144 ser, &(*aPtr)[0], elem_opt, SIZE,
new ObjectMapContainer<T>(aPtr), serialize_array_map_element<ELEM_T>);
147 case serializer::UNPACK:
148 if constexpr ( std::is_pointer_v<OBJ_TYPE> ) {
150 if constexpr ( std::is_array_v<T> )
151 ary =
reinterpret_cast<OBJ_TYPE
>(
new std::remove_extent_t<T>[std::extent_v<T>]);
153 ary =
reinterpret_cast<OBJ_TYPE
>(
new T);
160 if constexpr ( is_trivially_serializable_v<ELEM_T> )
161 ser.raw(&(*aPtr)[0],
sizeof(ELEM_T) * SIZE);
163 serialize_array(ser, &(*aPtr)[0], elem_opt, SIZE, serialize_array_element<ELEM_T>);
172template <
typename ELEM_T,
size_t SIZE>
175 SST_FRIEND_SERIALIZE();
178template <
typename ELEM_T,
size_t SIZE>
181 SST_FRIEND_SERIALIZE();
184template <
typename ELEM_T,
size_t SIZE>
185class serialize_impl<ELEM_T (*)[SIZE]> : pvt::serialize_impl_fixed_array<ELEM_T (*)[SIZE], ELEM_T, SIZE>
187 SST_FRIEND_SERIALIZE();
190template <
typename ELEM_T,
size_t SIZE>
194 SST_FRIEND_SERIALIZE();
198template <
typename ELEM_T,
typename SIZE_T>
203 ser_opt_t elem_opt = SerOption::is_set(opt, SerOption::as_ptr_elem) ? SerOption::as_ptr : SerOption::none;
204 const auto mode = ser.mode();
207 if ( mode != serializer::UNPACK )
208 size = get_array_size(ary.size,
"Serialization Error: Array size in SST::Core::Serialization::array() "
209 "cannot fit inside size_t. size_t should be used for array sizes.\n");
211 if ( mode == serializer::MAP ) {
212 if constexpr ( !std::is_void_v<ELEM_T> )
213 pvt::serialize_array_map(ser, ary.ptr, elem_opt, size,
216 ser.binary(ary.ptr, ary.size);
222 if constexpr ( std::is_void_v<ELEM_T> || is_trivially_serializable_v<ELEM_T> )
223 ser.binary(ary.ptr, ary.size);
225 ser.primitive(ary.size);
226 if ( mode == serializer::UNPACK ) {
227 size = get_array_size(ary.size,
"Serialization Error: Array size in SST::Core::Serialization::array() "
228 "cannot fit inside size_t. size_t should be used for array sizes.\n");
229 ary.ptr =
new ELEM_T[size];
231 pvt::serialize_array(ser, ary.ptr, elem_opt, size, pvt::serialize_array_element<ELEM_T>);
235 SST_FRIEND_SERIALIZE();
244template <
typename ELEM_T>
248 SST_FRIEND_SERIALIZE();
Class used to map unbounded arrays with runtime size.
Definition serialize_array.h:76
void refresh() override
Refresh the ObjectMap, reconstructing children.
Definition serialize_array.h:86
Class used to map containers.
Definition objectMap.h:1420
ObjectMultimap variables_
Map that child ObjectMaps are stored in.
Definition objectMap.h:621
Base class for objects created by the serializer mapping mode used to map the variables for objects.
Definition objectMap.h:188
Base serialize class.
Definition serialize.h:132
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition serializer.h:43
Definition serialize_array.h:35
Definition serialize_array.h:42
Definition serialize_array.h:135