1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

Optimisation for String and XML parsing.

This commit is contained in:
jules 2013-09-05 23:07:00 +01:00
parent cbb4a6e86f
commit e336dd1c1c
3 changed files with 41 additions and 13 deletions

View file

@ -605,6 +605,30 @@ 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)
{
jassert (startOfTextToAppend.getAddress() != nullptr && endOfTextToAppend.getAddress() != nullptr);
jassert (startOfTextToAppend.getAddress() <= endOfTextToAppend.getAddress());
const size_t extraBytesNeeded = endOfTextToAppend.getAddress() - startOfTextToAppend.getAddress();
if (extraBytesNeeded > 0)
{
const size_t byteOffsetOfNull = getByteOffsetOfEnd();
preallocateBytes (byteOffsetOfNull + extraBytesNeeded);
char* const newStringStart = addBytesToPointer (text.getAddress(), (int) byteOffsetOfNull);
memcpy (newStringStart, startOfTextToAppend.getAddress(), extraBytesNeeded);
CharPointerType (newStringStart + extraBytesNeeded).writeNull();
}
}
String& String::operator+= (const wchar_t* const t)
{
appendCharPointer (castToCharPointer_wchar_t (t));
@ -628,7 +652,7 @@ String& String::operator+= (const char* const t)
*/
jassert (t == nullptr || CharPointer_ASCII::isValidString (t, std::numeric_limits<int>::max()));
appendCharPointer (CharPointer_ASCII (t));
appendCharPointer (CharPointer_UTF8 (t)); // (using UTF8 here triggers a faster code-path than ascii)
return *this;
}

View file

@ -217,6 +217,17 @@ public:
*/
void append (const String& textToAppend, size_t maxCharsToTake);
/** Appends a string to the end of this one.
@param startOfTextToAppend the start of the string to add. This must not be a nullptr
@param endOfTextToAppend the end of the string to add. This must not be a nullptr
*/
void appendCharPointer (const CharPointerType startOfTextToAppend,
const CharPointerType endOfTextToAppend);
/** Appends a string to the end of this one. */
void appendCharPointer (const CharPointerType textToAppend);
/** Appends a string to the end of this one.
@param textToAppend the string to add

View file

@ -326,7 +326,6 @@ void XmlDocument::readQuotedString (String& result)
else
{
const String::CharPointerType start (input);
size_t numChars = 0;
for (;;)
{
@ -334,13 +333,13 @@ void XmlDocument::readQuotedString (String& result)
if (character == quote)
{
result.appendCharPointer (start, numChars);
result.appendCharPointer (start, input);
++input;
return;
}
else if (character == '&')
{
result.appendCharPointer (start, numChars);
result.appendCharPointer (start, input);
break;
}
else if (character == 0)
@ -351,7 +350,6 @@ void XmlDocument::readQuotedString (String& result)
}
++input;
++numChars;
}
}
}
@ -582,17 +580,15 @@ void XmlDocument::readChildElements (XmlElement* parent)
else
{
const String::CharPointerType start (input);
size_t len = 0;
for (;;)
{
const juce_wchar nextChar = *input;
if (nextChar == '<' || nextChar == '&')
{
break;
}
else if (nextChar == 0)
if (nextChar == 0)
{
setLastError ("unmatched tags", false);
outOfData = true;
@ -600,17 +596,14 @@ void XmlDocument::readChildElements (XmlElement* parent)
}
++input;
++len;
}
textElementContent.appendCharPointer (start, len);
textElementContent.appendCharPointer (start, input);
}
}
if ((! ignoreEmptyTextElements) || textElementContent.containsNonWhitespaceChars())
{
childAppender.append (XmlElement::createTextElement (textElementContent));
}
}
}
}