33 data.
allocate (initialSize, initialiseToZero);
46 jassert (other.data !=
nullptr);
48 memcpy (data, other.data, size);
59 jassert (dataToInitialiseFrom !=
nullptr);
63 if (dataToInitialiseFrom !=
nullptr)
64 memcpy (data, dataToInitialiseFrom, size);
77 memcpy (data, other.data, size);
84 : data (std::move (other.data)),
91 data = std::move (other.data);
99 return matches (other.data, other.size);
104 return ! operator== (other);
109 return size == dataSize
110 &&
memcmp (data, dataToCompare, size) == 0;
129 if (initialiseToZero && (newSize > size))
130 zeromem (data + size, newSize - size);
134 data.
allocate (newSize, initialiseToZero);
150 if (size < minimumSize)
151 setSize (minimumSize, initialiseToZero);
157 data.swapWith (other.data);
163 memset (data, (
int) value, size);
173 memcpy (data + oldSize, srcData, numBytes);
187 memcpy (data, srcData, numBytes);
195 insertPosition =
jmin (size, insertPosition);
196 auto trailingDataSize = size - insertPosition;
197 setSize (size + numBytes,
false);
199 if (trailingDataSize > 0)
200 memmove (data + insertPosition + numBytes,
201 data + insertPosition,
204 memcpy (data + insertPosition, srcData, numBytes);
210 if (startByte + numBytesToRemove >= size)
214 else if (numBytesToRemove > 0)
217 data + startByte + numBytesToRemove,
218 size - (startByte + numBytesToRemove));
220 setSize (size - numBytesToRemove);
226 auto* d =
static_cast<const char*
> (src);
235 if ((
size_t) offset + num > size)
236 num = size - (
size_t) offset;
239 memcpy (data + offset, d, num);
244 auto* d =
static_cast<char*
> (dst);
254 if ((
size_t) offset + num > size)
256 auto newNum = (
size_t) size - (
size_t) offset;
257 zeromem (d + newNum, num - newNum);
262 memcpy (d, data + offset, num);
275 auto byte = bitRangeStart >> 3;
276 auto offsetInByte = bitRangeStart & 7;
277 size_t bitsSoFar = 0;
279 while (numBits > 0 && (
size_t)
byte < size)
281 auto bitsThisTime =
jmin (numBits, 8 - offsetInByte);
282 const int mask = (0xff >> (8 - bitsThisTime)) << offsetInByte;
284 res |= (((data[byte] & mask) >> offsetInByte) << bitsSoFar);
286 bitsSoFar += bitsThisTime;
287 numBits -= bitsThisTime;
297 auto byte = bitRangeStart >> 3;
298 auto offsetInByte = bitRangeStart & 7;
299 uint32 mask = ~((((
uint32) 0xffffffff) << (32 - numBits)) >> (32 - numBits));
301 while (numBits > 0 && (
size_t)
byte < size)
303 auto bitsThisTime =
jmin (numBits, 8 - offsetInByte);
305 const uint32 tempMask = (mask << offsetInByte) | ~((((
uint32) 0xffffffff) >> offsetInByte) << offsetInByte);
306 const uint32 tempBits = (
uint32) bitsToSet << offsetInByte;
308 data[byte] = (
char) (((
uint32) data[byte] & tempMask) | tempBits);
311 numBits -= bitsThisTime;
312 bitsToSet >>= bitsThisTime;
313 mask >>= bitsThisTime;
329 for (
int loop = 2; --loop >= 0;)
335 auto c = t.getAndAdvance();
337 if (c >=
'0' && c <=
'9') {
byte |= c -
'0';
break; }
338 if (c >=
'a' && c <=
'z') {
byte |= c - (
'a' - 10);
break; }
339 if (c >=
'A' && c <=
'Z') {
byte |= c - (
'A' - 10);
break; }
343 setSize (
static_cast<size_t> (dest - data));
349 *dest++ = (
char)
byte;
354static const char base64EncodingTable[] =
".ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+";
358 auto numChars = ((size << 3) + 5) / 6;
360 String destString ((
unsigned int) size);
361 auto initialLen = destString.
length();
362 destString.
preallocateBytes ((
size_t) initialLen *
sizeof (String::CharPointerType::CharType) + 2 + numChars);
368 for (
size_t i = 0; i < numChars; ++i)
375static const char base64DecodingTable[] =
377 63, 0, 0, 0, 0, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 0, 0, 0, 0, 0, 0, 0,
378 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
379 0, 0, 0, 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52
391 setSize ((
size_t) numBytesNeeded,
true);
393 auto srcChars = dot + 1;
398 auto c = (
int) srcChars.getAndAdvance();
407 setBitRange ((
size_t) pos, 6, base64DecodingTable[c]);
void write(const juce_wchar charToWrite) noexcept
Writes a unicode character to this string, and advances this pointer to point to the next position.
static CharPointerType1 find(CharPointerType1 textToSearch, const CharPointerType2 substringToLookFor) noexcept
Returns a pointer to the first occurrence of a substring in a string.
void malloc(SizeType newNumElements, size_t elementSize=sizeof(ElementType))
Allocates a specified amount of memory.
void allocate(SizeType newNumElements, bool initialiseToZero)
Allocates a specified amount of memory and optionally clears it.
void realloc(SizeType newNumElements, size_t elementSize=sizeof(ElementType))
Re-allocates a specified amount of memory.
void free() noexcept
Frees any currently-allocated data.
A class to hold a resizable block of raw data.
void copyFrom(const void *srcData, int destinationOffset, size_t numBytes) noexcept
Copies data into this MemoryBlock from a memory address.
~MemoryBlock() noexcept
Destructor.
bool fromBase64Encoding(StringRef encodedString)
Takes a string created by MemoryBlock::toBase64Encoding() and extracts the original data.
String toBase64Encoding() const
Returns a string of characters in a JUCE-specific text encoding that represents the binary contents o...
bool matches(const void *data, size_t dataSize) const noexcept
Returns true if the data in this MemoryBlock matches the raw bytes passed-in.
void append(const void *data, size_t numBytes)
Adds another block of data to the end of this one.
MemoryBlock() noexcept
Create an uninitialised block with 0 size.
void replaceAll(const void *data, size_t numBytes)
Resizes this block to the given size and fills its contents from the supplied buffer.
String toString() const
Attempts to parse the contents of the block as a zero-terminated UTF8 string.
void copyTo(void *destData, int sourceOffset, size_t numBytes) const noexcept
Copies data from this MemoryBlock to a memory address.
void insert(const void *dataToInsert, size_t numBytesToInsert, size_t insertPosition)
Inserts some data into the block.
void swapWith(MemoryBlock &other) noexcept
Exchanges the contents of this and another memory block.
int getBitRange(size_t bitRangeStart, size_t numBitsToRead) const noexcept
Reads a number of bits from the memory block, treating it as one long binary sequence.
void loadFromHexString(StringRef sourceHexString)
Parses a string of hexadecimal numbers and writes this data into the memory block.
void removeSection(size_t startByte, size_t numBytesToRemove)
Chops out a section of the block.
MemoryBlock & operator=(const MemoryBlock &)
Copies another memory block onto this one.
void fillWith(uint8 valueToUse) noexcept
Fills the entire memory block with a repeated byte value.
bool operator!=(const MemoryBlock &other) const noexcept
Compares two memory blocks.
void setSize(size_t newSize, bool initialiseNewSpaceToZero=false)
Resizes the memory block.
void ensureSize(size_t minimumSize, bool initialiseNewSpaceToZero=false)
Increases the block's size only if it's smaller than a given size.
void setBitRange(size_t bitRangeStart, size_t numBits, int binaryNumberToApply) noexcept
Sets a number of bits in the memory block, treating it as a long binary sequence.
void reset()
Frees all the blocks data, setting its size to 0.
bool operator==(const MemoryBlock &other) const noexcept
Compares two memory blocks.
A simple class for holding temporary references to a string literal or String.
String::CharPointerType text
The text that is referenced.
CharPointerType getCharPointer() const noexcept
Returns the character pointer currently being used to store this string.
int length() const noexcept
Returns the number of characters in the string.
void preallocateBytes(size_t numBytesNeeded)
Increases the string's internally allocated storage.
static String fromUTF8(const char *utf8buffer, int bufferSizeBytes=-1)
Creates a String from a UTF-8 encoded buffer.
int getIntValue() const noexcept
Reads the value of the string as a decimal number (up to 32 bits in size).
wchar_t juce_wchar
A platform-independent 32-bit unicode character type.
constexpr Type jmin(Type a, Type b)
Returns the smaller of two values.
bool isPositiveAndBelow(Type1 valueToTest, Type2 upperLimit) noexcept
Returns true if a value is at least zero, and also below a specified upper limit.
unsigned int uint32
A platform-independent 32-bit unsigned integer type.
unsigned char uint8
A platform-independent 8-bit unsigned integer type.
constexpr int numElementsInArray(Type(&)[N]) noexcept
Handy function for getting the number of elements in a simple const C array.
void zeromem(void *memory, size_t numBytes) noexcept
Fills a block of memory with zeros.