diff options
Diffstat (limited to 'libs/backends/wavesaudio/wavesapi/MiscUtils/WCFixedString.h')
-rw-r--r-- | libs/backends/wavesaudio/wavesapi/MiscUtils/WCFixedString.h | 904 |
1 files changed, 0 insertions, 904 deletions
diff --git a/libs/backends/wavesaudio/wavesapi/MiscUtils/WCFixedString.h b/libs/backends/wavesaudio/wavesapi/MiscUtils/WCFixedString.h deleted file mode 100644 index d127e0116a..0000000000 --- a/libs/backends/wavesaudio/wavesapi/MiscUtils/WCFixedString.h +++ /dev/null @@ -1,904 +0,0 @@ -/* - Copyright (C) 2014 Waves Audio Ltd. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program 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. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -*/ - -#ifndef __WCFixedString_h__ - #define __WCFixedString_h__ - -/* Copy to include. -#include "WCFixedString.h" -*/ -// do not #include anything else here but standard C++ library files, this file should be free from any and all depandencies -// do not put any DEBUG_s or TRACE_s in this file, since it is used in BgkConsole functions - -#include <algorithm> -#include <cctype> -#include <cstring> -#include <cstdio> - -#ifdef __APPLE__ -#include <strings.h> -#endif - -#include "BasicTypes/WUDefines.h" -#include "BasicTypes/WTByteOrder.h" -#include "WavesPublicAPI/wstdint.h" -#include "MiscUtils/MinMaxUtilities.h" - -// use this macro instead of std :: string to mark the that use of std :: string could not be replaced -// by WFixedString. -#define std_string_approved std::string - -#ifdef __POSIX__ -const char* const kStrNewLine = "\n"; -#endif -#ifdef PLATFORM_WINDOWS -const char* const kStrNewLine = "\r\n"; -#endif - -class DllExport WCFixedStringBase -{ -public: - typedef size_t pos_t; - typedef intptr_t spos_t; // signed position, defined to intptr_t because Windows does not have ssize_t - static const pos_t npos = UINTPTR_MAX; // Same as size_max - - WCFixedStringBase(char* const in_begin, const size_t in_MaxFixedStringLength) : - m_begin(in_begin), - m_MaxFixedStringLength(in_MaxFixedStringLength), - m_end(in_begin) - { - *m_end = '\0'; - } - - inline WCFixedStringBase& operator=(const WCFixedStringBase& in_fixedStrToAssign) - { - if (this != &in_fixedStrToAssign) - { - clear(); - operator<<(in_fixedStrToAssign); - } - - return *this; - } - - inline WCFixedStringBase& operator=(const char* in_CStrToAssign) - { - clear(); - operator<<(in_CStrToAssign); - - return *this; - } - - inline WCFixedStringBase& operator=(const char in_charToAssign) - { - clear(); - operator<<(in_charToAssign); - - return *this; - } - - char operator[](const pos_t in_index) const - { - if (in_index < m_MaxFixedStringLength) - return m_begin[in_index]; - else - return m_begin[m_MaxFixedStringLength]; // in_index was too big - } - - char& operator[](const pos_t in_index) - { - if (in_index < m_MaxFixedStringLength) - return m_begin[in_index]; - else - return m_begin[m_MaxFixedStringLength]; // in_index was too big - } - - inline size_t resize(const size_t in_newSize) - { - m_end = m_begin + WUMin<size_t>(in_newSize, m_MaxFixedStringLength); - *m_end = '\0'; - return size(); - } - - size_t max_size() - { - return m_MaxFixedStringLength; - } - - size_t capacity() - { - return m_MaxFixedStringLength; - } - - - inline char * peek() - { - return m_begin; - } - - inline const char * c_str() const - { - *m_end = '\0'; - return m_begin; - } - - inline void clear() - { - m_end = m_begin; - *m_end = '\0'; - } - - inline size_t size() const - { - return m_end - m_begin; - } - - inline char* begin() const - { - return m_begin; - } - - inline char* end() const - { - return m_end; - } - - inline size_t length() const - { - return size(); - } - - inline bool empty() const - { - return m_begin == m_end; - } - - inline void reverse(char* in_left, char* in_right) - { - char* left = in_left; - char* right = in_right; - while (left < right) - { - char temp = *--right; - *right = *left; - *left++ = temp; - } - } - - inline void reverse() - { - reverse(m_begin, m_end); - } - - inline void to_lower() - { - char* pToDo = m_begin; - - while (pToDo < m_end) - { - *pToDo = static_cast<char>(std::tolower(*pToDo)); - ++pToDo; - } - } - - inline void to_upper() - { - char* pToDo = m_begin; - - while (pToDo < m_end) - { - *pToDo = static_cast<char>(std::toupper(*pToDo)); - ++pToDo; - } - } - - // append a single char in_count times - inline void append(const char in_charToAppend, const size_t in_count) - { - size_t counter = 0; - while ((m_end < m_begin+m_MaxFixedStringLength) && counter++ < in_count) - *m_end++ = in_charToAppend; -#if kEnableDebug == 1 - if (counter < in_count) // if there wasn't enough room for some appended chars - { - m_begin[0] = '@'; // mark the string as overflowed - } -#endif - *m_end = '\0'; - } - - inline void append(const char* in_chars) - { - operator<<(in_chars); - } - - // append "iterator style" - inline void append(const char* in_chars_begin, const char* in_chars_end) - { - const char* curr_char = in_chars_begin; - while ((m_end < m_begin+m_MaxFixedStringLength) && curr_char < in_chars_end && *curr_char != '\0') - *m_end++ = *curr_char++; - -#if kEnableDebug == 1 - if (curr_char < in_chars_end) // if there wasn't enough room for some appended chars - { - m_begin[0] = '@'; // mark the string as overflowed - } -#endif - *m_end = '\0'; - } - - // append from a char* in_count chars, (no \0 is required to terminate the input string) - inline void append(const char* in_chars_begin, const size_t in_count) - { - append(in_chars_begin, in_chars_begin + in_count); - } - - // assign from a char* in_count chars, (no \0 is required to terminate the input string) - inline void assign(const char* in_chars_begin, const size_t in_count) - { - clear(); - append(in_chars_begin, in_chars_begin + in_count); - } - - // assign from a char* , (a \0 is required to terminate the input string) - inline void assign(const char* in_chars_ptr) - { - clear(); - operator<<(in_chars_ptr); - } - - // assign from a char* to a char* - inline void assign(const char* in_begin, const char* in_end) - { - assign(in_begin, size_t(in_end - in_begin)); - } - - inline void append_double_with_precision(const double in_double, const int in_precision) - { - const unsigned int tempBufSize = 32; - char buf[tempBufSize]; - - #ifdef PLATFORM_WINDOWS - _snprintf_s(buf, tempBufSize, tempBufSize - 1, "%.*f", in_precision, in_double); - #endif - #ifdef __APPLE__ - std::snprintf(buf, tempBufSize, "%.*f", in_precision, in_double); - #endif - #ifdef __linux__ - snprintf(buf, tempBufSize, "%.*f", in_precision, in_double); - #endif - - operator<<(buf); - } - - inline void append_uint(const uint64_t in_uint, const int_fast16_t in_base = 10) - { - uint_fast64_t num = in_uint; - - char* lasr_char_before = m_end; - - do { - char remainder(static_cast<char>(num % in_base)); - - if ( remainder < 10 ) - operator<<(char(remainder + '0')); - else - operator<<(char(remainder - 10 + 'A')); - - num /= in_base; - } while (num != 0); - - reverse(lasr_char_before, m_end); - } - - inline void append_hex_binary(const uint8_t* in_binary, const size_t in_size) - { - static const char hexdigits[] = "0123456789ABCDEF"; - -#if _BYTEORDER_BIG_ENDIAN==1 - for (size_t ibyte = 0; ibyte < in_size; ++ibyte) -#elif _BYTEORDER_BIG_ENDIAN==0 - for (size_t ibyte = in_size; ibyte > 0; --ibyte) -#endif - { - operator<<(hexdigits[in_binary[ibyte - 1] >> 4]); - operator<<(hexdigits[in_binary[ibyte - 1] & 0x0F]); - } - } - - inline WCFixedStringBase& operator<<(const char in_charToAppend) - { - if (m_end < m_begin+m_MaxFixedStringLength) - *m_end++ = in_charToAppend; -#if kEnableDebug == 1 - else // if there wasn't enough room for the appended char - { - m_begin[0] = '@'; // mark the string as overflowed - } -#endif - - *m_end = '\0'; - - return *this; - } - - inline WCFixedStringBase& operator<<(const char* const in_strToAppend) - { - if (0 != in_strToAppend) - { - const char* pSource = in_strToAppend; - - while (*pSource != '\0' && m_end < m_begin+m_MaxFixedStringLength) - *m_end++ = *pSource++; - -#if kEnableDebug == 1 - if (*pSource != '\0') // if there wasn't enough room for some appended chars - { - m_begin[0] = '@'; // mark the string as overflowed - } -#endif - *m_end = '\0'; - } - - return *this; - } - - WCFixedStringBase& operator<<(const uint64_t in_uint) - { - append_uint(in_uint, 10); - - return *this; - } - - - // Warning prevention: the operator<< function overload for unsigneds used to create lots - // of warnings once size_t usage was becoming widespread. So for each OS we define only - // those overloads that are actually needed. On Windows 32 bit we still get - // 'warning C4267: 'argument' : conversion from 'size_t' to 'const unsigned int', possible loss of data' - // warning which we do not know how to solve yet. The function DummyFunctionsForWarningTest - // in file WCFixedStringStream.cpp calls all combinations of operator<<(unsigned something) - // And should produce no warnings - (except the C4267 on windows). -#if defined(__APPLE__) // both 32 & 64 bit - WCFixedStringBase& operator<<(const size_t in_uint) { - return operator<<(static_cast<unsigned long long>(in_uint)); - } -#endif -// WCFixedStringBase& operator<<(const unsigned char in_uint) { -// return operator<<(static_cast<const unsigned long long>(in_uint)); -// } -// -// WCFixedStringBase& operator<<(const size_t in_uint) { -// return operator<<(static_cast<const uint64_t>(in_uint)); -// } -// -#if defined(__APPLE__) || defined(PLATFORM_WINDOWS) || defined(__linux__) // both 32 & 64 bit - WCFixedStringBase& operator<<(const unsigned int in_uint) { - return operator<<(static_cast<uint64_t>(in_uint)); - } -#endif -// -#if defined(PLATFORM_WINDOWS) || defined(__linux__) // both 32 & 64 bit - WCFixedStringBase& operator<<(const unsigned long in_uint) { - return operator<<(static_cast<uint64_t>(in_uint)); - } -#endif - - WCFixedStringBase& operator<<(const long long in_int) - { - if (in_int < 0) - operator<<('-'); -#ifdef PLATFORM_WINDOWS -// uintmax_t unsigned_in_num = _abs64(in_int); - uintmax_t unsigned_in_num = in_int < 0 ? static_cast<uintmax_t>(-in_int) : static_cast<uintmax_t>(in_int); -#else - uintmax_t unsigned_in_num = std::abs(in_int); -#endif - append_uint(unsigned_in_num, 10); - - return *this; - } - - WCFixedStringBase& operator<<(const short in_int) { - return operator<<(static_cast<int64_t>(in_int)); - } - - WCFixedStringBase& operator<<(const int in_int) { - return operator<<(static_cast<int64_t>(in_int)); - } - - WCFixedStringBase& operator<<(const long in_int) { - return operator<<(static_cast<int64_t>(in_int)); - } - - WCFixedStringBase& operator<<(const double in_doubleToWrite) - { - append_double_with_precision(in_doubleToWrite, 10); - - return *this; - } - - WCFixedStringBase& operator<<(const float in_floatToWrite) - { - append_double_with_precision(double(in_floatToWrite), 5); - - return *this; - } - - inline WCFixedStringBase& operator<<(const WCFixedStringBase& in_fixedStrToAppend) - { - operator<<(in_fixedStrToAppend.c_str()); - - return *this; - } - - WCFixedStringBase& operator<< (bool abool) - { - return abool ? operator<<("true") : operator<<("false"); - } - - template<typename T> WCFixedStringBase& operator+=(T in_type) - { - return operator<<(in_type); - } - - ptrdiff_t compare(const char* in_to_compare) const - { - ptrdiff_t retVal = 1; - - if (0 != in_to_compare) - { - retVal = strcmp(c_str(), in_to_compare); - } - - return retVal; - } - - - ptrdiff_t compare(const WCFixedStringBase& in_to_compare) const - { - ptrdiff_t retVal = compare(in_to_compare.c_str()); - return retVal; - } - - ptrdiff_t case_insensitive_compare(const char* in_to_compare) const - { - ptrdiff_t retVal = 1; - - if (0 != in_to_compare) - { -#ifdef PLATFORM_WINDOWS - retVal = _stricmp(c_str(), in_to_compare); -#endif -#if defined(__linux__) || defined(__APPLE__) - retVal = strcasecmp(c_str(), in_to_compare); -#endif - } - - return retVal; - } - - ptrdiff_t case_insensitive_compare(const WCFixedStringBase& in_to_compare) const - { - ptrdiff_t retVal = case_insensitive_compare(in_to_compare.c_str()); - return retVal; - } - - pos_t find(const char in_char_to_find) const - { - const char* pCurrChar = m_begin; - while (pCurrChar < m_end && *pCurrChar != in_char_to_find) - ++pCurrChar; - - return (pCurrChar < m_end) ? (pCurrChar - m_begin) : npos; - } - - pos_t rfind(const char in_char_to_find) const - { - pos_t retVal = npos; - const char* pCurrChar = m_end; - - while (pCurrChar != m_begin) - { - --pCurrChar; - if (*pCurrChar == in_char_to_find) - { - retVal = pCurrChar - m_begin; - break; - } - } - - return retVal; - } - - pos_t find(const char* in_chars_to_find, const pos_t in_start_from = 0) const - { - pos_t retVal = npos; - size_t to_find_size = ::strlen(in_chars_to_find); - - if (to_find_size > 0 && to_find_size <= size() && in_start_from < size()) - { - const char* pCurrChar = m_begin + in_start_from; - while ((m_end - pCurrChar) >= (ptrdiff_t)to_find_size) - { - int found = ::memcmp(pCurrChar, in_chars_to_find, to_find_size); - if (0 == found) - { - retVal = (pCurrChar - m_begin); - break; - } - - ++pCurrChar; - } - } - - return retVal; - } - - pos_t rfind(const char* in_chars_to_find) const - { - pos_t retVal = npos; - size_t to_find_size = ::strlen(in_chars_to_find); - - if (to_find_size > 0 && to_find_size <= size()) - { - const char* pCurrChar = m_end - to_find_size; - while (m_begin <= pCurrChar) - { - int found = ::memcmp(pCurrChar, in_chars_to_find, to_find_size); - if (0 == found) - { - retVal = (pCurrChar - m_begin); - break; - } - - --pCurrChar; - } - } - - return retVal; - } - - pos_t find_case_insensitive(const char* in_chars_to_find, const pos_t in_start_from = 0) const - { - pos_t retVal = npos; - size_t to_find_size = ::strlen(in_chars_to_find); - - if (to_find_size > 0 && to_find_size <= size() && in_start_from < size()) - { - const char* pCurrChar = m_begin + in_start_from; - while ((m_end - pCurrChar) >= (ptrdiff_t)to_find_size) - { - size_t i; - for (i = 0; i < to_find_size; ++i) - { - if (tolower(*(pCurrChar+i)) != tolower(in_chars_to_find[i])) - break; - } - - if (i == to_find_size) - { - retVal = (pCurrChar - m_begin); - break; - } - - ++pCurrChar; - } - } - - return retVal; - } - - pos_t find_first_of(const char* in_possibe_chars_to_find, const pos_t in_start_from = 0) const - { - pos_t retVal = npos; - - if (in_start_from < size()) - { - const char* pFoundChar = strpbrk(m_begin + in_start_from, in_possibe_chars_to_find); - if (0 != pFoundChar) - { - retVal = (pFoundChar - m_begin); - } - } - - return retVal; - } - - pos_t find_last_of(const char* in_possibe_chars_to_find, const pos_t in_start_from = 0) const - { - pos_t retVal = npos; - - pos_t curr_location = in_start_from; - - while (size() > curr_location) - { - pos_t found = find_first_of(in_possibe_chars_to_find, curr_location); - if (npos != found) - { - retVal = found; - curr_location = found + 1; - } - else - break; - } - - return retVal; - } - - pos_t find_first_not_of(const char* in_acceptable_chars, const pos_t in_start_from = 0) const - { - pos_t retVal = npos; - - if (in_start_from < size()) - { - retVal = (strspn(m_begin + in_start_from, in_acceptable_chars)); - if (size() <= retVal + in_start_from) - { - retVal = npos; - } - else - { - retVal += in_start_from; - } - } - - return retVal; - } - - pos_t find_last_not_of(const char* in_acceptable_chars, const pos_t in_start_from = 0) const - { - pos_t retVal = npos; - - pos_t curr_location = in_start_from; - - while (size() > curr_location) - { - pos_t found = find_first_not_of(in_acceptable_chars, curr_location); - if (npos != found) - { - retVal = found; - curr_location = found + 1; - } - else - break; - } - - return retVal; - } - - // return true if in_begin_text is found at position 0 OR if in_begin_text is empty - bool begins_with(const char* in_begin_text) const - { - pos_t where = find(in_begin_text, 0); - bool retVal = (0 == where) || (0 == ::strlen(in_begin_text)); - return retVal; - } - - // return true if in_end_text is found at th end OR if in_end_text is empty - bool ends_with(const char* in_end_text) const - { - pos_t where = rfind(in_end_text); - bool retVal = ((size() - strlen(in_end_text)) == where) || (0 == ::strlen(in_end_text)); - return retVal; - } - - size_t replace(const char in_look_for, const char in_replace_with) - { - size_t retVal = 0; - - char* pCurrChar = m_begin; - while (pCurrChar < m_end) - { - if (*pCurrChar == in_look_for) - { - *pCurrChar = in_replace_with; - ++retVal; - } - ++pCurrChar; - } - - return retVal; - } - - // erase in_size chars starting from in_location - void erase(const pos_t in_location, const size_t in_num_chars = 1) - { - if (size() > in_location && in_num_chars > 0) - { - size_t actual_num_chars = WUMin(in_num_chars, size_t(size() - in_location)); - char* pTo = m_begin + in_location; - char* pFrom = pTo + actual_num_chars; - - while (pFrom < m_end) - *pTo++ = *pFrom++; - - resize(size() - actual_num_chars); - } - } - - // erase any char that appear in in_forbidden_chars - void erase_all_of(const char* in_forbidden_chars) - { - pos_t curr_location = 0; - - while (npos != curr_location) - { - curr_location = find_first_of(in_forbidden_chars, curr_location); - if (npos != curr_location) - erase(curr_location); - } - } - - // erase any char that do not appear in in_allowed_chars - void erase_all_not_of(const char* in_allowed_chars) - { - pos_t curr_location = 0; - - while (npos != curr_location) - { - curr_location = find_first_not_of(in_allowed_chars, curr_location); - if (npos != curr_location) - erase(curr_location); - } - } - - //! Copy the content of fixed string to a buffer appending a '\0' at the end. - //! If in_buffer_size is more than the allocated buffer size memory over write will happen! - void copy_to_buffer(const size_t in_buffer_size, char* out_buffer) - { - if (in_buffer_size > 0 && 0 != out_buffer) - { - char* cur_buffer = out_buffer; - const char* cur_fixed = m_begin; - const char* end_buffer = out_buffer + (WUMin<size_t>(in_buffer_size - 1, m_end - m_begin)); - while (cur_buffer < end_buffer) - *cur_buffer++ = *cur_fixed++; - - *cur_buffer = '\0'; - } - } - -protected: - ~WCFixedStringBase() {} - - char* const m_begin; - const size_t m_MaxFixedStringLength; - char* m_end; - -private: - WCFixedStringBase(); - WCFixedStringBase(const WCFixedStringBase& in_fixedStrToCopy); -#if 0 - : - m_begin(in_fixedStrToCopy.m_begin), - m_MaxFixedStringLength(in_fixedStrToCopy.m_MaxFixedStringLength), - m_end(in_fixedStrToCopy.m_end) - { - } -#endif -}; - -template<size_t kMaxFixedStringLength> class DllExport WCFixedString : public WCFixedStringBase -{ -public: - - inline WCFixedString() : - WCFixedStringBase(m_fixedString, kMaxFixedStringLength) - { - } - - inline WCFixedString(const char* const in_strToAssign) : - WCFixedStringBase(m_fixedString, kMaxFixedStringLength) - { - operator<<(in_strToAssign); - } - - inline WCFixedString(const WCFixedStringBase& in_fixedStrToAssign) : - WCFixedStringBase(m_fixedString, kMaxFixedStringLength) - { - operator<<(in_fixedStrToAssign); - } - - inline WCFixedString(const WCFixedString& in_fixedStrToAssign) : - WCFixedStringBase(m_fixedString, kMaxFixedStringLength) - { - operator<<(in_fixedStrToAssign); - } - - inline WCFixedString(const char in_char, const size_t in_count = 1) : - WCFixedStringBase(m_fixedString, kMaxFixedStringLength) - { - append(in_char, in_count); - } - - inline WCFixedString(const char* in_chars, const size_t in_count) : - WCFixedStringBase(m_fixedString, kMaxFixedStringLength) - { - append(in_chars, in_count); - } - - // substr now supports negative in_length, which means "from the end" so - // "abcdefg".substr(1, -1) == "bcdef" - inline const WCFixedString substr(const pos_t in_pos = 0, const spos_t in_length = kMaxFixedStringLength) const - { - pos_t adjusted_pos = WUMin<size_t>(in_pos, size()); - size_t adjusted_length = 0; - if (in_length < 0) - { - adjusted_length = size_t(WUMax<spos_t>(0, spos_t(size() - adjusted_pos) + in_length)); - } - else - adjusted_length = WUMin<size_t>(in_length, size() - adjusted_pos); - - WCFixedString retVal; - retVal.append(m_begin + adjusted_pos, adjusted_length); - - return retVal; - } - -protected: - - char m_fixedString[kMaxFixedStringLength + 1]; // the "+ 1" is so that *m_end is always valid, and we can put the '\0' there}; -}; - -inline bool operator==(const WCFixedStringBase& in_left, const WCFixedStringBase& in_right) -{ - return 0 == in_left.compare(in_right.c_str()); -} - -inline bool operator==(const WCFixedStringBase& in_left, const char* const in_right) -{ - return 0 == in_left.compare(in_right); -} - -inline bool operator!=(const WCFixedStringBase& in_left, const WCFixedStringBase& in_right) -{ - return 0 != in_left.compare(in_right.c_str()); -} - -inline bool operator!=(const WCFixedStringBase& in_left, const char* const in_right) -{ - return 0 != in_left.compare(in_right); -} - -// class WCFixedStringBase -typedef WCFixedString<4> WCFixedString4; -typedef WCFixedString<15> WCFixedString15; -typedef WCFixedString<31> WCFixedString31; -typedef WCFixedString<63> WCFixedString63; -typedef WCFixedString<127> WCFixedString127; -typedef WCFixedString<255> WCFixedString255; -typedef WCFixedString<511> WCFixedString511; -typedef WCFixedString<1023> WCFixedString1023; -typedef WCFixedString<2047> WCFixedString2047; - -template<size_t kSizeOfFirst, size_t kSizeOfSecond> - class WCFixedStringPair : public std::pair< WCFixedString<kSizeOfFirst>, WCFixedString<kSizeOfSecond> > -{ -public: - WCFixedStringPair(const char* const in_firstStr = 0, const char* const in_secondStr = 0) : - std::pair< WCFixedString<kSizeOfFirst>, WCFixedString<kSizeOfSecond> >(in_firstStr, in_secondStr) {} - WCFixedStringPair(const WCFixedStringBase& in_firstStr, const char* const in_secondStr = 0) : - std::pair< WCFixedString<kSizeOfFirst>, WCFixedString<kSizeOfSecond> >(in_firstStr, in_secondStr) {} - WCFixedStringPair(const WCFixedStringBase& in_firstStr, const WCFixedStringBase& in_secondStr) : - std::pair< WCFixedString<kSizeOfFirst>, WCFixedString<kSizeOfSecond> >(in_firstStr, in_secondStr) {} -}; - -#endif // #ifndef __WCFixedString_h__ |