From 15740faf9fe9fe4be08965098bbf2947e096aeeb Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 14 Aug 2019 22:50:43 +0800 Subject: +Unity Runtime code --- .../TransferFunctions/StreamedBinaryRead.h | 174 +++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 Runtime/Serialize/TransferFunctions/StreamedBinaryRead.h (limited to 'Runtime/Serialize/TransferFunctions/StreamedBinaryRead.h') diff --git a/Runtime/Serialize/TransferFunctions/StreamedBinaryRead.h b/Runtime/Serialize/TransferFunctions/StreamedBinaryRead.h new file mode 100644 index 0000000..81a015c --- /dev/null +++ b/Runtime/Serialize/TransferFunctions/StreamedBinaryRead.h @@ -0,0 +1,174 @@ +#ifndef STREAMEDBINARYREAD_H +#define STREAMEDBINARYREAD_H + +#include "Runtime/Serialize/TransferFunctions/TransferBase.h" +#include "Runtime/Serialize/CacheWrap.h" +#include "Runtime/Serialize/SwapEndianBytes.h" + + +template +class StreamedBinaryRead : public TransferBase +{ + CachedReader m_Cache; + + friend class MonoBehaviour; + +public: + + CachedReader& Init (int flags) { m_UserData = NULL; m_Flags = flags; return m_Cache; } + + bool IsReading () { return true; } + bool IsReadingPPtr () { return true; } + bool NeedsInstanceIDRemapping () { return m_Flags & kNeedsInstanceIDRemapping; } + bool ConvertEndianess () { return kSwapEndianess; } + + bool DidReadLastProperty () { return true; } + bool DidReadLastPPtrProperty () { return true; } + + void EnableResourceImage (ActiveResourceImage targetResourceImage) { m_Cache.BeginResourceImage(targetResourceImage); } + bool ReadStreamingInfo(StreamingInfo* streamingInfo); + + bool ShouldChannelOverride (); + CachedReader& GetCachedReader () { return m_Cache; } + + const char* GetSerializedFilePathName() { return m_Cache.GetSerializedFilePathName(); } + + 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); + + void TransferTypeless (unsigned* byteSize, const char* name, TransferMetaFlags metaFlag = kNoTransferFlags); + + // markerID is the id that was given by TransferTypeless. + // optional copyData: is a pointer to where the data will be written or read from + void TransferTypelessData (unsigned byteSize, void* copyData, int metaData = 0); + + /// Reads byteSize bytes into data. This may onle be used if UseOptimizedReading returns true. + void EXPORT_COREMODULE ReadDirect (void* data, int byteSize); + + void EXPORT_COREMODULE Align (); + + template + void TransferBasicData (T& data); + + template + void TransferPtr (bool, ReduceCopyData*){} + + template + void TransferSTLStyleArray (T& data, TransferMetaFlags metaFlag = kNoTransferFlags); + + template + void TransferSTLStyleMap (T& data, TransferMetaFlags metaFlag = kNoTransferFlags); +}; + +template +bool StreamedBinaryRead::ReadStreamingInfo(StreamingInfo* streamingInfo) +{ + Assert(streamingInfo != NULL); + + if (!m_Cache.IsReadingResourceImage()) + return false; + + // Read the size & offset values from the serialized file + // The size & offset describes where the data is in the streamed file + UInt32 offset, size; + Transfer (size, "ri_size"); + Transfer (offset, "ri_offset"); + + m_Cache.GetStreamingInfo (offset, size, streamingInfo); + return true; +} + + + +template +template +void StreamedBinaryRead::TransferSTLStyleArray (T& data, TransferMetaFlags /*metaFlags*/) +{ + if (m_Cache.IsReadingResourceImage()) + { + // Read the size & offset from the serialized file + UInt32 offset, size; + Transfer (size, "ri_size"); + Transfer (offset, "ri_offset"); + + // Fetch the pointer from the pre-loaded resource image. + unsigned bufferSize = sizeof (typename T::value_type) * size; + UInt8* buffer = m_Cache.FetchResourceImageData (offset, bufferSize); + SerializeTraits::resource_image_assign_external (data, buffer, buffer + bufferSize); + + m_Cache.EndResourceImage(); + } + else + { + SInt32 size; + Transfer (size, "size"); + + SerializeTraits::ResizeSTLStyleArray (data, size); + + if (!kSwapEndianess && SerializeTraits::AllowTransferOptimization () && SerializeTraits::IsContinousMemoryArray ()) + { + //AssertIf (size != distance (data.begin (), data.end ())); + if( size != 0 ) + ReadDirect (&*data.begin (), size * sizeof (typename T::value_type)); + } + else + { + typename T::iterator i; + typename T::iterator end = data.end (); + //AssertIf (size != distance (data.begin (), end)); + for (i = data.begin ();i != end;++i) + Transfer (*i, "data"); + } + } +} + +template +template +void StreamedBinaryRead::TransferSTLStyleMap (T& data, TransferMetaFlags) +{ + SInt32 size; + Transfer (size, "size"); + + // maps value_type is: pair + // So we have to write to maps non-const value type + typename NonConstContainerValueType::value_type p; + + data.clear (); + for (int i=0;i +template +void StreamedBinaryRead::Transfer (T& data, const char*, TransferMetaFlags) +{ + SerializeTraits::Transfer (data, *this); +} + +template +template +void StreamedBinaryRead::TransferWithTypeString (T& data, const char*, const char*, TransferMetaFlags) +{ + SerializeTraits::Transfer (data, *this); +} + +template +template inline +void StreamedBinaryRead::TransferBasicData (T& data) +{ + AssertIf (sizeof (T) > 8); + m_Cache.Read (data); + if (kSwapEndianess) + { + SwapEndianBytes (data); + } +} +#endif + + + -- cgit v1.1-26-g67d0