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" 24 #include <unordered_map> 34 type_hash(
const char* key)
36 int len = ::strlen(key);
38 for (
int i = 0; i < len; ++i ) {
64 return B((a << 10) + a);
70 ct_hash_rec(
const char* str)
72 return A(str[idx] + ct_hash_rec<idx - 1>(str));
79 ct_hash_rec<size_t(-1)>(
const char* UNUSED(str))
95 return E((d >> 11) ^ d);
102 return D((c << 3) + c);
107 template <
size_t idx>
109 ct_hash(
const char* str)
111 return C(ct_hash_rec<idx>(str));
115 #define COMPILE_TIME_HASH(x) (::SST::Core::Serialization::pvt::ct_hash<sizeof(x) - 2>(x)) 122 static constexpr uint32_t NullClsId = std::numeric_limits<uint32_t>::max();
124 virtual const char* cls_name()
const = 0;
126 virtual void serialize_order(
serializer& ser) = 0;
128 virtual uint32_t cls_id()
const = 0;
129 virtual std::string serialization_name()
const = 0;
134 enum cxn_flag_t { ConstructorFlag };
136 static void serializable_abort(uint32_t line,
const char* file,
const char* func,
const char* obj);
144 #define ImplementVirtualSerializable(obj) \ 148 static void throw_exc() \ 150 ::SST::Core::Serialization::serializable_base::serializable_abort(__LINE__, __FILE__, __FUNCTION__, #obj); \ 152 virtual const char* cls_name() const override \ 156 virtual uint32_t cls_id() const override \ 161 virtual std::string serialization_name() const override \ 167 #define NotSerializable(obj) \ 171 static void throw_exc() \ 173 ::SST::Core::Serialization::serializable_base::serializable_abort(__LINE__, __FILE__, __FUNCTION__, #obj); \ 175 virtual void serialize_order(SST::Core::Serialization::serializer& UNUSED(sst)) override \ 179 virtual uint32_t cls_id() const override \ 182 return ::SST::Core::Serialization::serializable_base::NullClsId; \ 184 static obj* construct_deserialize_stub() \ 189 virtual std::string serialization_name() const override \ 194 virtual const char* cls_name() const override \ 200 #define ImplementSerializableDefaultConstructor(obj, obj_str) \ 203 virtual const char* cls_name() const override \ 205 return SST::Core::Serialization::serializable_builder_impl<obj>::static_name(); \ 207 virtual uint32_t cls_id() const override \ 209 return SST::Core::Serialization::serializable_builder_impl<obj>::static_cls_id(); \ 211 static obj* construct_deserialize_stub() \ 215 virtual std::string serialization_name() const override \ 221 friend class SST::Core::Serialization::serializable_builder_impl<obj>; \ 222 static bool you_forgot_to_add_ImplementSerializable_to_this_class() \ 227 #define SER_FORWARD_AS_ONE(...) __VA_ARGS__ 229 #define ImplementSerializable(...) \ 232 ImplementSerializableDefaultConstructor(SER_FORWARD_AS_ONE(__VA_ARGS__), #__VA_ARGS__) 241 virtual const char* name()
const = 0;
243 virtual uint32_t cls_id()
const = 0;
252 static const char* name_;
253 static const uint32_t cls_id_;
256 serializable_base* build()
const override {
return T::construct_deserialize_stub(); }
258 const char* name()
const override {
return name_; }
260 uint32_t cls_id()
const override {
return cls_id_; }
262 static uint32_t static_cls_id() {
return cls_id_; }
264 static const char* static_name() {
return name_; }
266 bool sanity(
serializable_base* ser)
override {
return (
typeid(T) ==
typeid(*ser)); }
272 using builder_map = std::unordered_map<long, serializable_builder*>;
273 static builder_map* builders_;
285 static bool sanity(
serializable_base* ser, uint32_t cls_id) {
return (*builders_)[cls_id]->sanity(ser); }
287 static void delete_statics();
304 #define SerializableName(obj) #obj 306 #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:42
Definition: serializable_base.h:249
Definition: serializable_base.h:119
Definition: serializable_base.h:234
static uint32_t add_builder(serializable_builder *builder, const char *name)
Definition: serializable_base.cc:37
Definition: serializable_base.h:269
Definition: serializable_base.h:141