12#ifndef SST_CORE_SERIALIZATION_IMPL_SERIALIZE_AGGREGATE_H
13#define SST_CORE_SERIALIZATION_IMPL_SERIALIZE_AGGREGATE_H
15#ifndef SST_INCLUDING_SERIALIZE_H
17 "The header file sst/core/serialization/impl/serialize_aggregate.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/impl/serialize_utility.h"
21#include "sst/core/serialization/serializer.h"
30namespace SST::Core::Serialization {
59template <
size_t... INDEX>
63 void operator()(T&& t,
serializer& ser, ser_opt_t opt)
66 (SST_SER_NAME(std::get<INDEX>(t), std::to_string(INDEX).c_str(), opt), ...);
70template <
typename T,
size_t NFIELDS>
75#define SERIALIZE_AGGREGATE_IMPL(NFIELDS, ...) \
76 template <typename T> \
77 struct serialize_aggregate_impl<T, NFIELDS> : std::true_type \
79 void operator()(T& t, serializer& ser, ser_opt_t opt) \
81 auto& [__VA_ARGS__] = t; \
82 if ( ser.mode() == serializer::MAP ) { \
83 ser.mapper().map_hierarchy_start(ser.getMapName(), new ObjectMapContainer<T>(&t)); \
84 serialize_aggregate_map_impl<std::make_index_sequence<NFIELDS>>()(std::tie(__VA_ARGS__), ser, opt); \
85 ser.mapper().map_hierarchy_end(); \
88 [&](auto&... e) { (SST_SER(e), ...); }(__VA_ARGS__); \
93SERIALIZE_AGGREGATE_IMPL(1, a0);
94SERIALIZE_AGGREGATE_IMPL(2, a0, a1);
95SERIALIZE_AGGREGATE_IMPL(3, a0, a1, a2);
96SERIALIZE_AGGREGATE_IMPL(4, a0, a1, a2, a3);
97SERIALIZE_AGGREGATE_IMPL(5, a0, a1, a2, a3, a4);
98SERIALIZE_AGGREGATE_IMPL(6, a0, a1, a2, a3, a4, a5);
99SERIALIZE_AGGREGATE_IMPL(7, a0, a1, a2, a3, a4, a5, a6);
100SERIALIZE_AGGREGATE_IMPL(8, a0, a1, a2, a3, a4, a5, a6, a7);
101SERIALIZE_AGGREGATE_IMPL(9, a0, a1, a2, a3, a4, a5, a6, a7, a8);
102SERIALIZE_AGGREGATE_IMPL(10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9);
103SERIALIZE_AGGREGATE_IMPL(11, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
104SERIALIZE_AGGREGATE_IMPL(12, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
105SERIALIZE_AGGREGATE_IMPL(13, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
106SERIALIZE_AGGREGATE_IMPL(14, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
107SERIALIZE_AGGREGATE_IMPL(15, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
108SERIALIZE_AGGREGATE_IMPL(16, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
109SERIALIZE_AGGREGATE_IMPL(17, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16);
110SERIALIZE_AGGREGATE_IMPL(18, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17);
111SERIALIZE_AGGREGATE_IMPL(19, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18);
112SERIALIZE_AGGREGATE_IMPL(20, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19);
117constexpr bool is_aggregate_serializable_v =
118 std::conjunction_v<std::is_class<T>, std::is_aggregate<T>, std::negation<has_serialize_order<T>>,
122template <
typename T,
size_t N>
123constexpr bool is_aggregate_serializable_v<std::array<T, N>> =
false;
132 SST_FRIEND_SERIALIZE();
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_aggregate.h:72
Definition serialize_aggregate.h:55