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" 21 #include <unordered_map> 25 namespace Serialization {
33 type_hash(
const char* key)
35 int len = ::strlen(key);
37 for (
int i = 0; i < len; ++i ) {
63 return B((a << 10) + a);
69 ct_hash_rec(
const char* str)
71 return A(str[idx] + ct_hash_rec<idx - 1>(str));
78 ct_hash_rec<size_t(-1)>(
const char* UNUSED(str))
94 return E((d >> 11) ^ d);
101 return D((c << 3) + c);
106 template <
size_t idx>
108 ct_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 typedef enum { ConstructorFlag } cxn_flag_t;
134 static void serializable_abort(uint32_t line,
const char* file,
const char* func,
const char* obj);
142 #define ImplementVirtualSerializable(obj) \ 144 static void throw_exc() \ 146 ::SST::Core::Serialization::serializable_base::serializable_abort(__LINE__, __FILE__, __FUNCTION__, #obj); \ 148 virtual const char* cls_name() const override { return #obj; } \ 149 virtual uint32_t cls_id() const override \ 154 virtual std::string serialization_name() const override \ 160 #define NotSerializable(obj) \ 162 static void throw_exc() \ 164 ::SST::Core::Serialization::serializable_base::serializable_abort(__LINE__, __FILE__, __FUNCTION__, #obj); \ 166 virtual void serialize_order(SST::Core::Serialization::serializer& UNUSED(sst)) override { throw_exc(); } \ 167 virtual uint32_t cls_id() const override \ 170 return ::SST::Core::Serialization::serializable_base::NullClsId; \ 172 static obj* construct_deserialize_stub() \ 177 virtual std::string serialization_name() const override \ 182 virtual const char* cls_name() const override { return #obj; } 185 #define ImplementSerializableDefaultConstructor(obj, obj_str) \ 187 virtual const char* cls_name() const override \ 189 return SST::Core::Serialization::serializable_builder_impl<obj>::static_name(); \ 191 virtual uint32_t cls_id() const override \ 193 return SST::Core::Serialization::serializable_builder_impl<obj>::static_cls_id(); \ 195 static obj* construct_deserialize_stub() { return new obj; } \ 196 virtual std::string serialization_name() const override { return obj_str; } \ 199 friend class SST::Core::Serialization::serializable_builder_impl<obj>; \ 200 static bool you_forgot_to_add_ImplementSerializable_to_this_class() { return false; } 202 #define SER_FORWARD_AS_ONE(...) __VA_ARGS__ 204 #define ImplementSerializable(...) \ 206 ImplementSerializableDefaultConstructor(SER_FORWARD_AS_ONE(__VA_ARGS__), #__VA_ARGS__) 215 virtual const char* name()
const = 0;
217 virtual uint32_t cls_id()
const = 0;
226 static const char* name_;
227 static const uint32_t cls_id_;
230 serializable_base* build()
const override {
return T::construct_deserialize_stub(); }
232 const char* name()
const override {
return name_; }
234 uint32_t cls_id()
const override {
return cls_id_; }
236 static uint32_t static_cls_id() {
return cls_id_; }
238 static const char* static_name() {
return name_; }
240 bool sanity(
serializable_base* ser)
override {
return (
typeid(T) ==
typeid(*ser)); }
246 typedef std::unordered_map<long, serializable_builder*> builder_map;
247 static builder_map* builders_;
259 static bool sanity(
serializable_base* ser, uint32_t cls_id) {
return (*builders_)[cls_id]->sanity(ser); }
261 static void delete_statics();
280 #define SerializableName(obj) #obj 282 #define DeclareSerializable(obj) This class is basically a wrapper for objects to declare the order in which their members should be s...
Definition: serializer.h:43
Definition: serializable_base.h:223
Definition: serializable_base.h:118
Definition: serializable_base.h:208
static uint32_t add_builder(serializable_builder *builder, const char *name)
Definition: serializable_base.cc:39
Definition: serializable_base.h:243
Definition: serializable_base.h:139