#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; }; // Functor used to read all tuple values class FieldReader { public: FieldReader(DataBuffer& buffer) : m_Buffer(buffer) {} template void operator()(TField& field) { field.Read(m_Buffer); } private: DataBuffer& m_Buffer; }; // Functor used to write all tuple values class FieldWriter { public: FieldWriter(DataBuffer& buffer) : m_Buffer(buffer) {} template void operator()(TField& field) { field.Write(m_Buffer); } private: DataBuffer& m_Buffer; }; 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