mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-15 00:24:19 +00:00
Minor string tweaks.
This commit is contained in:
parent
45c6f4c124
commit
06fb01aab3
7 changed files with 182 additions and 186 deletions
|
|
@ -10433,7 +10433,7 @@ public:
|
|||
return text;
|
||||
|
||||
juce_wchar* const newText = create (b->allocatedNumChars);
|
||||
memcpy (newText, text, (b->allocatedNumChars + 1) * sizeof (juce_wchar));
|
||||
copyChars (newText, text, b->allocatedNumChars);
|
||||
release (b);
|
||||
|
||||
return newText;
|
||||
|
|
@ -10447,7 +10447,7 @@ public:
|
|||
return text;
|
||||
|
||||
juce_wchar* const newText = create (jmax (b->allocatedNumChars, numChars));
|
||||
memcpy (newText, text, (b->allocatedNumChars + 1) * sizeof (juce_wchar));
|
||||
copyChars (newText, text, b->allocatedNumChars);
|
||||
release (b);
|
||||
|
||||
return newText;
|
||||
|
|
@ -10458,6 +10458,12 @@ public:
|
|||
return bufferFromText (text)->allocatedNumChars;
|
||||
}
|
||||
|
||||
static void copyChars (juce_wchar* const dest, const juce_wchar* const src, const size_t numChars) throw()
|
||||
{
|
||||
memcpy (dest, src, numChars * sizeof (juce_wchar));
|
||||
dest [numChars] = 0;
|
||||
}
|
||||
|
||||
int refCount;
|
||||
size_t allocatedNumChars;
|
||||
juce_wchar text[1];
|
||||
|
|
@ -10479,7 +10485,7 @@ void String::createInternal (const juce_wchar* const t, const size_t numChars)
|
|||
jassert (t[numChars] == 0); // must have a null terminator
|
||||
|
||||
text = StringHolder::create (numChars);
|
||||
memcpy (text, t, (numChars + 1) * sizeof (juce_wchar));
|
||||
StringHolder::copyChars (text, t, numChars);
|
||||
}
|
||||
|
||||
void String::appendInternal (const juce_wchar* const newText, const int numExtraChars)
|
||||
|
|
@ -10490,16 +10496,10 @@ void String::appendInternal (const juce_wchar* const newText, const int numExtra
|
|||
const int newTotalLen = oldLen + numExtraChars;
|
||||
|
||||
text = StringHolder::makeUniqueWithSize (text, newTotalLen);
|
||||
memcpy (text + oldLen, newText, numExtraChars * sizeof (juce_wchar));
|
||||
text [newTotalLen] = 0;
|
||||
StringHolder::copyChars (text + oldLen, newText, numExtraChars);
|
||||
}
|
||||
}
|
||||
|
||||
void String::dupeInternalIfMultiplyReferenced()
|
||||
{
|
||||
text = StringHolder::makeUnique (text);
|
||||
}
|
||||
|
||||
void String::preallocateStorage (const size_t numChars)
|
||||
{
|
||||
text = StringHolder::makeUniqueWithSize (text, numChars);
|
||||
|
|
@ -10539,6 +10539,13 @@ String::String (const size_t numChars, const int /*dummyVariable*/)
|
|||
{
|
||||
}
|
||||
|
||||
String::String (const String& stringToCopy, const size_t charsToAllocate)
|
||||
{
|
||||
const size_t otherSize = StringHolder::getAllocatedNumChars (stringToCopy.text);
|
||||
text = StringHolder::create (jmax (charsToAllocate, otherSize));
|
||||
StringHolder::copyChars (text, stringToCopy.text, otherSize);
|
||||
}
|
||||
|
||||
String::String (const char* const t)
|
||||
{
|
||||
if (t != 0 && *t != 0)
|
||||
|
|
@ -10559,7 +10566,7 @@ String::String (const juce_wchar* const t)
|
|||
{
|
||||
const int len = CharacterFunctions::length (t);
|
||||
text = StringHolder::create (len);
|
||||
memcpy (text, t, (len + 1) * sizeof (juce_wchar));
|
||||
StringHolder::copyChars (text, t, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -10596,8 +10603,7 @@ String::String (const juce_wchar* const t, const size_t maxChars)
|
|||
if (i > 0)
|
||||
{
|
||||
text = StringHolder::create (i);
|
||||
memcpy (text, t, i * sizeof (juce_wchar));
|
||||
text[i] = 0;
|
||||
StringHolder::copyChars (text, t, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -11413,13 +11419,11 @@ const String String::repeatedString (const juce_wchar* const stringToRepeat, int
|
|||
{
|
||||
const int len = CharacterFunctions::length (stringToRepeat);
|
||||
String result ((size_t) (len * numberOfTimesToRepeat + 1), (int) 0);
|
||||
|
||||
juce_wchar* n = result.text;
|
||||
n[0] = 0;
|
||||
|
||||
while (--numberOfTimesToRepeat >= 0)
|
||||
{
|
||||
CharacterFunctions::append (n, stringToRepeat);
|
||||
StringHolder::copyChars (n, stringToRepeat, len);
|
||||
n += len;
|
||||
}
|
||||
|
||||
|
|
@ -11431,21 +11435,17 @@ const String String::paddedLeft (const juce_wchar padCharacter, int minimumLengt
|
|||
jassert (padCharacter != 0);
|
||||
|
||||
const int len = length();
|
||||
|
||||
if (len >= minimumLength || padCharacter == 0)
|
||||
return *this;
|
||||
|
||||
String result ((size_t) minimumLength + 1, (int) 0);
|
||||
|
||||
juce_wchar* n = result.text;
|
||||
|
||||
minimumLength -= len;
|
||||
while (--minimumLength >= 0)
|
||||
*n++ = padCharacter;
|
||||
|
||||
*n = 0;
|
||||
CharacterFunctions::append (n, text);
|
||||
|
||||
StringHolder::copyChars (n, text, len);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -11453,11 +11453,19 @@ const String String::paddedRight (const juce_wchar padCharacter, int minimumLeng
|
|||
{
|
||||
jassert (padCharacter != 0);
|
||||
|
||||
const int paddingNeeded = minimumLength - length();
|
||||
if (paddingNeeded <= 0 || padCharacter == 0)
|
||||
const int len = length();
|
||||
if (len >= minimumLength || padCharacter == 0)
|
||||
return *this;
|
||||
|
||||
return *this + String::empty.paddedLeft (padCharacter, paddingNeeded);
|
||||
String result (*this, (size_t) minimumLength);
|
||||
juce_wchar* n = result.text + len;
|
||||
|
||||
minimumLength -= len;
|
||||
while (--minimumLength >= 0)
|
||||
*n++ = padCharacter;
|
||||
|
||||
*n = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
const String String::replaceSection (int index, int numCharsToReplace,
|
||||
|
|
@ -11499,21 +11507,17 @@ const String String::replaceSection (int index, int numCharsToReplace,
|
|||
|
||||
String result ((size_t) newTotalLen, (int) 0);
|
||||
|
||||
memcpy (result.text, text, index * sizeof (juce_wchar));
|
||||
StringHolder::copyChars (result.text, text, index);
|
||||
|
||||
if (newStringLen > 0)
|
||||
memcpy (result.text + index,
|
||||
stringToInsert,
|
||||
newStringLen * sizeof (juce_wchar));
|
||||
StringHolder::copyChars (result.text + index, stringToInsert, newStringLen);
|
||||
|
||||
const int endStringLen = newTotalLen - (index + newStringLen);
|
||||
|
||||
if (endStringLen > 0)
|
||||
memcpy (result.text + (index + newStringLen),
|
||||
text + (index + numCharsToReplace),
|
||||
endStringLen * sizeof (juce_wchar));
|
||||
|
||||
result.text [newTotalLen] = 0;
|
||||
StringHolder::copyChars (result.text + (index + newStringLen),
|
||||
text + (index + numCharsToReplace),
|
||||
endStringLen);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
@ -11545,9 +11549,7 @@ const String String::replaceCharacter (const juce_wchar charToReplace, const juc
|
|||
if (index < 0)
|
||||
return *this;
|
||||
|
||||
String result (*this);
|
||||
result.dupeInternalIfMultiplyReferenced();
|
||||
|
||||
String result (*this, size_t());
|
||||
juce_wchar* t = result.text + index;
|
||||
|
||||
while (*t != 0)
|
||||
|
|
@ -11564,9 +11566,7 @@ const String String::replaceCharacter (const juce_wchar charToReplace, const juc
|
|||
const String String::replaceCharacters (const String& charactersToReplace,
|
||||
const juce_wchar* const charactersToInsertInstead) const
|
||||
{
|
||||
String result (*this);
|
||||
result.dupeInternalIfMultiplyReferenced();
|
||||
|
||||
String result (*this, size_t());
|
||||
juce_wchar* t = result.text;
|
||||
const int len2 = CharacterFunctions::length (charactersToInsertInstead);
|
||||
|
||||
|
|
@ -11639,16 +11639,14 @@ bool String::endsWithIgnoreCase (const juce_wchar* const other) const throw()
|
|||
|
||||
const String String::toUpperCase() const
|
||||
{
|
||||
String result (*this);
|
||||
result.dupeInternalIfMultiplyReferenced();
|
||||
String result (*this, size_t());
|
||||
CharacterFunctions::toUpperCase (result.text);
|
||||
return result;
|
||||
}
|
||||
|
||||
const String String::toLowerCase() const
|
||||
{
|
||||
String result (*this);
|
||||
result.dupeInternalIfMultiplyReferenced();
|
||||
String result (*this, size_t());
|
||||
CharacterFunctions::toLowerCase (result.text);
|
||||
return result;
|
||||
}
|
||||
|
|
@ -11656,9 +11654,7 @@ const String String::toLowerCase() const
|
|||
juce_wchar& String::operator[] (const int index)
|
||||
{
|
||||
jassert (((unsigned int) index) <= (unsigned int) length());
|
||||
|
||||
dupeInternalIfMultiplyReferenced();
|
||||
|
||||
text = StringHolder::makeUnique (text);
|
||||
return text [index];
|
||||
}
|
||||
|
||||
|
|
@ -11777,7 +11773,7 @@ const String String::unquoted() const
|
|||
{
|
||||
String s (*this);
|
||||
|
||||
if (s[0] == T('"') || s[0] == T('\''))
|
||||
if (s.text[0] == T('"') || s.text[0] == T('\''))
|
||||
s = s.substring (1);
|
||||
|
||||
const int lastCharIndex = s.length() - 1;
|
||||
|
|
@ -12440,9 +12436,7 @@ int String::copyToCString (char* destBuffer, const int maxBufferSizeBytes) const
|
|||
|
||||
void String::copyToUnicode (juce_wchar* const destBuffer, const int maxCharsToCopy) const throw()
|
||||
{
|
||||
const int len = jmin (maxCharsToCopy, length());
|
||||
memcpy (destBuffer, text, len * sizeof (juce_wchar));
|
||||
destBuffer [len] = 0;
|
||||
StringHolder::copyChars (destBuffer, text, jmin (maxCharsToCopy, length()));
|
||||
}
|
||||
|
||||
String::Concatenator::Concatenator (String& stringToAppendTo)
|
||||
|
|
@ -14125,7 +14119,7 @@ namespace XmlOutputFunctions
|
|||
}
|
||||
}
|
||||
|
||||
static void writeSpaces (OutputStream& out, int numSpaces) throw()
|
||||
static void writeSpaces (OutputStream& out, int numSpaces)
|
||||
{
|
||||
if (numSpaces > 0)
|
||||
{
|
||||
|
|
@ -14145,7 +14139,7 @@ namespace XmlOutputFunctions
|
|||
|
||||
void XmlElement::writeElementAsText (OutputStream& outputStream,
|
||||
const int indentationLevel,
|
||||
const int lineWrapLength) const throw()
|
||||
const int lineWrapLength) const
|
||||
{
|
||||
using namespace XmlOutputFunctions;
|
||||
writeSpaces (outputStream, indentationLevel);
|
||||
|
|
@ -14265,7 +14259,7 @@ const String XmlElement::createDocument (const String& dtdToUse,
|
|||
const bool allOnOneLine,
|
||||
const bool includeXmlHeader,
|
||||
const String& encodingType,
|
||||
const int lineWrapLength) const throw()
|
||||
const int lineWrapLength) const
|
||||
{
|
||||
MemoryOutputStream mem (2048, 4096);
|
||||
writeToStream (mem, dtdToUse, allOnOneLine, includeXmlHeader, encodingType, lineWrapLength);
|
||||
|
|
@ -14278,7 +14272,7 @@ void XmlElement::writeToStream (OutputStream& output,
|
|||
const bool allOnOneLine,
|
||||
const bool includeXmlHeader,
|
||||
const String& encodingType,
|
||||
const int lineWrapLength) const throw()
|
||||
const int lineWrapLength) const
|
||||
{
|
||||
if (includeXmlHeader)
|
||||
{
|
||||
|
|
@ -14306,7 +14300,7 @@ void XmlElement::writeToStream (OutputStream& output,
|
|||
bool XmlElement::writeToFile (const File& file,
|
||||
const String& dtdToUse,
|
||||
const String& encodingType,
|
||||
const int lineWrapLength) const throw()
|
||||
const int lineWrapLength) const
|
||||
{
|
||||
if (file.hasWriteAccess())
|
||||
{
|
||||
|
|
@ -14418,8 +14412,22 @@ bool XmlElement::hasAttribute (const String& attributeName) const throw()
|
|||
return false;
|
||||
}
|
||||
|
||||
const String XmlElement::getStringAttribute (const String& attributeName,
|
||||
const String& defaultReturnValue) const throw()
|
||||
const String& XmlElement::getStringAttribute (const String& attributeName) const throw()
|
||||
{
|
||||
const XmlAttributeNode* att = attributes;
|
||||
|
||||
while (att != 0)
|
||||
{
|
||||
if (att->name.equalsIgnoreCase (attributeName))
|
||||
return att->value;
|
||||
|
||||
att = att->next;
|
||||
}
|
||||
|
||||
return String::empty;
|
||||
}
|
||||
|
||||
const String XmlElement::getStringAttribute (const String& attributeName, const String& defaultReturnValue) const
|
||||
{
|
||||
const XmlAttributeNode* att = attributes;
|
||||
|
||||
|
|
@ -14434,8 +14442,7 @@ const String XmlElement::getStringAttribute (const String& attributeName,
|
|||
return defaultReturnValue;
|
||||
}
|
||||
|
||||
int XmlElement::getIntAttribute (const String& attributeName,
|
||||
const int defaultReturnValue) const throw()
|
||||
int XmlElement::getIntAttribute (const String& attributeName, const int defaultReturnValue) const
|
||||
{
|
||||
const XmlAttributeNode* att = attributes;
|
||||
|
||||
|
|
@ -14450,8 +14457,7 @@ int XmlElement::getIntAttribute (const String& attributeName,
|
|||
return defaultReturnValue;
|
||||
}
|
||||
|
||||
double XmlElement::getDoubleAttribute (const String& attributeName,
|
||||
const double defaultReturnValue) const throw()
|
||||
double XmlElement::getDoubleAttribute (const String& attributeName, const double defaultReturnValue) const
|
||||
{
|
||||
const XmlAttributeNode* att = attributes;
|
||||
|
||||
|
|
@ -14466,8 +14472,7 @@ double XmlElement::getDoubleAttribute (const String& attributeName,
|
|||
return defaultReturnValue;
|
||||
}
|
||||
|
||||
bool XmlElement::getBoolAttribute (const String& attributeName,
|
||||
const bool defaultReturnValue) const throw()
|
||||
bool XmlElement::getBoolAttribute (const String& attributeName, const bool defaultReturnValue) const
|
||||
{
|
||||
const XmlAttributeNode* att = attributes;
|
||||
|
||||
|
|
@ -14515,8 +14520,7 @@ bool XmlElement::compareAttribute (const String& attributeName,
|
|||
return false;
|
||||
}
|
||||
|
||||
void XmlElement::setAttribute (const String& attributeName,
|
||||
const String& value) throw()
|
||||
void XmlElement::setAttribute (const String& attributeName, const String& value)
|
||||
{
|
||||
#ifdef JUCE_DEBUG
|
||||
// check the identifier being passed in is legal..
|
||||
|
|
@ -14557,14 +14561,12 @@ void XmlElement::setAttribute (const String& attributeName,
|
|||
}
|
||||
}
|
||||
|
||||
void XmlElement::setAttribute (const String& attributeName,
|
||||
const int number) throw()
|
||||
void XmlElement::setAttribute (const String& attributeName, const int number)
|
||||
{
|
||||
setAttribute (attributeName, String (number));
|
||||
}
|
||||
|
||||
void XmlElement::setAttribute (const String& attributeName,
|
||||
const double number) throw()
|
||||
void XmlElement::setAttribute (const String& attributeName, const double number)
|
||||
{
|
||||
setAttribute (attributeName, String (number));
|
||||
}
|
||||
|
|
@ -70202,18 +70204,9 @@ public:
|
|||
|
||||
if (! screenArea.contains (lastScreenPos))
|
||||
{
|
||||
const Point<int> compPos (current->getScreenPosition());
|
||||
int deltaX = 0, deltaY = 0;
|
||||
|
||||
if (lastScreenPos.getX() <= screenArea.getX() || lastScreenPos.getX() >= screenArea.getRight())
|
||||
deltaX = compPos.getX() + current->getWidth() / 2 - lastScreenPos.getX();
|
||||
|
||||
if (lastScreenPos.getY() <= screenArea.getY() || lastScreenPos.getY() >= screenArea.getBottom())
|
||||
deltaY = compPos.getY() + current->getHeight() / 2 - lastScreenPos.getY();
|
||||
|
||||
const Point<int> delta (deltaX, deltaY);
|
||||
unboundedMouseOffset -= delta;
|
||||
Desktop::setMousePosition (lastScreenPos + delta);
|
||||
const Point<int> componentCentre (current->getScreenBounds().getCentre());
|
||||
unboundedMouseOffset += (lastScreenPos - componentCentre);
|
||||
Desktop::setMousePosition (componentCentre);
|
||||
}
|
||||
else if (isCursorVisibleUntilOffscreen
|
||||
&& (! unboundedMouseOffset.isOrigin())
|
||||
|
|
|
|||
|
|
@ -1365,10 +1365,10 @@ private:
|
|||
|
||||
// internal constructor that preallocates a certain amount of memory
|
||||
String (size_t numChars, int dummyVariable);
|
||||
String (const String& stringToCopy, size_t charsToAllocate);
|
||||
|
||||
void createInternal (const juce_wchar* text, size_t numChars);
|
||||
void appendInternal (const juce_wchar* text, int numExtraChars);
|
||||
void dupeInternalIfMultiplyReferenced();
|
||||
};
|
||||
|
||||
const String JUCE_CALLTYPE operator+ (const char* string1, const String& string2);
|
||||
|
|
@ -4456,19 +4456,19 @@ public:
|
|||
const bool allOnOneLine = false,
|
||||
const bool includeXmlHeader = true,
|
||||
const String& encodingType = JUCE_T("UTF-8"),
|
||||
const int lineWrapLength = 60) const throw();
|
||||
const int lineWrapLength = 60) const;
|
||||
|
||||
void writeToStream (OutputStream& output,
|
||||
const String& dtdToUse,
|
||||
const bool allOnOneLine = false,
|
||||
const bool includeXmlHeader = true,
|
||||
const String& encodingType = JUCE_T("UTF-8"),
|
||||
const int lineWrapLength = 60) const throw();
|
||||
const int lineWrapLength = 60) const;
|
||||
|
||||
bool writeToFile (const File& destinationFile,
|
||||
const String& dtdToUse,
|
||||
const String& encodingType = JUCE_T("UTF-8"),
|
||||
const int lineWrapLength = 60) const throw();
|
||||
const int lineWrapLength = 60) const;
|
||||
|
||||
inline const String& getTagName() const throw() { return tagName; }
|
||||
|
||||
|
|
@ -4484,30 +4484,32 @@ public:
|
|||
|
||||
bool hasAttribute (const String& attributeName) const throw();
|
||||
|
||||
const String& getStringAttribute (const String& attributeName) const throw();
|
||||
|
||||
const String getStringAttribute (const String& attributeName,
|
||||
const String& defaultReturnValue = String::empty) const throw();
|
||||
const String& defaultReturnValue) const;
|
||||
|
||||
bool compareAttribute (const String& attributeName,
|
||||
const String& stringToCompareAgainst,
|
||||
const bool ignoreCase = false) const throw();
|
||||
|
||||
int getIntAttribute (const String& attributeName,
|
||||
const int defaultReturnValue = 0) const throw();
|
||||
const int defaultReturnValue = 0) const;
|
||||
|
||||
double getDoubleAttribute (const String& attributeName,
|
||||
const double defaultReturnValue = 0.0) const throw();
|
||||
const double defaultReturnValue = 0.0) const;
|
||||
|
||||
bool getBoolAttribute (const String& attributeName,
|
||||
const bool defaultReturnValue = false) const throw();
|
||||
const bool defaultReturnValue = false) const;
|
||||
|
||||
void setAttribute (const String& attributeName,
|
||||
const String& newValue) throw();
|
||||
const String& newValue);
|
||||
|
||||
void setAttribute (const String& attributeName,
|
||||
const int newValue) throw();
|
||||
const int newValue);
|
||||
|
||||
void setAttribute (const String& attributeName,
|
||||
const double newValue) throw();
|
||||
const double newValue);
|
||||
|
||||
void removeAttribute (const String& attributeName) throw();
|
||||
|
||||
|
|
@ -4609,7 +4611,7 @@ private:
|
|||
|
||||
void writeElementAsText (OutputStream& out,
|
||||
const int indentationLevel,
|
||||
const int lineWrapLength) const throw();
|
||||
const int lineWrapLength) const;
|
||||
|
||||
void getChildElementsAsArray (XmlElement**) const throw();
|
||||
void reorderChildElements (XmlElement** const, const int) throw();
|
||||
|
|
|
|||
|
|
@ -382,18 +382,9 @@ public:
|
|||
|
||||
if (! screenArea.contains (lastScreenPos))
|
||||
{
|
||||
const Point<int> compPos (current->getScreenPosition());
|
||||
int deltaX = 0, deltaY = 0;
|
||||
|
||||
if (lastScreenPos.getX() <= screenArea.getX() || lastScreenPos.getX() >= screenArea.getRight())
|
||||
deltaX = compPos.getX() + current->getWidth() / 2 - lastScreenPos.getX();
|
||||
|
||||
if (lastScreenPos.getY() <= screenArea.getY() || lastScreenPos.getY() >= screenArea.getBottom())
|
||||
deltaY = compPos.getY() + current->getHeight() / 2 - lastScreenPos.getY();
|
||||
|
||||
const Point<int> delta (deltaX, deltaY);
|
||||
unboundedMouseOffset -= delta;
|
||||
Desktop::setMousePosition (lastScreenPos + delta);
|
||||
const Point<int> componentCentre (current->getScreenBounds().getCentre());
|
||||
unboundedMouseOffset += (lastScreenPos - componentCentre);
|
||||
Desktop::setMousePosition (componentCentre);
|
||||
}
|
||||
else if (isCursorVisibleUntilOffscreen
|
||||
&& (! unboundedMouseOffset.isOrigin())
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@ public:
|
|||
return text;
|
||||
|
||||
juce_wchar* const newText = create (b->allocatedNumChars);
|
||||
memcpy (newText, text, (b->allocatedNumChars + 1) * sizeof (juce_wchar));
|
||||
copyChars (newText, text, b->allocatedNumChars);
|
||||
release (b);
|
||||
|
||||
return newText;
|
||||
|
|
@ -107,7 +107,7 @@ public:
|
|||
return text;
|
||||
|
||||
juce_wchar* const newText = create (jmax (b->allocatedNumChars, numChars));
|
||||
memcpy (newText, text, (b->allocatedNumChars + 1) * sizeof (juce_wchar));
|
||||
copyChars (newText, text, b->allocatedNumChars);
|
||||
release (b);
|
||||
|
||||
return newText;
|
||||
|
|
@ -118,6 +118,12 @@ public:
|
|||
return bufferFromText (text)->allocatedNumChars;
|
||||
}
|
||||
|
||||
static void copyChars (juce_wchar* const dest, const juce_wchar* const src, const size_t numChars) throw()
|
||||
{
|
||||
memcpy (dest, src, numChars * sizeof (juce_wchar));
|
||||
dest [numChars] = 0;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
int refCount;
|
||||
size_t allocatedNumChars;
|
||||
|
|
@ -141,7 +147,7 @@ void String::createInternal (const juce_wchar* const t, const size_t numChars)
|
|||
jassert (t[numChars] == 0); // must have a null terminator
|
||||
|
||||
text = StringHolder::create (numChars);
|
||||
memcpy (text, t, (numChars + 1) * sizeof (juce_wchar));
|
||||
StringHolder::copyChars (text, t, numChars);
|
||||
}
|
||||
|
||||
void String::appendInternal (const juce_wchar* const newText, const int numExtraChars)
|
||||
|
|
@ -152,16 +158,10 @@ void String::appendInternal (const juce_wchar* const newText, const int numExtra
|
|||
const int newTotalLen = oldLen + numExtraChars;
|
||||
|
||||
text = StringHolder::makeUniqueWithSize (text, newTotalLen);
|
||||
memcpy (text + oldLen, newText, numExtraChars * sizeof (juce_wchar));
|
||||
text [newTotalLen] = 0;
|
||||
StringHolder::copyChars (text + oldLen, newText, numExtraChars);
|
||||
}
|
||||
}
|
||||
|
||||
void String::dupeInternalIfMultiplyReferenced()
|
||||
{
|
||||
text = StringHolder::makeUnique (text);
|
||||
}
|
||||
|
||||
void String::preallocateStorage (const size_t numChars)
|
||||
{
|
||||
text = StringHolder::makeUniqueWithSize (text, numChars);
|
||||
|
|
@ -202,6 +202,13 @@ String::String (const size_t numChars, const int /*dummyVariable*/)
|
|||
{
|
||||
}
|
||||
|
||||
String::String (const String& stringToCopy, const size_t charsToAllocate)
|
||||
{
|
||||
const size_t otherSize = StringHolder::getAllocatedNumChars (stringToCopy.text);
|
||||
text = StringHolder::create (jmax (charsToAllocate, otherSize));
|
||||
StringHolder::copyChars (text, stringToCopy.text, otherSize);
|
||||
}
|
||||
|
||||
String::String (const char* const t)
|
||||
{
|
||||
if (t != 0 && *t != 0)
|
||||
|
|
@ -222,7 +229,7 @@ String::String (const juce_wchar* const t)
|
|||
{
|
||||
const int len = CharacterFunctions::length (t);
|
||||
text = StringHolder::create (len);
|
||||
memcpy (text, t, (len + 1) * sizeof (juce_wchar));
|
||||
StringHolder::copyChars (text, t, len);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -259,8 +266,7 @@ String::String (const juce_wchar* const t, const size_t maxChars)
|
|||
if (i > 0)
|
||||
{
|
||||
text = StringHolder::create (i);
|
||||
memcpy (text, t, i * sizeof (juce_wchar));
|
||||
text[i] = 0;
|
||||
StringHolder::copyChars (text, t, i);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1085,13 +1091,11 @@ const String String::repeatedString (const juce_wchar* const stringToRepeat, int
|
|||
{
|
||||
const int len = CharacterFunctions::length (stringToRepeat);
|
||||
String result ((size_t) (len * numberOfTimesToRepeat + 1), (int) 0);
|
||||
|
||||
juce_wchar* n = result.text;
|
||||
n[0] = 0;
|
||||
|
||||
while (--numberOfTimesToRepeat >= 0)
|
||||
{
|
||||
CharacterFunctions::append (n, stringToRepeat);
|
||||
StringHolder::copyChars (n, stringToRepeat, len);
|
||||
n += len;
|
||||
}
|
||||
|
||||
|
|
@ -1103,21 +1107,17 @@ const String String::paddedLeft (const juce_wchar padCharacter, int minimumLengt
|
|||
jassert (padCharacter != 0);
|
||||
|
||||
const int len = length();
|
||||
|
||||
if (len >= minimumLength || padCharacter == 0)
|
||||
return *this;
|
||||
|
||||
String result ((size_t) minimumLength + 1, (int) 0);
|
||||
|
||||
juce_wchar* n = result.text;
|
||||
|
||||
minimumLength -= len;
|
||||
while (--minimumLength >= 0)
|
||||
*n++ = padCharacter;
|
||||
|
||||
*n = 0;
|
||||
CharacterFunctions::append (n, text);
|
||||
|
||||
StringHolder::copyChars (n, text, len);
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
@ -1125,11 +1125,19 @@ const String String::paddedRight (const juce_wchar padCharacter, int minimumLeng
|
|||
{
|
||||
jassert (padCharacter != 0);
|
||||
|
||||
const int paddingNeeded = minimumLength - length();
|
||||
if (paddingNeeded <= 0 || padCharacter == 0)
|
||||
const int len = length();
|
||||
if (len >= minimumLength || padCharacter == 0)
|
||||
return *this;
|
||||
|
||||
return *this + String::empty.paddedLeft (padCharacter, paddingNeeded);
|
||||
String result (*this, (size_t) minimumLength);
|
||||
juce_wchar* n = result.text + len;
|
||||
|
||||
minimumLength -= len;
|
||||
while (--minimumLength >= 0)
|
||||
*n++ = padCharacter;
|
||||
|
||||
*n = 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -1172,21 +1180,17 @@ const String String::replaceSection (int index, int numCharsToReplace,
|
|||
|
||||
String result ((size_t) newTotalLen, (int) 0);
|
||||
|
||||
memcpy (result.text, text, index * sizeof (juce_wchar));
|
||||
StringHolder::copyChars (result.text, text, index);
|
||||
|
||||
if (newStringLen > 0)
|
||||
memcpy (result.text + index,
|
||||
stringToInsert,
|
||||
newStringLen * sizeof (juce_wchar));
|
||||
StringHolder::copyChars (result.text + index, stringToInsert, newStringLen);
|
||||
|
||||
const int endStringLen = newTotalLen - (index + newStringLen);
|
||||
|
||||
if (endStringLen > 0)
|
||||
memcpy (result.text + (index + newStringLen),
|
||||
text + (index + numCharsToReplace),
|
||||
endStringLen * sizeof (juce_wchar));
|
||||
|
||||
result.text [newTotalLen] = 0;
|
||||
StringHolder::copyChars (result.text + (index + newStringLen),
|
||||
text + (index + numCharsToReplace),
|
||||
endStringLen);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
|
@ -1218,9 +1222,7 @@ const String String::replaceCharacter (const juce_wchar charToReplace, const juc
|
|||
if (index < 0)
|
||||
return *this;
|
||||
|
||||
String result (*this);
|
||||
result.dupeInternalIfMultiplyReferenced();
|
||||
|
||||
String result (*this, size_t());
|
||||
juce_wchar* t = result.text + index;
|
||||
|
||||
while (*t != 0)
|
||||
|
|
@ -1237,9 +1239,7 @@ const String String::replaceCharacter (const juce_wchar charToReplace, const juc
|
|||
const String String::replaceCharacters (const String& charactersToReplace,
|
||||
const juce_wchar* const charactersToInsertInstead) const
|
||||
{
|
||||
String result (*this);
|
||||
result.dupeInternalIfMultiplyReferenced();
|
||||
|
||||
String result (*this, size_t());
|
||||
juce_wchar* t = result.text;
|
||||
const int len2 = CharacterFunctions::length (charactersToInsertInstead);
|
||||
|
||||
|
|
@ -1314,16 +1314,14 @@ bool String::endsWithIgnoreCase (const juce_wchar* const other) const throw()
|
|||
//==============================================================================
|
||||
const String String::toUpperCase() const
|
||||
{
|
||||
String result (*this);
|
||||
result.dupeInternalIfMultiplyReferenced();
|
||||
String result (*this, size_t());
|
||||
CharacterFunctions::toUpperCase (result.text);
|
||||
return result;
|
||||
}
|
||||
|
||||
const String String::toLowerCase() const
|
||||
{
|
||||
String result (*this);
|
||||
result.dupeInternalIfMultiplyReferenced();
|
||||
String result (*this, size_t());
|
||||
CharacterFunctions::toLowerCase (result.text);
|
||||
return result;
|
||||
}
|
||||
|
|
@ -1332,9 +1330,7 @@ const String String::toLowerCase() const
|
|||
juce_wchar& String::operator[] (const int index)
|
||||
{
|
||||
jassert (((unsigned int) index) <= (unsigned int) length());
|
||||
|
||||
dupeInternalIfMultiplyReferenced();
|
||||
|
||||
text = StringHolder::makeUnique (text);
|
||||
return text [index];
|
||||
}
|
||||
|
||||
|
|
@ -1453,7 +1449,7 @@ const String String::unquoted() const
|
|||
{
|
||||
String s (*this);
|
||||
|
||||
if (s[0] == T('"') || s[0] == T('\''))
|
||||
if (s.text[0] == T('"') || s.text[0] == T('\''))
|
||||
s = s.substring (1);
|
||||
|
||||
const int lastCharIndex = s.length() - 1;
|
||||
|
|
@ -2124,9 +2120,7 @@ int String::copyToCString (char* destBuffer, const int maxBufferSizeBytes) const
|
|||
//==============================================================================
|
||||
void String::copyToUnicode (juce_wchar* const destBuffer, const int maxCharsToCopy) const throw()
|
||||
{
|
||||
const int len = jmin (maxCharsToCopy, length());
|
||||
memcpy (destBuffer, text, len * sizeof (juce_wchar));
|
||||
destBuffer [len] = 0;
|
||||
StringHolder::copyChars (destBuffer, text, jmin (maxCharsToCopy, length()));
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -1026,10 +1026,10 @@ private:
|
|||
//==============================================================================
|
||||
// internal constructor that preallocates a certain amount of memory
|
||||
String (size_t numChars, int dummyVariable);
|
||||
String (const String& stringToCopy, size_t charsToAllocate);
|
||||
|
||||
void createInternal (const juce_wchar* text, size_t numChars);
|
||||
void appendInternal (const juce_wchar* text, int numExtraChars);
|
||||
void dupeInternalIfMultiplyReferenced();
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
|
|
|
|||
|
|
@ -246,7 +246,7 @@ namespace XmlOutputFunctions
|
|||
}
|
||||
}
|
||||
|
||||
static void writeSpaces (OutputStream& out, int numSpaces) throw()
|
||||
static void writeSpaces (OutputStream& out, int numSpaces)
|
||||
{
|
||||
if (numSpaces > 0)
|
||||
{
|
||||
|
|
@ -266,7 +266,7 @@ namespace XmlOutputFunctions
|
|||
|
||||
void XmlElement::writeElementAsText (OutputStream& outputStream,
|
||||
const int indentationLevel,
|
||||
const int lineWrapLength) const throw()
|
||||
const int lineWrapLength) const
|
||||
{
|
||||
using namespace XmlOutputFunctions;
|
||||
writeSpaces (outputStream, indentationLevel);
|
||||
|
|
@ -386,7 +386,7 @@ const String XmlElement::createDocument (const String& dtdToUse,
|
|||
const bool allOnOneLine,
|
||||
const bool includeXmlHeader,
|
||||
const String& encodingType,
|
||||
const int lineWrapLength) const throw()
|
||||
const int lineWrapLength) const
|
||||
{
|
||||
MemoryOutputStream mem (2048, 4096);
|
||||
writeToStream (mem, dtdToUse, allOnOneLine, includeXmlHeader, encodingType, lineWrapLength);
|
||||
|
|
@ -399,7 +399,7 @@ void XmlElement::writeToStream (OutputStream& output,
|
|||
const bool allOnOneLine,
|
||||
const bool includeXmlHeader,
|
||||
const String& encodingType,
|
||||
const int lineWrapLength) const throw()
|
||||
const int lineWrapLength) const
|
||||
{
|
||||
if (includeXmlHeader)
|
||||
{
|
||||
|
|
@ -427,7 +427,7 @@ void XmlElement::writeToStream (OutputStream& output,
|
|||
bool XmlElement::writeToFile (const File& file,
|
||||
const String& dtdToUse,
|
||||
const String& encodingType,
|
||||
const int lineWrapLength) const throw()
|
||||
const int lineWrapLength) const
|
||||
{
|
||||
if (file.hasWriteAccess())
|
||||
{
|
||||
|
|
@ -542,8 +542,22 @@ bool XmlElement::hasAttribute (const String& attributeName) const throw()
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
const String XmlElement::getStringAttribute (const String& attributeName,
|
||||
const String& defaultReturnValue) const throw()
|
||||
const String& XmlElement::getStringAttribute (const String& attributeName) const throw()
|
||||
{
|
||||
const XmlAttributeNode* att = attributes;
|
||||
|
||||
while (att != 0)
|
||||
{
|
||||
if (att->name.equalsIgnoreCase (attributeName))
|
||||
return att->value;
|
||||
|
||||
att = att->next;
|
||||
}
|
||||
|
||||
return String::empty;
|
||||
}
|
||||
|
||||
const String XmlElement::getStringAttribute (const String& attributeName, const String& defaultReturnValue) const
|
||||
{
|
||||
const XmlAttributeNode* att = attributes;
|
||||
|
||||
|
|
@ -558,8 +572,7 @@ const String XmlElement::getStringAttribute (const String& attributeName,
|
|||
return defaultReturnValue;
|
||||
}
|
||||
|
||||
int XmlElement::getIntAttribute (const String& attributeName,
|
||||
const int defaultReturnValue) const throw()
|
||||
int XmlElement::getIntAttribute (const String& attributeName, const int defaultReturnValue) const
|
||||
{
|
||||
const XmlAttributeNode* att = attributes;
|
||||
|
||||
|
|
@ -574,8 +587,7 @@ int XmlElement::getIntAttribute (const String& attributeName,
|
|||
return defaultReturnValue;
|
||||
}
|
||||
|
||||
double XmlElement::getDoubleAttribute (const String& attributeName,
|
||||
const double defaultReturnValue) const throw()
|
||||
double XmlElement::getDoubleAttribute (const String& attributeName, const double defaultReturnValue) const
|
||||
{
|
||||
const XmlAttributeNode* att = attributes;
|
||||
|
||||
|
|
@ -590,8 +602,7 @@ double XmlElement::getDoubleAttribute (const String& attributeName,
|
|||
return defaultReturnValue;
|
||||
}
|
||||
|
||||
bool XmlElement::getBoolAttribute (const String& attributeName,
|
||||
const bool defaultReturnValue) const throw()
|
||||
bool XmlElement::getBoolAttribute (const String& attributeName, const bool defaultReturnValue) const
|
||||
{
|
||||
const XmlAttributeNode* att = attributes;
|
||||
|
||||
|
|
@ -640,8 +651,7 @@ bool XmlElement::compareAttribute (const String& attributeName,
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
void XmlElement::setAttribute (const String& attributeName,
|
||||
const String& value) throw()
|
||||
void XmlElement::setAttribute (const String& attributeName, const String& value)
|
||||
{
|
||||
#ifdef JUCE_DEBUG
|
||||
// check the identifier being passed in is legal..
|
||||
|
|
@ -682,14 +692,12 @@ void XmlElement::setAttribute (const String& attributeName,
|
|||
}
|
||||
}
|
||||
|
||||
void XmlElement::setAttribute (const String& attributeName,
|
||||
const int number) throw()
|
||||
void XmlElement::setAttribute (const String& attributeName, const int number)
|
||||
{
|
||||
setAttribute (attributeName, String (number));
|
||||
}
|
||||
|
||||
void XmlElement::setAttribute (const String& attributeName,
|
||||
const double number) throw()
|
||||
void XmlElement::setAttribute (const String& attributeName, const double number)
|
||||
{
|
||||
setAttribute (attributeName, String (number));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -193,7 +193,7 @@ public:
|
|||
const bool allOnOneLine = false,
|
||||
const bool includeXmlHeader = true,
|
||||
const String& encodingType = JUCE_T("UTF-8"),
|
||||
const int lineWrapLength = 60) const throw();
|
||||
const int lineWrapLength = 60) const;
|
||||
|
||||
/** Writes the document to a stream as UTF-8.
|
||||
|
||||
|
|
@ -215,7 +215,7 @@ public:
|
|||
const bool allOnOneLine = false,
|
||||
const bool includeXmlHeader = true,
|
||||
const String& encodingType = JUCE_T("UTF-8"),
|
||||
const int lineWrapLength = 60) const throw();
|
||||
const int lineWrapLength = 60) const;
|
||||
|
||||
/** Writes the element to a file as an XML document.
|
||||
|
||||
|
|
@ -239,7 +239,7 @@ public:
|
|||
bool writeToFile (const File& destinationFile,
|
||||
const String& dtdToUse,
|
||||
const String& encodingType = JUCE_T("UTF-8"),
|
||||
const int lineWrapLength = 60) const throw();
|
||||
const int lineWrapLength = 60) const;
|
||||
|
||||
//==============================================================================
|
||||
/** Returns this element's tag type name.
|
||||
|
|
@ -291,6 +291,14 @@ public:
|
|||
/** Checks whether the element contains an attribute with a certain name. */
|
||||
bool hasAttribute (const String& attributeName) const throw();
|
||||
|
||||
/** Returns the value of a named attribute.
|
||||
|
||||
@param attributeName the name of the attribute to look up
|
||||
@param defaultReturnValue a value to return if the element doesn't have an attribute
|
||||
with this name
|
||||
*/
|
||||
const String& getStringAttribute (const String& attributeName) const throw();
|
||||
|
||||
/** Returns the value of a named attribute.
|
||||
|
||||
@param attributeName the name of the attribute to look up
|
||||
|
|
@ -298,7 +306,7 @@ public:
|
|||
with this name
|
||||
*/
|
||||
const String getStringAttribute (const String& attributeName,
|
||||
const String& defaultReturnValue = String::empty) const throw();
|
||||
const String& defaultReturnValue) const;
|
||||
|
||||
/** Compares the value of a named attribute with a value passed-in.
|
||||
|
||||
|
|
@ -323,7 +331,7 @@ public:
|
|||
@see setAttribute
|
||||
*/
|
||||
int getIntAttribute (const String& attributeName,
|
||||
const int defaultReturnValue = 0) const throw();
|
||||
const int defaultReturnValue = 0) const;
|
||||
|
||||
/** Returns the value of a named attribute as floating-point.
|
||||
|
||||
|
|
@ -336,7 +344,7 @@ public:
|
|||
@see setAttribute
|
||||
*/
|
||||
double getDoubleAttribute (const String& attributeName,
|
||||
const double defaultReturnValue = 0.0) const throw();
|
||||
const double defaultReturnValue = 0.0) const;
|
||||
|
||||
/** Returns the value of a named attribute as a boolean.
|
||||
|
||||
|
|
@ -349,7 +357,7 @@ public:
|
|||
with this name
|
||||
*/
|
||||
bool getBoolAttribute (const String& attributeName,
|
||||
const bool defaultReturnValue = false) const throw();
|
||||
const bool defaultReturnValue = false) const;
|
||||
|
||||
/** Adds a named attribute to the element.
|
||||
|
||||
|
|
@ -365,7 +373,7 @@ public:
|
|||
@see removeAttribute
|
||||
*/
|
||||
void setAttribute (const String& attributeName,
|
||||
const String& newValue) throw();
|
||||
const String& newValue);
|
||||
|
||||
/** Adds a named attribute to the element, setting it to an integer value.
|
||||
|
||||
|
|
@ -380,7 +388,7 @@ public:
|
|||
@param newValue the value to set it to
|
||||
*/
|
||||
void setAttribute (const String& attributeName,
|
||||
const int newValue) throw();
|
||||
const int newValue);
|
||||
|
||||
/** Adds a named attribute to the element, setting it to a floating-point value.
|
||||
|
||||
|
|
@ -395,7 +403,7 @@ public:
|
|||
@param newValue the value to set it to
|
||||
*/
|
||||
void setAttribute (const String& attributeName,
|
||||
const double newValue) throw();
|
||||
const double newValue);
|
||||
|
||||
/** Removes a named attribute from the element.
|
||||
|
||||
|
|
@ -704,7 +712,7 @@ private:
|
|||
|
||||
void writeElementAsText (OutputStream& out,
|
||||
const int indentationLevel,
|
||||
const int lineWrapLength) const throw();
|
||||
const int lineWrapLength) const;
|
||||
|
||||
void getChildElementsAsArray (XmlElement**) const throw();
|
||||
void reorderChildElements (XmlElement** const, const int) throw();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue