General beast update, fixes, optimizations, features:

* Clean ups, optimizations, and new File::commonDocumentsDirectory enum
* Replace sortArray with std::sort for performance
* More error tolerance in XML parser, speedups
* Refactor some byte-order mark detection code
* Add String::appendCharPointer overloads
* More XML parser optimisations and better error detection
* Misc performance tweaks
* Fixes for support of non utf8 strings
* Increased precision when storing strings in XmlElement
* Minor clean-ups
* Minor fix to XmlDocument
* Cleanups to CriticalSection and related synchronization primitives
* Fix DynamicArray unit test
This commit is contained in:
Vinnie Falco
2013-09-10 09:52:24 -07:00
parent 27307fca0c
commit 43e6d345e4
83 changed files with 433 additions and 687 deletions

View File

@@ -481,6 +481,31 @@ void String::append (const String& textToAppend, size_t maxCharsToTake)
appendCharPointer (textToAppend.text, maxCharsToTake);
}
void String::appendCharPointer (const CharPointerType textToAppend)
{
appendCharPointer (textToAppend, textToAppend.findTerminatingNull());
}
void String::appendCharPointer (const CharPointerType startOfTextToAppend,
const CharPointerType endOfTextToAppend)
{
bassert (startOfTextToAppend.getAddress() != nullptr && endOfTextToAppend.getAddress() != nullptr);
const int extraBytesNeeded = getAddressDifference (endOfTextToAppend.getAddress(),
startOfTextToAppend.getAddress());
bassert (extraBytesNeeded >= 0);
if (extraBytesNeeded > 0)
{
const size_t byteOffsetOfNull = getByteOffsetOfEnd();
preallocateBytes (byteOffsetOfNull + (size_t) extraBytesNeeded);
CharPointerType::CharType* const newStringStart = addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull);
memcpy (newStringStart, startOfTextToAppend.getAddress(), extraBytesNeeded);
CharPointerType (addBytesToPointer (newStringStart, extraBytesNeeded)).writeNull();
}
}
String& String::operator+= (const wchar_t* const t)
{
appendCharPointer (castToCharPointer_wchar_t (t));
@@ -1778,9 +1803,9 @@ int String::getHexValue32() const noexcept { return HexConverter<int> ::st
int64 String::getHexValue64() const noexcept { return HexConverter<int64>::stringToHex (text); }
//==============================================================================
String String::createStringFromData (const void* const data_, const int size)
String String::createStringFromData (const void* const unknownData, const int size)
{
const uint8* const data = static_cast <const uint8*> (data_);
const uint8* const data = static_cast<const uint8*> (unknownData);
if (size <= 0 || data == nullptr)
return empty;
@@ -1788,17 +1813,16 @@ String String::createStringFromData (const void* const data_, const int size)
if (size == 1)
return charToString ((beast_wchar) data[0]);
if ((data[0] == (uint8) CharPointer_UTF16::byteOrderMarkBE1 && data[1] == (uint8) CharPointer_UTF16::byteOrderMarkBE2)
|| (data[0] == (uint8) CharPointer_UTF16::byteOrderMarkLE1 && data[1] == (uint8) CharPointer_UTF16::byteOrderMarkLE2))
if (CharPointer_UTF16::isByteOrderMarkBigEndian (data)
|| CharPointer_UTF16::isByteOrderMarkLittleEndian (data))
{
const bool bigEndian = (data[0] == (uint8) CharPointer_UTF16::byteOrderMarkBE1);
const int numChars = size / 2 - 1;
StringCreationHelper builder ((size_t) numChars);
const uint16* const src = (const uint16*) (data + 2);
if (bigEndian)
if (CharPointer_UTF16::isByteOrderMarkBigEndian (data))
{
for (int i = 0; i < numChars; ++i)
builder.write ((beast_wchar) ByteOrder::swapIfLittleEndian (src[i]));
@@ -1814,16 +1838,12 @@ String String::createStringFromData (const void* const data_, const int size)
}
const uint8* start = data;
const uint8* end = data + size;
if (size >= 3
&& data[0] == (uint8) CharPointer_UTF8::byteOrderMark1
&& data[1] == (uint8) CharPointer_UTF8::byteOrderMark2
&& data[2] == (uint8) CharPointer_UTF8::byteOrderMark3)
if (size >= 3 && CharPointer_UTF8::isByteOrderMark (data))
start += 3;
return String (CharPointer_UTF8 ((const char*) start),
CharPointer_UTF8 ((const char*) end));
CharPointer_UTF8 ((const char*) (data + size)));
}
//==============================================================================