27 : blockToUse (&internalBlock)
29 internalBlock.setSize (initialSize,
false);
33 const bool appendToExistingBlockContent)
34 : blockToUse (&memoryBlockToWriteTo)
36 if (appendToExistingBlockContent)
37 position = size = memoryBlockToWriteTo.
getSize();
41 : externalData (destBuffer), availableSize (destBufferSize)
43 jassert (externalData !=
nullptr);
48 trimExternalBlockSize();
53 trimExternalBlockSize();
56void MemoryOutputStream::trimExternalBlockSize()
58 if (blockToUse != &internalBlock && blockToUse !=
nullptr)
59 blockToUse->
setSize (size,
false);
64 if (blockToUse !=
nullptr)
65 blockToUse->ensureSize (bytesToPreallocate + 1);
74char* MemoryOutputStream::prepareToWrite (
size_t numBytes)
76 jassert ((ssize_t) numBytes >= 0);
77 auto storageNeeded = position + numBytes;
81 if (blockToUse !=
nullptr)
83 if (storageNeeded >= blockToUse->
getSize())
84 blockToUse->
ensureSize ((storageNeeded + jmin (storageNeeded / 2, (
size_t) (1024 * 1024)) + 32) & ~31u);
86 data =
static_cast<char*
> (blockToUse->
getData());
90 if (storageNeeded > availableSize)
93 data =
static_cast<char*
> (externalData);
96 auto* writePointer = data + position;
98 size = jmax (size, position);
107 jassert (buffer !=
nullptr);
109 if (
auto* dest = prepareToWrite (howMany))
111 memcpy (dest, buffer, howMany);
123 if (
auto* dest = prepareToWrite (howMany))
125 memset (dest,
byte, howMany);
150 if (blockToUse ==
nullptr)
153 if (blockToUse->getSize() > size)
154 static_cast<char*
> (blockToUse->getData()) [size] = 0;
156 return blockToUse->getData();
161 if (newPosition <= (int64) size)
164 position = jlimit ((
size_t) 0, size, (
size_t) newPosition);
177 if (availableData > 0)
179 if (maxNumBytesToWrite < 0 || availableData < maxNumBytesToWrite)
180 maxNumBytesToWrite = availableData;
182 if (blockToUse !=
nullptr)
183 preallocate (position + (
size_t) maxNumBytesToWrite);
191 auto* d =
static_cast<const char*
> (
getData());
static size_t getBytesRequiredFor(const juce_wchar charToWrite) noexcept
void write(const juce_wchar charToWrite) noexcept
void * getData() noexcept
size_t getSize() const noexcept
void setSize(size_t newSize, bool initialiseNewSpaceToZero=false)
void ensureSize(size_t minimumSize, bool initialiseNewSpaceToZero=false)
const void * getData() const noexcept
~MemoryOutputStream() override
bool setPosition(int64) override
size_t getDataSize() const noexcept
bool writeRepeatedByte(uint8 byte, size_t numTimesToRepeat) override
void preallocate(size_t bytesToPreallocate)
int64 writeFromInputStream(InputStream &, int64 maxNumBytesToWrite) override
MemoryOutputStream(size_t initialSize=256)
bool write(const void *, size_t) override
bool appendUTF8Char(juce_wchar character)
MemoryBlock getMemoryBlock() const
virtual bool write(const void *dataToWrite, size_t numberOfBytes)=0
virtual int64 writeFromInputStream(InputStream &source, int64 maxNumBytesToWrite)
static String createStringFromData(const void *data, int size)