12 #ifndef SST_CORE_SERIALIZATION_SERIALIZABLE_H
13 #define SST_CORE_SERIALIZATION_SERIALIZABLE_H
15 #include "sst/core/serialization/serializer.h"
16 #include "sst/core/warnmacros.h"
17 #include <unordered_map>
24 namespace Serialization {
31 inline uint32_t type_hash(
const char* key)
33 int len = ::strlen(key);
35 for(
int i = 0; i < len; ++i) {
51 constexpr uint32_t B(
const uint32_t b)
57 constexpr uint32_t A(
const uint32_t a)
59 return B( (a << 10 ) + a);
64 constexpr uint32_t ct_hash_rec(
const char* str)
66 return A( str[idx] + ct_hash_rec<idx-1>(str) );
72 constexpr uint32_t ct_hash_rec<size_t(-1)>(
const char* UNUSED(str))
78 constexpr uint32_t E(
const uint32_t e)
84 constexpr uint32_t D(
const uint32_t d)
86 return E( (d >> 11) ^ d);
90 constexpr uint32_t C(
const uint32_t c)
92 return D( (c << 3 ) + c);
98 constexpr uint32_t ct_hash(
const char* str)
100 return C(ct_hash_rec<idx>(str));
104 #define COMPILE_TIME_HASH(x) (::SST::Core::Serialization::pvt::ct_hash<sizeof(x)-2>(x))
112 static constexpr uint32_t NullClsId = std::numeric_limits<uint32_t>::max();
115 cls_name()
const = 0;
122 virtual std::string serialization_name()
const = 0;
127 typedef enum { ConstructorFlag } cxn_flag_t;
128 static void serializable_abort(uint32_t line,
const char* file,
const char* func,
const char* obj);
136 #define ImplementVirtualSerializable(obj) \
138 obj(cxn_flag_t flag __attribute__((unused))){}
141 #define NotSerializable(obj) \
145 serializable_abort(CALL_INFO_LONG, #obj); \
148 serialize_order(SST::Core::Serialization::serializer& UNUSED(sst)) override { \
152 cls_id() const override { \
157 construct_deserialize_stub() { \
161 virtual std::string \
162 serialization_name() const override { \
166 virtual const char* \
167 cls_name() const override { \
172 #define ImplementSerializableDefaultConstructor(obj) \
174 virtual const char* \
175 cls_name() const override { \
179 cls_id() const override { \
180 return SST::Core::Serialization::serializable_builder_impl<obj>::static_cls_id(); \
183 construct_deserialize_stub() { \
186 virtual std::string \
187 serialization_name() const override { \
191 friend class SST::Core::Serialization::serializable_builder_impl<obj>; \
193 you_forgot_to_add_ImplementSerializable_to_this_class() { \
197 #define SER_FORWARD_AS_ONE(...) __VA_ARGS__
199 #define ImplementSerializable(...) \
201 ImplementSerializableDefaultConstructor(SER_FORWARD_AS_ONE(__VA_ARGS__))
226 static const char* name_;
227 static const uint32_t cls_id_;
231 build()
const override {
232 return T::construct_deserialize_stub();
236 name()
const override {
241 cls_id()
const override {
257 return (
typeid(T) ==
typeid(*ser));
264 typedef std::unordered_map<long, serializable_builder*> builder_map;
265 static builder_map* builders_;
269 get_serializable(uint32_t cls_id);
280 return (*builders_)[cls_id]->sanity(ser);
303 #define SerializableName(obj) #obj
305 #define DeclareSerializable(obj)
308 #include "sst/core/serialization/serialize_serializable.h"
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition: serializer.h:35
Definition: serializable.h:223
Definition: serializable.h:109
Definition: serializable.h:204
static uint32_t add_builder(serializable_builder *builder, const char *name)
Definition: serializable.cc:37
Definition: serializable.h:261
Definition: serializable.h:132