emd22

fx serialization shit

Nov 10th, 2025
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.22 KB | None | 0 0
  1.  
  2. template <typename T>
  3. concept C_IsIntType = C_IsAnyOf<T, int16, uint16, int32, uint32, int64, uint64>;
  4.  
  5. template <typename T>
  6. concept C_IsFloatType = std::is_same_v<T, float32>;
  7.  
  8. template <typename T>
  9. concept C_IsSerializable = C_IsIntType<T> || C_IsFloatType<T>;
  10.  
  11.  
  12. struct FxSerializerValue
  13. {
  14. public:
  15.     enum Type
  16.     {
  17.         eInt,
  18.         eFloat,
  19.     };
  20.  
  21. public:
  22.     FxSerializerValue() = delete;
  23.  
  24.     template <typename T>
  25.         requires C_IsIntType<T>
  26.     explicit FxSerializerValue(T value) : Type(eInt), IntValue(value)
  27.     {
  28.     }
  29.  
  30.     template <typename T>
  31.         requires C_IsFloatType<T>
  32.     explicit FxSerializerValue(T value) : Type(eFloat), FloatValue(value)
  33.     {
  34.     }
  35.  
  36. public:
  37.     Type Type;
  38.  
  39.     union
  40.     {
  41.         int64 IntValue;
  42.         float32 FloatValue;
  43.     };
  44. };
  45.  
  46. class FxSerializer
  47. {
  48. public:
  49.     FxSerializer() { Values.Create(16); }
  50.  
  51.     FxSerializer(const FxSerializer& other) = delete;
  52.  
  53.  
  54.     template <typename T>
  55.         requires C_IsSerializable<T>
  56.     FxSerializer& operator<<(T value)
  57.     {
  58.         Values.Insert(FxSerializerValue { value });
  59.         return *this;
  60.     }
  61.  
  62.     template <typename T>
  63.         requires C_IsSerializable<T>
  64.     FxSerializer& Add(T& member)
  65.     {
  66.         if (bInWriteMode) {
  67.             (*this) << member;
  68.         }
  69.         else {
  70.             (*this) >> member;
  71.         }
  72.  
  73.         return *this;
  74.     }
  75.  
  76.     void SetWriteMode() { bInWriteMode = true; }
  77.     void SetReadMode() { bInWriteMode = false; }
  78.  
  79.     template <typename T>
  80.         requires C_IsSerializable<T>
  81.     FxSerializer& operator>>(T& value)
  82.     {
  83.         if (WriteIndex > Values.Size()) {
  84.             return *this;
  85.         }
  86.  
  87.         FxSerializerValue& stored_value = Values[WriteIndex++];
  88.  
  89.         if constexpr (C_IsIntType<T>) {
  90.             value = stored_value.IntValue;
  91.         }
  92.         else if constexpr (C_IsFloatType<T>) {
  93.             value = stored_value.FloatValue;
  94.         }
  95.  
  96.         return *this;
  97.     }
  98.  
  99.  
  100.     void Rewind() { WriteIndex = 0; }
  101.  
  102. public:
  103.     int WriteIndex = 0;
  104.     FxPagedArray<FxSerializerValue> Values;
  105.  
  106.     bool bInWriteMode = true;
  107. };
  108.  
  109. #define FX_SERIALIZABLE_MEMBERS(...)                                                                                   \
  110.     template <typename... TMemberTypes>                                                                                \
  111.     void SerializerDefineRecursive(FxSerializer& s, TMemberTypes&... types)                                            \
  112.     {                                                                                                                  \
  113.         (s.Add(types), ...);                                                                                           \
  114.     }                                                                                                                  \
  115.     void SerializeNow(FxSerializer& s) { SerializerDefineRecursive(s, __VA_ARGS__); }                                  \
  116.     void Serialize(FxSerializer& s)                                                                                    \
  117.     {                                                                                                                  \
  118.         s.SetWriteMode();                                                                                              \
  119.         SerializeNow(s);                                                                                               \
  120.     }                                                                                                                  \
  121.     void Deserialize(FxSerializer& s)                                                                                  \
  122.     {                                                                                                                  \
  123.         s.SetReadMode();                                                                                               \
  124.         SerializeNow(s);                                                                                               \
  125.     }
  126.  
  127.  
  128. struct SerializeTest
  129. {
  130.     FX_SERIALIZABLE_MEMBERS(X, Y);
  131.  
  132.     void Print() { FxLogInfo("Object: [{}, {}]", X, Y); }
  133.  
  134.     float X = 0;
  135.     int Y = 0;
  136. };
Advertisement
Add Comment
Please, Sign In to add comment