12#ifndef SST_CORE_SERIALIZATION_SERIALIZABLE_BASE_H
13#define SST_CORE_SERIALIZATION_SERIALIZABLE_BASE_H
15#include "sst/core/serialization/serializer.h"
16#include "sst/core/warnmacros.h"
25#include <unordered_map>
27namespace SST::Core::Serialization {
35type_hash(
const char* key)
37 int len = ::strlen(key);
39 for (
int i = 0; i < len; ++i ) {
65 return B((a << 10) + a);
71ct_hash_rec(
const char* str)
73 return A(str[idx] + ct_hash_rec<idx - 1>(str));
80ct_hash_rec<size_t(-1)>(
const char* UNUSED(str))
96 return E((d >> 11) ^ d);
103 return D((c << 3) + c);
110ct_hash(
const char* str)
112 return C(ct_hash_rec<idx>(str));
116#define COMPILE_TIME_HASH(x) (::SST::Core::Serialization::pvt::ct_hash<sizeof(x) - 2>(x))
123 static constexpr uint32_t NullClsId = std::numeric_limits<uint32_t>::max();
125 virtual const char* cls_name()
const = 0;
127 virtual void serialize_order(
serializer& ser) = 0;
129 virtual uint32_t cls_id()
const = 0;
130 virtual std::string serialization_name()
const = 0;
135 enum cxn_flag_t { ConstructorFlag };
137 static void serializable_abort(uint32_t line,
const char* file,
const char* func,
const char* obj);
145#define ImplementVirtualSerializable(obj) \
149 static void throw_exc() \
151 ::SST::Core::Serialization::serializable_base::serializable_abort(__LINE__, __FILE__, __FUNCTION__, #obj); \
153 virtual const char* cls_name() const override \
157 virtual uint32_t cls_id() const override \
162 virtual std::string serialization_name() const override \
168#define NotSerializable(obj) \
172 static void throw_exc() \
174 ::SST::Core::Serialization::serializable_base::serializable_abort(__LINE__, __FILE__, __FUNCTION__, #obj); \
176 virtual void serialize_order(SST::Core::Serialization::serializer& UNUSED(sst)) override \
180 virtual uint32_t cls_id() const override \
183 return ::SST::Core::Serialization::serializable_base::NullClsId; \
185 static obj* construct_deserialize_stub() \
190 virtual std::string serialization_name() const override \
195 virtual const char* cls_name() const override \
201#define ImplementSerializableDefaultConstructor(obj, obj_str) \
204 virtual const char* cls_name() const override \
206 return SST::Core::Serialization::serializable_builder_impl<obj>::static_name(); \
208 virtual uint32_t cls_id() const override \
210 return SST::Core::Serialization::serializable_builder_impl<obj>::static_cls_id(); \
212 static obj* construct_deserialize_stub() \
216 virtual std::string serialization_name() const override \
222 friend class SST::Core::Serialization::serializable_builder_impl<obj>; \
223 static bool you_forgot_to_add_ImplementSerializable_to_this_class() \
228#define SER_FORWARD_AS_ONE(...) __VA_ARGS__
230#define ImplementSerializable(...) \
233 ImplementSerializableDefaultConstructor(SER_FORWARD_AS_ONE(__VA_ARGS__), #__VA_ARGS__)
242 virtual const char* name()
const = 0;
244 virtual uint32_t cls_id()
const = 0;
253 static const char* name_;
254 static const uint32_t cls_id_;
257 serializable_base* build()
const override {
return T::construct_deserialize_stub(); }
259 const char* name()
const override {
return name_; }
261 uint32_t cls_id()
const override {
return cls_id_; }
263 static uint32_t static_cls_id() {
return cls_id_; }
265 static const char* static_name() {
return name_; }
267 bool sanity(
serializable_base* ser)
override {
return (
typeid(T) ==
typeid(*ser)); }
273 using builder_map = std::unordered_map<long, serializable_builder*>;
274 static builder_map* builders_;
286 static bool sanity(
serializable_base* ser, uint32_t cls_id) {
return (*builders_)[cls_id]->sanity(ser); }
288 static void delete_statics();
292const char* serializable_builder_impl<T>::name_ =
typeid(T).name();
294const uint32_t serializable_builder_impl<T>::cls_id_ =
305#define SerializableName(obj) #obj
307#define DeclareSerializable(obj)
Definition serializable_base.h:121
Definition serializable_base.h:251
Definition serializable_base.h:236
Definition serializable_base.h:271
static uint32_t add_builder(serializable_builder *builder, const char *name)
Definition serializable_base.cc:37
Definition serializable_base.h:143
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition serializer.h:43