44IMPLEMENT_FUNKNOWN_METHODS (MemoryStream, IBStream, IBStream::iid)
45static const TSize kMemGrowAmount = 4096;
48MemoryStream::MemoryStream (
void* data, TSize length)
54, allocationError (false)
60MemoryStream::MemoryStream ()
66, allocationError (false)
72MemoryStream::~MemoryStream ()
74 if (ownMemory && memory)
83 if (memory ==
nullptr)
92 if (cursor + numBytes > size)
94 int32 maxBytes = int32 (size - cursor);
108 memcpy (data, &memory[cursor],
static_cast<size_t> (numBytes));
114 *numBytesRead = numBytes;
124 if (buffer ==
nullptr)
125 return kInvalidArgument;
128 TSize requiredSize = cursor + numBytes;
129 if (requiredSize > size)
131 if (requiredSize > memorySize)
138 if (memory && cursor >= 0 && numBytes > 0)
140 memcpy (&memory[cursor], buffer,
static_cast<size_t> (numBytes));
148 *numBytesWritten = numBytes;
162 cursor = cursor + pos;
169 if (ownMemory ==
false)
170 if (cursor > memorySize)
183 return kInvalidArgument;
200 if (ownMemory && memory)
210 TSize newMemorySize = (((Max (memorySize, s) - 1) / kMemGrowAmount) + 1) * kMemGrowAmount;
211 if (newMemorySize == memorySize)
217 if (memory && ownMemory ==
false)
219 allocationError =
true;
224 char* newMemory =
nullptr;
228 newMemory = (
char*)
realloc (memory, (
size_t)newMemorySize);
229 if (newMemory ==
nullptr && newMemorySize > 0)
231 newMemory = (
char*)
malloc ((
size_t)newMemorySize);
234 memcpy (newMemory, memory, (
size_t)Min (newMemorySize, memorySize));
240 newMemory = (
char*)
malloc ((
size_t)newMemorySize);
242 if (newMemory ==
nullptr)
244 if (newMemorySize > 0)
245 allocationError =
true;
255 memorySize = newMemorySize;
271 char* result = memory;
284 if (ownMemory ==
false)
287 if (memorySize == size)
304 char* newMemory = (
char*)
realloc (memory, (
size_t)memorySize);
@ kIBSeekCur
set seek position relative to current position
@ kIBSeekEnd
set seek position relative to stream end
@ kIBSeekSet
set absolute seek position
char * detachData()
returns the memory pointer and give up ownership
char * getData() const
returns the memory pointer
tresult PLUGIN_API read(void *buffer, int32 numBytes, int32 *numBytesRead) SMTG_OVERRIDE
Reads binary data from stream.
bool truncateToCursor()
truncate memory at current cursor position
tresult PLUGIN_API write(void *buffer, int32 numBytes, int32 *numBytesWritten) SMTG_OVERRIDE
Writes binary data to stream.
tresult PLUGIN_API seek(int64 pos, int32 mode, int64 *result) SMTG_OVERRIDE
Sets stream read-write position.
void setSize(TSize size)
set the memory size, a realloc will occur if memory already used
TSize getSize() const
returns the current memory size
bool truncate()
realloc to the current use memory size if needed
tresult PLUGIN_API tell(int64 *pos) SMTG_OVERRIDE
Gets current stream read-write position.