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>
47void 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));
50void 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));
55template <
typename ELEM_T>
57serialize_array_element(
serializer& ser,
void* data, ser_opt_t opt,
size_t index)
59 sst_ser_object(ser,
static_cast<ELEM_T*
>(data)[index], opt,
nullptr);
64template <
typename ELEM_T>
66serialize_array_map_element(
serializer& ser,
void* data, ser_opt_t opt,
size_t index,
const char* name)
68 sst_ser_object(ser,
static_cast<ELEM_T*
>(data)[index], opt, name);
75constexpr bool is_trivial_element_v = std::is_arithmetic_v<T> || std::is_enum_v<T>;
81template <
typename OBJ_TYPE,
typename ELEM_T,
size_t SIZE>
84 void operator()(OBJ_TYPE& ary,
serializer& ser, ser_opt_t opt)
86 ser_opt_t elem_opt = SerOption::is_set(opt, SerOption::as_ptr_elem) ? SerOption::as_ptr : SerOption::none;
87 const auto& aPtr = get_ptr(ary);
88 switch ( ser.mode() ) {
91 serialize_array_map_element<ELEM_T>);
94 case serializer::UNPACK:
95 if constexpr ( std::is_pointer_v<OBJ_TYPE> ) {
97 ary =
reinterpret_cast<OBJ_TYPE
>(
new std::remove_pointer_t<OBJ_TYPE>);
102 if constexpr ( is_trivial_element_v<ELEM_T> )
103 ser.raw(&(*aPtr)[0],
sizeof(ELEM_T) * SIZE);
105 serialize_array(ser, &(*aPtr)[0], elem_opt, SIZE, serialize_array_element<ELEM_T>);
114template <
typename ELEM_T,
size_t SIZE>
117 SST_FRIEND_SERIALIZE();
120template <
typename ELEM_T,
size_t SIZE>
123 SST_FRIEND_SERIALIZE();
126template <
typename ELEM_T,
size_t SIZE>
127class serialize_impl<ELEM_T (*)[SIZE]> : pvt::serialize_impl_fixed_array<ELEM_T (*)[SIZE], ELEM_T, SIZE>
129 SST_FRIEND_SERIALIZE();
132template <
typename ELEM_T,
size_t SIZE>
136 SST_FRIEND_SERIALIZE();
140template <
typename ELEM_T,
typename SIZE_T>
145 ser_opt_t elem_opt = SerOption::is_set(opt, SerOption::as_ptr_elem) ? SerOption::as_ptr : SerOption::none;
146 switch (
const auto mode = ser.mode() ) {
147 case serializer::MAP:
148 if constexpr ( !std::is_void_v<ELEM_T> ) {
149 pvt::serialize_array_map(ser, ary.ptr, elem_opt, ary.size,
155 if constexpr ( std::is_void_v<ELEM_T> || pvt::is_trivial_element_v<ELEM_T> )
156 ser.binary(ary.ptr, ary.size);
158 ser.primitive(ary.size);
159 if ( mode == serializer::UNPACK ) ary.ptr =
new ELEM_T[ary.size];
160 pvt::serialize_array(ser, ary.ptr, elem_opt, ary.size, pvt::serialize_array_element<ELEM_T>);
166 SST_FRIEND_SERIALIZE();
175template <
typename ELEM_T>
179 SST_FRIEND_SERIALIZE();
184template <
typename ELEM_T,
typename SIZE_T>
186array(ELEM_T*& ptr, SIZE_T& size)
188 return { ptr, size };
191template <
typename SIZE_T>
192pvt::array_wrapper<void, SIZE_T>
193buffer(
void*& ptr, SIZE_T& size)
195 return { ptr, size };
198template <
typename ELEM_T>
Class used to map arrays.
Definition objectMap.h:850
Base class for objects created by the serializer mapping mode used to map the variables for objects.
Definition objectMap.h:112
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_array.h:35
Definition serialize_array.h:42
Definition serialize_array.h:83