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"
23#include <unordered_map>
25namespace SST::Core::Serialization {
33type_hash(
const char* key)
35 int len = ::strlen(key);
37 for (
int i = 0; i < len; ++i ) {
63 return B((a << 10) + a);
69ct_hash_rec(
const char* str)
71 return A(str[idx] + ct_hash_rec<idx - 1>(str));
78ct_hash_rec<size_t(-1)>(
const char* UNUSED(str))
94 return E((d >> 11) ^ d);
101 return D((c << 3) + c);
108ct_hash(
const char* str)
110 return C(ct_hash_rec<idx>(str));
114#define COMPILE_TIME_HASH(x) (::SST::Core::Serialization::pvt::ct_hash<sizeof(x) - 2>(x))
121 static constexpr uint32_t NullClsId = std::numeric_limits<uint32_t>::max();
123 virtual const char* cls_name()
const = 0;
125 virtual void serialize_order(
serializer& ser) = 0;
127 virtual uint32_t cls_id()
const = 0;
128 virtual std::string serialization_name()
const = 0;
133 enum cxn_flag_t { ConstructorFlag };
135 static void serializable_abort(uint32_t line,
const char* file,
const char* func,
const char* obj);
143#define ImplementVirtualSerializable(obj) \
146 static void throw_exc() \
148 ::SST::Core::Serialization::serializable_base::serializable_abort(__LINE__, __FILE__, __FUNCTION__, #obj); \
150 virtual const char* cls_name() const override \
154 virtual uint32_t cls_id() const override \
159 virtual std::string serialization_name() const override \
165#define NotSerializable(obj) \
168 static void throw_exc() \
170 ::SST::Core::Serialization::serializable_base::serializable_abort(__LINE__, __FILE__, __FUNCTION__, #obj); \
172 virtual void serialize_order(SST::Core::Serialization::serializer& UNUSED(sst)) override \
176 virtual uint32_t cls_id() const override \
179 return ::SST::Core::Serialization::serializable_base::NullClsId; \
181 static obj* construct_deserialize_stub() \
186 virtual std::string serialization_name() const override \
191 virtual const char* cls_name() const override \
197#define ImplementSerializableDefaultConstructor(obj, obj_str) \
200 virtual const char* cls_name() const override \
202 return SST::Core::Serialization::serializable_builder_impl<obj>::static_name(); \
204 virtual uint32_t cls_id() const override \
206 return SST::Core::Serialization::serializable_builder_impl<obj>::static_cls_id(); \
208 static obj* construct_deserialize_stub() \
212 virtual std::string serialization_name() const override \
218 friend class SST::Core::Serialization::serializable_builder_impl<obj>; \
219 static bool you_forgot_to_add_ImplementSerializable_to_this_class() \
224#define SER_FORWARD_AS_ONE(...) __VA_ARGS__
226#define ImplementSerializable(...) \
229 ImplementSerializableDefaultConstructor(SER_FORWARD_AS_ONE(__VA_ARGS__), #__VA_ARGS__)
238 virtual const char* name()
const = 0;
240 virtual uint32_t cls_id()
const = 0;
249 static const char* name_;
250 static const uint32_t cls_id_;
253 serializable_base* build()
const override {
return T::construct_deserialize_stub(); }
255 const char* name()
const override {
return name_; }
257 uint32_t cls_id()
const override {
return cls_id_; }
259 static uint32_t static_cls_id() {
return cls_id_; }
261 static const char* static_name() {
return name_; }
263 bool sanity(
serializable_base* ser)
override {
return (
typeid(T) ==
typeid(*ser)); }
269 using builder_map = std::unordered_map<long, serializable_builder*>;
270 static builder_map* builders_;
282 static bool sanity(
serializable_base* ser, uint32_t cls_id) {
return (*builders_)[cls_id]->sanity(ser); }
284 static void delete_statics();
288const char* serializable_builder_impl<T>::name_ =
typeid(T).name();
290const uint32_t serializable_builder_impl<T>::cls_id_ =
301#define SerializableName(obj) #obj
303#define DeclareSerializable(obj)
Definition serializable_base.h:119
Definition serializable_base.h:247
Definition serializable_base.h:232
Definition serializable_base.h:267
static uint32_t add_builder(serializable_builder *builder, const char *name)
Definition serializable_base.cc:37
Definition serializable_base.h:141
This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition serializer.h:45