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