|
- /*
- ==============================================================================
-
- This file is part of the JUCE library - "Jules' Utility Class Extensions"
- Copyright 2004-11 by Raw Material Software Ltd.
-
- ------------------------------------------------------------------------------
-
- JUCE can be redistributed and/or modified under the terms of the GNU General
- Public License (Version 2), as published by the Free Software Foundation.
- A copy of the license is included in the JUCE distribution, or can be found
- online at www.gnu.org/licenses.
-
- JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
- WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
- A PARTICULAR PURPOSE. See the GNU General Public License for more details.
-
- ------------------------------------------------------------------------------
-
- To release a closed-source product which uses JUCE, commercial licenses are
- available: visit www.rawmaterialsoftware.com/juce for more information.
-
- ==============================================================================
- */
-
- BEGIN_JUCE_NAMESPACE
-
- //==============================================================================
- StringArray::StringArray() noexcept
- {
- }
-
- StringArray::StringArray (const StringArray& other)
- : strings (other.strings)
- {
- }
-
- #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS
- StringArray::StringArray (StringArray&& other) noexcept
- : strings (static_cast <Array <String>&&> (other.strings))
- {
- }
- #endif
-
- StringArray::StringArray (const String& firstValue)
- {
- strings.add (firstValue);
- }
-
- namespace StringArrayHelpers
- {
- template <typename CharType>
- void addArray (Array<String>& dest, const CharType* const* strings)
- {
- if (strings != nullptr)
- while (*strings != nullptr)
- dest.add (*strings++);
- }
-
- template <typename CharType>
- void addArray (Array<String>& dest, const CharType* const* const strings, const int numberOfStrings)
- {
- for (int i = 0; i < numberOfStrings; ++i)
- dest.add (strings [i]);
- }
- }
-
- StringArray::StringArray (const char* const* const initialStrings)
- {
- StringArrayHelpers::addArray (strings, initialStrings);
- }
-
- StringArray::StringArray (const char* const* const initialStrings, const int numberOfStrings)
- {
- StringArrayHelpers::addArray (strings, initialStrings, numberOfStrings);
- }
-
- StringArray::StringArray (const wchar_t* const* const initialStrings)
- {
- StringArrayHelpers::addArray (strings, initialStrings);
- }
-
- StringArray::StringArray (const wchar_t* const* const initialStrings, const int numberOfStrings)
- {
- StringArrayHelpers::addArray (strings, initialStrings, numberOfStrings);
- }
-
- StringArray& StringArray::operator= (const StringArray& other)
- {
- strings = other.strings;
- return *this;
- }
-
- #if JUCE_COMPILER_SUPPORTS_MOVE_SEMANTICS
- StringArray& StringArray::operator= (StringArray&& other) noexcept
- {
- strings = static_cast <Array<String>&&> (other.strings);
- return *this;
- }
- #endif
-
- StringArray::~StringArray()
- {
- }
-
- bool StringArray::operator== (const StringArray& other) const noexcept
- {
- if (other.size() != size())
- return false;
-
- for (int i = size(); --i >= 0;)
- if (other.strings.getReference(i) != strings.getReference(i))
- return false;
-
- return true;
- }
-
- bool StringArray::operator!= (const StringArray& other) const noexcept
- {
- return ! operator== (other);
- }
-
- void StringArray::clear()
- {
- strings.clear();
- }
-
- const String& StringArray::operator[] (const int index) const noexcept
- {
- if (isPositiveAndBelow (index, strings.size()))
- return strings.getReference (index);
-
- return String::empty;
- }
-
- String& StringArray::getReference (const int index) noexcept
- {
- jassert (isPositiveAndBelow (index, strings.size()));
- return strings.getReference (index);
- }
-
- void StringArray::add (const String& newString)
- {
- strings.add (newString);
- }
-
- void StringArray::insert (const int index, const String& newString)
- {
- strings.insert (index, newString);
- }
-
- void StringArray::addIfNotAlreadyThere (const String& newString, const bool ignoreCase)
- {
- if (! contains (newString, ignoreCase))
- add (newString);
- }
-
- void StringArray::addArray (const StringArray& otherArray, int startIndex, int numElementsToAdd)
- {
- if (startIndex < 0)
- {
- jassertfalse;
- startIndex = 0;
- }
-
- if (numElementsToAdd < 0 || startIndex + numElementsToAdd > otherArray.size())
- numElementsToAdd = otherArray.size() - startIndex;
-
- while (--numElementsToAdd >= 0)
- strings.add (otherArray.strings.getReference (startIndex++));
- }
-
- void StringArray::set (const int index, const String& newString)
- {
- strings.set (index, newString);
- }
-
- bool StringArray::contains (const String& stringToLookFor, const bool ignoreCase) const
- {
- if (ignoreCase)
- {
- for (int i = size(); --i >= 0;)
- if (strings.getReference(i).equalsIgnoreCase (stringToLookFor))
- return true;
- }
- else
- {
- for (int i = size(); --i >= 0;)
- if (stringToLookFor == strings.getReference(i))
- return true;
- }
-
- return false;
- }
-
- int StringArray::indexOf (const String& stringToLookFor, const bool ignoreCase, int i) const
- {
- if (i < 0)
- i = 0;
-
- const int numElements = size();
-
- if (ignoreCase)
- {
- while (i < numElements)
- {
- if (strings.getReference(i).equalsIgnoreCase (stringToLookFor))
- return i;
-
- ++i;
- }
- }
- else
- {
- while (i < numElements)
- {
- if (stringToLookFor == strings.getReference (i))
- return i;
-
- ++i;
- }
- }
-
- return -1;
- }
-
- //==============================================================================
- void StringArray::remove (const int index)
- {
- strings.remove (index);
- }
-
- void StringArray::removeString (const String& stringToRemove,
- const bool ignoreCase)
- {
- if (ignoreCase)
- {
- for (int i = size(); --i >= 0;)
- if (strings.getReference(i).equalsIgnoreCase (stringToRemove))
- strings.remove (i);
- }
- else
- {
- for (int i = size(); --i >= 0;)
- if (stringToRemove == strings.getReference (i))
- strings.remove (i);
- }
- }
-
- void StringArray::removeRange (int startIndex, int numberToRemove)
- {
- strings.removeRange (startIndex, numberToRemove);
- }
-
- //==============================================================================
- void StringArray::removeEmptyStrings (const bool removeWhitespaceStrings)
- {
- if (removeWhitespaceStrings)
- {
- for (int i = size(); --i >= 0;)
- if (! strings.getReference(i).containsNonWhitespaceChars())
- strings.remove (i);
- }
- else
- {
- for (int i = size(); --i >= 0;)
- if (strings.getReference(i).isEmpty())
- strings.remove (i);
- }
- }
-
- void StringArray::trim()
- {
- for (int i = size(); --i >= 0;)
- {
- String& s = strings.getReference(i);
- s = s.trim();
- }
- }
-
- //==============================================================================
- class InternalStringArrayComparator_CaseSensitive
- {
- public:
- static int compareElements (String& first, String& second) { return first.compare (second); }
- };
-
- class InternalStringArrayComparator_CaseInsensitive
- {
- public:
- static int compareElements (String& first, String& second) { return first.compareIgnoreCase (second); }
- };
-
- void StringArray::sort (const bool ignoreCase)
- {
- if (ignoreCase)
- {
- InternalStringArrayComparator_CaseInsensitive comp;
- strings.sort (comp);
- }
- else
- {
- InternalStringArrayComparator_CaseSensitive comp;
- strings.sort (comp);
- }
- }
-
- void StringArray::move (const int currentIndex, int newIndex) noexcept
- {
- strings.move (currentIndex, newIndex);
- }
-
-
- //==============================================================================
- String StringArray::joinIntoString (const String& separator, int start, int numberToJoin) const
- {
- const int last = (numberToJoin < 0) ? size()
- : jmin (size(), start + numberToJoin);
-
- if (start < 0)
- start = 0;
-
- if (start >= last)
- return String::empty;
-
- if (start == last - 1)
- return strings.getReference (start);
-
- const size_t separatorBytes = separator.getCharPointer().sizeInBytes() - sizeof (String::CharPointerType::CharType);
- size_t bytesNeeded = separatorBytes * (last - start - 1);
-
- for (int i = start; i < last; ++i)
- bytesNeeded += strings.getReference(i).getCharPointer().sizeInBytes() - sizeof (String::CharPointerType::CharType);
-
- String result;
- result.preallocateBytes (bytesNeeded);
-
- String::CharPointerType dest (result.getCharPointer());
-
- while (start < last)
- {
- const String& s = strings.getReference (start);
-
- if (! s.isEmpty())
- dest.writeAll (s.getCharPointer());
-
- if (++start < last && separatorBytes > 0)
- dest.writeAll (separator.getCharPointer());
- }
-
- dest.writeNull();
-
- return result;
- }
-
- int StringArray::addTokens (const String& text, const bool preserveQuotedStrings)
- {
- return addTokens (text, " \n\r\t", preserveQuotedStrings ? "\"" : "");
- }
-
- int StringArray::addTokens (const String& text, const String& breakCharacters, const String& quoteCharacters)
- {
- int num = 0;
- String::CharPointerType t (text.getCharPointer());
-
- while (! t.isEmpty())
- {
- String::CharPointerType tokenEnd (CharacterFunctions::findEndOfToken (t,
- breakCharacters.getCharPointer(),
- quoteCharacters.getCharPointer()));
- add (String (t, tokenEnd));
- ++num;
-
- if (tokenEnd.isEmpty())
- break;
-
- t = ++tokenEnd;
- }
-
- return num;
- }
-
- int StringArray::addLines (const String& sourceText)
- {
- int numLines = 0;
- String::CharPointerType text (sourceText.getCharPointer());
- bool finished = text.isEmpty();
-
- while (! finished)
- {
- String::CharPointerType startOfLine (text);
- size_t numChars = 0;
-
- for (;;)
- {
- const juce_wchar c = text.getAndAdvance();
-
- if (c == 0)
- {
- finished = true;
- break;
- }
-
- if (c == '\n')
- break;
-
- if (c == '\r')
- {
- if (*text == '\n')
- ++text;
-
- break;
- }
-
- ++numChars;
- }
-
- add (String (startOfLine, numChars));
- ++numLines;
- }
-
- return numLines;
- }
-
- //==============================================================================
- void StringArray::removeDuplicates (const bool ignoreCase)
- {
- for (int i = 0; i < size() - 1; ++i)
- {
- const String s (strings.getReference(i));
-
- int nextIndex = i + 1;
-
- for (;;)
- {
- nextIndex = indexOf (s, ignoreCase, nextIndex);
-
- if (nextIndex < 0)
- break;
-
- strings.remove (nextIndex);
- }
- }
- }
-
- void StringArray::appendNumbersToDuplicates (const bool ignoreCase,
- const bool appendNumberToFirstInstance,
- CharPointer_UTF8 preNumberString,
- CharPointer_UTF8 postNumberString)
- {
- CharPointer_UTF8 defaultPre (" ("), defaultPost (")");
-
- if (preNumberString.getAddress() == nullptr)
- preNumberString = defaultPre;
-
- if (postNumberString.getAddress() == nullptr)
- postNumberString = defaultPost;
-
- for (int i = 0; i < size() - 1; ++i)
- {
- String& s = strings.getReference(i);
-
- int nextIndex = indexOf (s, ignoreCase, i + 1);
-
- if (nextIndex >= 0)
- {
- const String original (s);
-
- int number = 0;
-
- if (appendNumberToFirstInstance)
- s = original + String (preNumberString) + String (++number) + String (postNumberString);
- else
- ++number;
-
- while (nextIndex >= 0)
- {
- set (nextIndex, (*this)[nextIndex] + String (preNumberString) + String (++number) + String (postNumberString));
- nextIndex = indexOf (original, ignoreCase, nextIndex + 1);
- }
- }
- }
- }
-
- void StringArray::minimiseStorageOverheads()
- {
- strings.minimiseStorageOverheads();
- }
-
- END_JUCE_NAMESPACE
|