7 #include "Core/Global.h"
8 #include "Core/Global.h"
9 #include "IO/WriteStream/WriteStream.h"
10 #include "IO/ReadStream/ReadStream.h"
12 #include "Serializing/SerializingDefines.h"
58 template<
typename ...TArgs, std::enable_if_t<std::is_constructible_v<T, TArgs...>> * =
nullptr>
60 :
m_tValue(std::forward<TArgs>(i_tArgs)...) {}
85 template<
typename T =
int,
bool IsH
idden = false>
99 return this->serialize(i_oStream);
119 return this->deserialize(i_oStream);
130 return this->deserialize(i_szString);
141 const std::vector<std::string>::const_iterator &i_oItEnd) {
143 return this->deserialize(i_oIt, i_oItEnd);
160 virtual bool deserialize(
const char *i_szString) {
168 virtual bool deserialize(std::vector<std::string>::const_iterator &i_oIt,
169 const std::vector<std::string>::const_iterator &i_oItEnd) {
177 [[nodiscard]]
virtual size_t size()
const {
178 return sizeof(*this);
190 return {
static_cast<const void *
>(&this->m_tValue),
sizeof(T)};
197 return this->m_tValue.begin();
203 return this->m_tValue.end();
211 return this->m_tValue[i_nIndex];
218 return this->m_tValue[i_nIndex];
257 SerializerEnableIfNotArithmetic(
IData<T> &)
258 operator+=(
const T &i_tValue) {
259 this->m_tValue += i_tValue;
266 SerializerEnableIfNotArithmetic(IData<T> &)
267 operator-=(
const T &i_tValue) {
268 this->m_tValue -= i_tValue;
275 SerializerEnableIfNotArithmetic(IData<T> &)
276 operator*=(
const T &i_tValue) {
277 this->m_tValue *= i_tValue;
284 SerializerEnableIfNotArithmetic(IData<T> &)
285 operator/=(
const T &i_tValue) {
286 this->m_tValue /= i_tValue;
293 SerializerEnableIfNotArithmetic(IData<T> &)
294 operator%=(
const T &i_tValue) {
295 this->m_tValue %= i_tValue;
302 SerializerEnableIfNotArithmetic(IData<T> &)
303 operator&=(
const T &i_tValue) {
304 this->m_tValue &= i_tValue;
311 SerializerEnableIfNotArithmetic(IData<T> &)
312 operator|=(
const T &i_tValue) {
313 this->m_tValue |= i_tValue;
320 SerializerEnableIfNotArithmetic(IData<T> &)
321 operator^=(
const T &i_tValue) {
322 this->m_tValue ^= i_tValue;
329 SerializerEnableIfNotArithmetic(IData<T> &)
330 operator<<=(
const T &i_tValue) {
331 this->m_tValue <<= i_tValue;
338 SerializerEnableIfNotArithmetic(IData<T> &)
339 operator>>=(
const T &i_tValue) {
340 this->m_tValue >>= i_tValue;
347 SerializerEnableIfNotArithmetic(T)
348 operator+(
const T &i_tValue)
const {
349 return this->m_tValue + i_tValue;
355 SerializerEnableIfNotArithmetic(T)
356 operator-(
const T &i_tValue)
const {
357 return this->m_tValue - i_tValue;
363 SerializerEnableIfNotArithmetic(T)
364 operator*(
const T &i_tValue)
const {
365 return this->m_tValue * i_tValue;
371 SerializerEnableIfNotArithmetic(T)
372 operator/(
const T &i_tValue)
const {
373 return this->m_tValue / i_tValue;
379 SerializerEnableIfNotArithmetic(T)
380 operator%(
const T &i_tValue)
const {
381 return this->m_tValue % i_tValue;
387 SerializerEnableIfNotArithmetic(T)
388 operator&(
const T &i_tValue)
const {
389 return this->m_tValue & i_tValue;
395 SerializerEnableIfNotArithmetic(T)
396 operator|(
const T &i_tValue)
const {
397 return this->m_tValue | i_tValue;
403 SerializerEnableIfNotArithmetic(T)
404 operator^(
const T &i_tValue)
const {
405 return this->m_tValue ^ i_tValue;
411 SerializerEnableIfNotArithmetic(T)
413 return this->m_tValue << i_tValue;
419 SerializerEnableIfNotArithmetic(T)
421 return this->m_tValue >> i_tValue;
426 SerializerEnableIfNotArithmetic(
bool)
428 return !this->m_tValue;
434 SerializerEnableIfNotArithmetic(
bool)
435 operator==(
const T &i_tValue)
const {
436 return this->m_tValue == i_tValue;
442 SerializerEnableIfNotArithmetic(
bool)
443 operator!=(
const T &i_tValue)
const {
444 return this->m_tValue != i_tValue;
450 SerializerEnableIfNotArithmetic(
bool)
451 operator>(
const T &i_tValue)
const {
452 return this->m_tValue > i_tValue;
458 SerializerEnableIfNotArithmetic(
bool)
459 operator>=(
const T &i_tValue)
const {
460 return this->m_tValue >= i_tValue;
466 SerializerEnableIfNotArithmetic(
bool)
467 operator<(
const T &i_tValue)
const {
468 return this->m_tValue < i_tValue;
474 SerializerEnableIfNotArithmetic(
bool)
475 operator<=(
const T &i_tValue)
const {
476 return this->m_tValue <= i_tValue;
481 template<
typename T1 = T>
482 typename std::enable_if<std::is_pointer<T1>::value, T>::type
484 return this->m_tValue;
489 template<
typename T1 = T>
490 typename std::enable_if<!std::is_pointer<T1>::value, T *>::type
492 return &this->m_tValue;
498 return *this->m_tValue;
503 const T &operator*()
const {
504 return *this->m_tValue;
510 return this->m_tValue;
515 operator const T &()
const {
516 return this->m_tValue;
529 i_oStream << i_tData.
value();
540 i_oStream >> i_tData.
value();
551 i_oStream << i_tData.
value();
562 i_oStream >> i_tData.
value();
575 template<
typename TStructFieldType = IData<>,
typename TStruct>
577 const size_t i_nStructSize =
sizeof(TStruct)) {
579 for (
size_t i = ((std::is_base_of_v<IStruct, TStruct> && std::is_polymorphic_v<TStruct>) ?
sizeof(
void *) : 0);
580 i < i_nStructSize;) {
581 auto pData =
reinterpret_cast<const TStructFieldType *
>((
reinterpret_cast<const char *
>(i_pStruct) + i));
583 if (!i_pCallback(pData)) {
600 template<
typename TStructFieldType = IData<>,
typename TStruct>
602 const size_t i_nStructSize =
sizeof(TStruct)) {
603 return IterateSerializableStruct<TStructFieldType, TStruct>(&i_oStruct, i_pCallback, i_nStructSize);
614 template<
typename TStructFieldType = IData<>,
typename TStruct>
616 const size_t i_nStructSize =
sizeof(TStruct)) {
617 for (
size_t i = (std::has_virtual_destructor_v<TStruct> ?
sizeof(
void *) : 0); i < i_nStructSize;) {
618 auto *pData = SerializableGetField(TStructFieldType, i_pStruct, i);
620 if (!i_pCallback(pData)) {
637 template<
typename TStructFieldType = IData<>,
typename TStruct>
639 const size_t i_nStructSize =
sizeof(TStruct)) {
640 return IterateSerializableStruct<TStructFieldType, TStruct>(&i_oStruct, i_pCallback, i_nStructSize);
651 template<
typename TStructFieldType = IData<>,
typename TStruct>
653 const size_t i_nStructSize =
sizeof(TStruct)) {
654 std::vector<size_t> anOffsets;
655 anOffsets.reserve(10);
657 for (
size_t i = (std::has_virtual_destructor_v<TStruct> ?
sizeof(
void *) : 0); i < i_nStructSize;) {
658 auto *pData = SerializableGetField(TStructFieldType, i_pStruct, i);
660 if (i_fIncludeHidden || !pData->isHidden()) {
661 anOffsets.push_back(i);
677 template<
typename TStructFieldType = IData<>,
typename TStruct>
679 const size_t i_nStructSize =
sizeof(TStruct)) {
680 return GetSerializableFieldOffsets<TStructFieldType, TStruct>(&i_oStruct, i_fIncludeHidden, i_nStructSize);
691 template<
typename TStructFieldType = IData<>,
typename TStruct>
693 TStructFieldType *pReturn =
nullptr;
694 size_t nCurrentIndex = 0;
695 IterateSerializableStruct<TStructFieldType>(i_pStruct, [&](TStructFieldType *i_pData) {
696 if (nCurrentIndex == i_nIndex) {
715 template<
typename TStructFieldType = IData<>,
typename TStruct>
717 return GetSerializableFieldByIndex<TStructFieldType, TStruct>(&i_oStruct, i_nIndex);
728 template<
typename TStructFieldType = IData<>,
typename TStruct>
732 for (
size_t nOffset: anOffsets) {
733 auto *pFirst = SerializableGetField(TStructFieldType, i_pStruct, nOffset);
734 auto *pSecond = SerializableGetField(TStructFieldType, i_pCompareStruct, nOffset);
736 const SCompareData oFirstCompareData = pFirst->compareData();
737 const SCompareData oSecondCompareData = pSecond->compareData();
739 if (oFirstCompareData.
nSize != oSecondCompareData.
nSize) {
743 if (memcmp(oFirstCompareData.
pData, oSecondCompareData.
pData, oFirstCompareData.
nSize) != 0) {
758 template<
typename TStructFieldType = IData<>,
typename TStruct>
760 return CompareSerializableStruct<TStructFieldType, TStruct>(&i_oStruct, &i_oCompareStruct, i_fIncludeHidden);
768 template<
typename T =
int,
bool IsH
idden = false>
A class for reading data from a buffer. This class provides functionality to read data from a buffer....
Definition: ReadStream.h:37
A class for writing data to a buffer. This class provides functionality to write data to a buffer....
Definition: WriteStream.h:42
Template class representing a data field.
Definition: SerializableData.h:86
bool doDeserialize(const char *i_szString)
Deserializes the data from a string.
Definition: SerializableData.h:128
virtual SCompareData compareData() const
Returns the compare data for the data field.
Definition: SerializableData.h:189
virtual ~IData()=default
Default destructor.
SerializerEnableIfNotArithmetic(IData< T > &) operator--()
Pre-decrement operator.
Definition: SerializableData.h:223
auto & operator[](const size_t i_nIndex)
Returns a reference to the value at the specified index.
Definition: SerializableData.h:210
SerializerEnableIfNotArithmetic(IData< T > &) operator++()
Pre-increment operator.
Definition: SerializableData.h:240
auto end() const
Returns an iterator pointing to the end of the value.
Definition: SerializableData.h:202
const auto & operator[](const size_t i_nIndex) const
Returns a const reference to the value at the specified index.
Definition: SerializableData.h:217
SerializerEnableIfNotArithmetic(IData< T > &) operator--(int)
Post-decrement operator.
Definition: SerializableData.h:231
auto begin() const
Returns an iterator pointing to the beginning of the value.
Definition: SerializableData.h:196
virtual bool isHidden() const
Returns whether the field is hidden.
Definition: SerializableData.h:183
bool doDeserialize(IO::CReadStream &i_oStream)
Deserializes the data from a read stream.
Definition: SerializableData.h:117
SerializerEnableIfNotArithmetic(IData< T > &) operator++(int)
Post-increment operator.
Definition: SerializableData.h:248
bool doDeserialize(std::vector< std::string >::const_iterator &i_oIt, const std::vector< std::string >::const_iterator &i_oItEnd)
Deserializes the data from a range of strings.
Definition: SerializableData.h:140
bool doSerialize(IO::CWriteStream &i_oStream) const
Serializes the data to a write stream.
Definition: SerializableData.h:97
virtual size_t size() const
Returns the size of the data.
Definition: SerializableData.h:177
Base class for fields.
Definition: SerializableData.h:46
Definition: SerializableData.h:39
Template class representing a value.
Definition: SerializableData.h:53
T m_tValue
The value.
Definition: SerializableData.h:78
const T & value() const
Returns the value.
Definition: SerializableData.h:65
T & value()
Returns a reference to the value.
Definition: SerializableData.h:71
IValue(TArgs... i_tArgs)
Constructs an IValue object with the specified arguments.
Definition: SerializableData.h:59
The namespace encapsulating serializing related functionality in the Devel framework.
std::ostream & operator<<(std::ostream &i_oStream, const IValue< T > &i_tData)
Output stream operator for IValue.
Definition: SerializableData.h:528
bool IterateSerializableStruct(const TStruct *i_pStruct, std::function< bool(const TStructFieldType *)> i_pCallback, const size_t i_nStructSize=sizeof(TStruct))
Iterates over a serializable struct and applies a callback function to each field.
Definition: SerializableData.h:576
std::false_type is_data_class_impl(...)
Check if a type is a data class.
TStructFieldType * GetSerializableFieldByIndex(const TStruct *i_pStruct, const size_t i_nIndex)
Gets the offsets of the serializable fields in a struct.
Definition: SerializableData.h:692
bool CompareSerializableStruct(TStruct *i_pStruct, TStruct *i_pCompareStruct, const bool i_fIncludeHidden=false)
Compares two serializable structs for equality.
Definition: SerializableData.h:729
std::istream & operator>>(std::istream &i_oStream, const IValue< T > &i_tData)
Input stream operator for IValue.
Definition: SerializableData.h:539
std::vector< size_t > GetSerializableFieldOffsets(const TStruct *i_pStruct, const bool i_fIncludeHidden=true, const size_t i_nStructSize=sizeof(TStruct))
Gets the offsets of the serializable fields in a struct.
Definition: SerializableData.h:652
bool IterateDeserializableStruct(TStruct *i_pStruct, std::function< bool(TStructFieldType *)> i_pCallback, const size_t i_nStructSize=sizeof(TStruct))
Iterates over a deserializable struct and applies a callback function to each field.
Definition: SerializableData.h:615
Structure for comparing serialized data.
Definition: SerializableData.h:19
const void * pData
The pointer to the data.
Definition: SerializableData.h:28
SCompareData(const void *i_pData, const size_t i_nSize)
Constructs an SCompareData object with the specified data and size.
Definition: SerializableData.h:23
const size_t nSize
The size of the data.
Definition: SerializableData.h:32