22 BlobRefInfo() { Clear(); }
24 void Clear() { Set(
nullptr,
nullptr, 0); }
28 m_shallowBlobSizePtr = shallowBlobSizePtr;
29 m_offsetPtr = offsetPtr;
30 m_blobGlobalOffset = blobGlobalOffset;
33 bool IsValid() {
return m_shallowBlobSizePtr !=
nullptr; }
57 BlobBuffer() : m_offset(0), m_buffer(
nullptr) {}
60 bool IsWriteMode() {
return m_buffer !=
nullptr; }
64 template<
class T> T* Alloc();
68 template<
class T> T* AllocArray(BlobArray<T>* blobArray,
KyUInt32 count)
70 return AllocAndCopyArray<T>(blobArray,
nullptr, count);
75 template<
class T> T* AllocAndCopyArray(BlobArray<T>* blobArray,
const T* src,
KyUInt32 count);
77 template<
class T> T* AllocAndCopyReferencedBlob(BlobRef<T>* blobRef,
void* srcBlob,
KyUInt32 srcBlobDeepSize,
KyUInt32 srcBlobShallowSize);
79 template<
class T> T* AllocAndCopyReferencedBlobFromBlobHandler(BlobRef<T>* blobRef,
const BlobHandler<T>& blobHandler);
82 void SwitchToWriteMode(BaseBlobHandler& baseBlobHandler,
KyUInt32 rootShallowBlobSize, MemoryHeap* heap,
KyInt32 memStat);
86 template<
class T>
void BeginBlobRefBuffer(BlobRef<T>* blobRef);
88 void SetBlobRefInfoFromCurrentOffset();
90 void SetBlobRefInfoFromCopiedBlobRef(
KyUInt32 shallowBlobSize);
95 BlobRefInfo m_blobRefInfo;
102 T* BlobBuffer::Alloc()
104 KY_ASSERT(
sizeof(T) % 4 == 0);
106 if (IsWriteMode() ==
false)
108 m_offset +=
sizeof(T);
112 T* ptr = (T*)(m_buffer + m_offset);
114 m_offset += sizeof(T);
120 T* BlobBuffer::AllocAndCopyArray(BlobArray<T>* blobArray, const T* src,
KyUInt32 count)
123 KyUInt32 alignedSize = GetAlignedSize(size);
124 KyUInt32 paddingSize = alignedSize - size;
126 if (IsWriteMode() ==
false)
128 m_offset += alignedSize;
134 blobArray->m_count = count;
135 blobArray->m_offset = 0;
140 T* dest = (T*)(m_buffer + m_offset);
143 blobArray->m_count = count;
144 blobArray->m_offset = (
KyInt32)((
char*)dest - (
char*)&blobArray->m_offset);
148 memcpy(dest, src, size);
152 memset(dest, 0, size);
155 for (
KyUInt32 i = 0; i < count; ++i)
158 for (
KyUInt32 i = 0; i < paddingSize; ++i)
159 ((
char*)dest)[size + i] = 0;
161 m_offset += alignedSize;
167 void BlobBuffer::BeginBlobRefBuffer(BlobRef<T>* blobRef)
169 if (blobRef ==
nullptr)
171 SetBlobRefInfoFromCurrentOffset();
172 m_blobRefInfo.Set(&blobRef->m_impl.m_shallowBlobSize, &blobRef->m_impl.m_offset, m_offset);
177 T* BlobBuffer::AllocAndCopyReferencedBlob(BlobRef<T>* blobRef,
void* srcBlob,
KyUInt32 srcBlobDeepSize,
KyUInt32 srcBlobShallowSize)
179 BeginBlobRefBuffer(blobRef);
181 KyUInt32 alignedSize = GetAlignedSize(srcBlobDeepSize);
182 KyUInt32 paddingSize = alignedSize - srcBlobDeepSize;
184 if (IsWriteMode() ==
false || srcBlob ==
nullptr || blobRef ==
nullptr)
186 m_offset += alignedSize;
187 SetBlobRefInfoFromCopiedBlobRef(srcBlobShallowSize);
191 char* dest = m_buffer + m_offset;
192 memcpy(dest, srcBlob, srcBlobDeepSize);
195 for (
KyUInt32 i = 0; i < paddingSize; ++i)
196 ((
char*)dest)[srcBlobDeepSize + i] = 0;
198 m_offset += alignedSize;
199 SetBlobRefInfoFromCopiedBlobRef(srcBlobShallowSize);
205 T* BlobBuffer::AllocAndCopyReferencedBlobFromBlobHandler(BlobRef<T>* blobRef,
const BlobHandler<T>& blobHandler)
207 return AllocAndCopyReferencedBlob(blobRef, (
void*)blobHandler.VoidBlob(), blobHandler.GetDeepBlobSize(), blobHandler.GetShallowBlobSize());
std::uint32_t KyUInt32
uint32_t
Definition: types.h:29
#define KY_DEFINE_NEW_DELETE_OPERATORS(MemStat)
This macro defines new and delete operators.
Definition: memory.h:132
The Autodesk Navigation namespace.
Definition: gamekitcrowddispersion.cpp:17
std::int32_t KyInt32
int32_t
Definition: types.h:24