From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- Runtime/Serialize/Blobification/BlobSize.h | 161 +++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 Runtime/Serialize/Blobification/BlobSize.h (limited to 'Runtime/Serialize/Blobification/BlobSize.h') diff --git a/Runtime/Serialize/Blobification/BlobSize.h b/Runtime/Serialize/Blobification/BlobSize.h new file mode 100644 index 0000000..a7aaf6d --- /dev/null +++ b/Runtime/Serialize/Blobification/BlobSize.h @@ -0,0 +1,161 @@ +#ifndef BLOBSIZE_H +#define BLOBSIZE_H + +#include "Runtime/Serialize/TransferFunctions/TransferBase.h" + +struct ReduceCopyData; + +class BlobSize : public TransferBase +{ +private: + + typedef OffsetPtr::offset_type offset_type; + + size_t m_Size; + bool m_IgnorePtr; + bool m_HasDebugOffsetPtr; + bool m_Use64Ptr; + int m_TargetPlatform; + + std::size_t AlignAddress(std::size_t addr, std::size_t align) + { + return addr + ((~addr + 1U) & (align - 1U)); + } + +public: + + + BlobSize (bool hasDebugOffsetPtr, bool use64BitOffsetPtr) + : m_Size (0) + , m_IgnorePtr (false) + , m_HasDebugOffsetPtr (hasDebugOffsetPtr) + , m_Use64Ptr (use64BitOffsetPtr) { } + + bool NeedsInstanceIDRemapping () { return m_Flags & kNeedsInstanceIDRemapping; } + int GetFlags () { return m_Flags; } + bool IsWritingGameReleaseData () + { + return true; + } + bool IsSerializingForGameRelease () + { + return true; + } + bool IsBuildingTargetPlatform (BuildTargetPlatform platform) + { + if (platform == kBuildAnyPlayerData) + return m_TargetPlatform >= kBuildValidPlayer; + else + return m_TargetPlatform == platform; + } + + BuildTargetPlatform GetBuildingTargetPlatform () { return static_cast(m_TargetPlatform); } + + template + void Transfer (T& data, const char* name, TransferMetaFlags metaFlag = kNoTransferFlags); + + template + void TransferWithTypeString (T& data, const char* name, const char* typeName, TransferMetaFlags metaFlag = kNoTransferFlags); + + template + void TransferBasicData (T& data); + + template + void TransferPtr (bool isValidPtr, ReduceCopyData* reduceCopyData); + + template + void TransferSTLStyleArray (T& data, TransferMetaFlags metaFlag = kNoTransferFlags); + + template + static size_t CalculateSize (T& data, bool hasDebugOffsetPtr, bool use64BitOffsetPtr) + { + BlobSize sizer (hasDebugOffsetPtr, use64BitOffsetPtr); + sizer.Transfer(data, "Base"); + + // size_t size = sizeof(T); + // Assert( sizeof(T) == sizer.m_Size); + + return sizer.m_Size; + } + + template friend class BlobSizeTransferSTLStyleArrayImpl; +}; + + +template class BlobSizeTransferSTLStyleArrayImpl +{ +public: + void operator()(T& data, TransferMetaFlags metaFlags, BlobSize& transfer) + { + AssertString ("STL array are not support for BlobWrite"); + } +}; + +template class BlobSizeTransferSTLStyleArrayImpl< OffsetPtrArrayTransfer > +{ +public: + void operator()(OffsetPtrArrayTransfer& data, TransferMetaFlags metaFlags, BlobSize& transfer) + { + transfer.m_IgnorePtr = false; + } +}; + +template class BlobSizeTransferSTLStyleArrayImpl< StaticArrayTransfer > +{ +public: + void operator()(StaticArrayTransfer& data, TransferMetaFlags metaFlags, BlobSize& transfer) + { + transfer.m_Size = transfer.AlignAddress(transfer.m_Size, ALIGN_OF(T)); + transfer.m_Size += sizeof(T)*data.size(); + } +}; + + +template inline +void BlobSize::TransferSTLStyleArray (T& data, TransferMetaFlags metaFlags) +{ + BlobSizeTransferSTLStyleArrayImpl transfer; + transfer(data, metaFlags, *this); +} + +template inline +void BlobSize::Transfer (T& data, const char* name, TransferMetaFlags) +{ + if (m_IgnorePtr) + { + m_IgnorePtr = false; + return; + } + + m_Size = AlignAddress(m_Size, SerializeTraits::GetAlignOf() ); + + SerializeTraits::Transfer (data, *this); + + m_Size = AlignAddress(m_Size, SerializeTraits::GetAlignOf() ); +} + +template inline +void BlobSize::TransferWithTypeString (T& data, const char*, const char*, TransferMetaFlags) +{ + SerializeTraits::Transfer (data, *this); +} + +template inline +void BlobSize::TransferBasicData (T& srcData) +{ + m_Size += sizeof(T); +} + +template inline +void BlobSize::TransferPtr (bool isValidPtr, ReduceCopyData* reduceCopyData) +{ + m_Size += m_Use64Ptr ? sizeof(SInt64) : sizeof(SInt32); + + if (m_HasDebugOffsetPtr) + m_Size += sizeof(void*); + + if (isValidPtr) + m_IgnorePtr = true; +} + +#endif -- cgit v1.1-26-g67d0