63 uint8_t* mCapacityEnd;
64 const char* mBufDataName;
67 RawMemoryBuffer(
const char* name) : mBegin(0), mEnd(0), mCapacityEnd(0),mBufDataName(name)
69 PX_UNUSED(mBufDataName);
77 return static_cast<uint32_t
>(mEnd - mBegin);
79 uint32_t capacity()
const
81 return static_cast<uint32_t
>(mCapacityEnd - mBegin);
91 const uint8_t* begin()
const
95 const uint8_t* end()
const
105 if(mEnd && (*mEnd != 0))
107 return reinterpret_cast<const char*
>(mBegin);
109 uint32_t write(uint8_t inValue)
111 *growBuf(1) = inValue;
115 template <
typename TDataType>
116 uint32_t write(
const TDataType& inValue)
118 const uint8_t* __restrict readPtr =
reinterpret_cast<const uint8_t*
>(&inValue);
119 uint8_t* __restrict writePtr = growBuf(
sizeof(TDataType));
120 for(uint32_t idx = 0; idx <
sizeof(TDataType); ++idx)
121 writePtr[idx] = readPtr[idx];
122 return sizeof(TDataType);
125 template <
typename TDataType>
126 uint32_t write(
const TDataType* inValue, uint32_t inLength)
128 uint32_t writeSize = inLength *
sizeof(TDataType);
129 if(inValue && inLength)
131 physx::intrinsics::memCopy(growBuf(writeSize), inValue, writeSize);
133 if(inLength && !inValue)
138 for(uint32_t idx = 0; idx < writeSize; ++idx)
144 uint8_t* growBuf(uint32_t inAmount)
146 uint32_t offset = size();
147 uint32_t newSize = offset + inAmount;
150 return mBegin + offset;
152 void writeZeros(uint32_t inAmount)
154 uint32_t offset = size();
156 physx::intrinsics::memZero(begin() + offset, inAmount);
158 void reserve(uint32_t newSize)
160 uint32_t currentSize = size();
161 if(newSize && newSize >= capacity())
163 uint32_t newDataSize = newSize > 4096 ? newSize + (newSize >> 2) : newSize*2;
164 uint8_t* newData =
static_cast<uint8_t*
>(PX_ALLOC(newDataSize, mBufDataName));
167 physx::intrinsics::memCopy(newData, mBegin, currentSize);
171 mEnd = mBegin + currentSize;
172 mCapacityEnd = mBegin + newDataSize;
185 if(inString && *inString)
187 uint32_t len =
static_cast<uint32_t
>(strlen(inString));
188 write(inString, len);
193 template <
typename TDataType>
196 char buffer[128] = { 0 };
197 Pxsnprintf(buffer, 128, inFormat, inData);
204 *
this << (inData ?
"true" :
"false");
209 return toStream(
"%d", inData);
213 return toStream(
"%u", uint32_t(inData));
217 return toStream(
"%u", uint32_t(inData));
221 return toStream(
"%c", inData);
225 return toStream(
"%u", inData);
229 return toStream(
"%I64u", inData);
233 return toStream(
"%I64d", inData);
237 return *this << static_cast<uint64_t>(
reinterpret_cast<size_t>(inData));
241 return toStream(
"%g",
double(inData));
245 return toStream(
"%g", inData);
279 *
this << inData.minimum;
281 *
this << inData.maximum;
virtual void * allocate(size_t size, const char *typeName, const char *filename, int line)=0
Allocates size bytes of memory, which must be 16-byte aligned.
PX_C_EXPORT PX_FOUNDATION_API physx::PxAllocatorCallback *PX_CALL_CONV PxGetBroadcastAllocator()
Get the broadcasting allocator callback.
Definition FdFoundation.cpp:264
Sorts an array of objects in ascending order, assuming that the predicate implements the < operator:
Definition PxBoxController.h:39