#pragma once #include #include namespace sp { template class Field { public: // Provide an access to the stored value ValueType& GetValue() { return m_Value; } const ValueType& GetValue() const { return m_Value; } // Read (deserialise) and update internal value void Read(DataBuffer& buffer) { buffer >> m_Value; } // Write (serialise) internal value void Write(DataBuffer& buffer) const { buffer << m_Value; } Field& operator=(const ValueType& value) { m_Value = value; return *this; } private: ValueType m_Value; }; namespace details { template struct FieldsBuilder {}; template <> struct FieldsBuilder<> { using Type = std::tuple<>; }; template struct FieldsBuilder> { using Type = typename FieldsBuilder::Type; }; template struct FieldsBuilder { using Type = sp::tuple_cat_t>, typename FieldsBuilder::Type>; }; } // namespace details } // namespace sp