summaryrefslogtreecommitdiffstats
path: root/source/core/slang-string.h
diff options
context:
space:
mode:
authorTim Foley <tfoley@nvidia.com>2017-06-15 13:24:25 -0700
committerTim Foley <tfoley@nvidia.com>2017-06-15 13:24:25 -0700
commit205187b561c3b31fa931e73e8f7263f0c4b1de41 (patch)
tree7bd2cd5ae3c14416b71ef8319ff02ace429d1132 /source/core/slang-string.h
parent517513645afb8eaf4841e7b7035f1ba3a9c7cd57 (diff)
Rename `CoreLib::*` to `Slang`
Getting rid of more namespace complexity and stripping things down to the basics. This also gets rid of some dead code in the "core" library.
Diffstat (limited to 'source/core/slang-string.h')
-rw-r--r--source/core/slang-string.h1287
1 files changed, 642 insertions, 645 deletions
diff --git a/source/core/slang-string.h b/source/core/slang-string.h
index 3eb99e8e3..80eb00605 100644
--- a/source/core/slang-string.h
+++ b/source/core/slang-string.h
@@ -8,733 +8,730 @@
#include "hash.h"
#include "secure-crt.h"
-namespace CoreLib
+namespace Slang
{
- namespace Basic
+ class _EndLine
+ {};
+ extern _EndLine EndLine;
+
+ // in-place reversion, works only for ascii string
+ inline void ReverseInternalAscii(char * buffer, int length)
+ {
+ int i, j;
+ char c;
+ for (i = 0, j = length - 1; i<j; i++, j--)
+ {
+ c = buffer[i];
+ buffer[i] = buffer[j];
+ buffer[j] = c;
+ }
+ }
+ template<typename IntType>
+ inline int IntToAscii(char * buffer, IntType val, int radix)
+ {
+ int i = 0;
+ IntType sign;
+ sign = val;
+ if (sign < 0)
+ val = (IntType)(0 - val);
+ do
+ {
+ int digit = (val % radix);
+ if (digit <= 9)
+ buffer[i++] = (char)(digit + '0');
+ else
+ buffer[i++] = (char)(digit - 10 + 'A');
+ } while ((val /= radix) > 0);
+ if (sign < 0)
+ buffer[i++] = '-';
+ buffer[i] = '\0';
+ return i;
+ }
+
+ inline bool IsUtf8LeadingByte(char ch)
+ {
+ return (((unsigned char)ch) & 0xC0) == 0xC0;
+ }
+
+ inline bool IsUtf8ContinuationByte(char ch)
{
- class _EndLine
- {};
- extern _EndLine EndLine;
+ return (((unsigned char)ch) & 0xC0) == 0x80;
+ }
+
+ /*!
+ @brief Represents a UTF-8 encoded string.
+ */
- // in-place reversion, works only for ascii string
- inline void ReverseInternalAscii(char * buffer, int length)
+ class String
+ {
+ friend class StringBuilder;
+ private:
+ RefPtr<char, RefPtrArrayDestructor> buffer;
+ wchar_t * wcharBuffer = nullptr;
+ int length = 0;
+ void Free()
{
- int i, j;
- char c;
- for (i = 0, j = length - 1; i<j; i++, j--)
- {
- c = buffer[i];
- buffer[i] = buffer[j];
- buffer[j] = c;
- }
+ if (buffer)
+ buffer = 0;
+ if (wcharBuffer)
+ delete[] wcharBuffer;
+ buffer = 0;
+ wcharBuffer = 0;
+ length = 0;
}
- template<typename IntType>
- inline int IntToAscii(char * buffer, IntType val, int radix)
+ public:
+ static String FromBuffer(RefPtr<char, RefPtrArrayDestructor> buffer, int len)
{
- int i = 0;
- IntType sign;
- sign = val;
- if (sign < 0)
- val = (IntType)(0 - val);
- do
- {
- int digit = (val % radix);
- if (digit <= 9)
- buffer[i++] = (char)(digit + '0');
- else
- buffer[i++] = (char)(digit - 10 + 'A');
- } while ((val /= radix) > 0);
- if (sign < 0)
- buffer[i++] = '-';
- buffer[i] = '\0';
- return i;
+ String rs;
+ rs.buffer = buffer;
+ rs.length = len;
+ return rs;
}
-
- inline bool IsUtf8LeadingByte(char ch)
+ static String FromWString(const wchar_t * wstr);
+ static String FromWString(const wchar_t * wstr, const wchar_t * wend);
+ static String FromWChar(const wchar_t ch);
+ static String FromUnicodePoint(unsigned int codePoint);
+ String()
{
- return (((unsigned char)ch) & 0xC0) == 0xC0;
}
-
- inline bool IsUtf8ContinuationByte(char ch)
+ const char * begin() const
{
- return (((unsigned char)ch) & 0xC0) == 0x80;
+ return buffer.Ptr();
}
-
- /*!
- @brief Represents a UTF-8 encoded string.
- */
-
- class String
+ const char * end() const
{
- friend class StringBuilder;
- private:
- RefPtr<char, RefPtrArrayDestructor> buffer;
- wchar_t * wcharBuffer = nullptr;
- int length = 0;
- void Free()
- {
- if (buffer)
- buffer = 0;
- if (wcharBuffer)
- delete[] wcharBuffer;
- buffer = 0;
- wcharBuffer = 0;
- length = 0;
- }
- public:
- static String FromBuffer(RefPtr<char, RefPtrArrayDestructor> buffer, int len)
- {
- String rs;
- rs.buffer = buffer;
- rs.length = len;
- return rs;
- }
- static String FromWString(const wchar_t * wstr);
- static String FromWString(const wchar_t * wstr, const wchar_t * wend);
- static String FromWChar(const wchar_t ch);
- static String FromUnicodePoint(unsigned int codePoint);
- String()
- {
- }
- const char * begin() const
- {
- return buffer.Ptr();
- }
- const char * end() const
- {
- return buffer.Ptr() + length;
- }
- String(int val, int radix = 10)
- {
- buffer = new char[33];
- length = IntToAscii(buffer.Ptr(), val, radix);
- ReverseInternalAscii(buffer.Ptr(), length);
- }
- String(unsigned int val, int radix = 10)
- {
- buffer = new char[33];
- length = IntToAscii(buffer.Ptr(), val, radix);
- ReverseInternalAscii(buffer.Ptr(), length);
- }
- String(long long val, int radix = 10)
- {
- buffer = new char[65];
- length = IntToAscii(buffer.Ptr(), val, radix);
- ReverseInternalAscii(buffer.Ptr(), length);
- }
- String(float val, const char * format = "%g")
- {
- buffer = new char[128];
- sprintf_s(buffer.Ptr(), 128, format, val);
- length = (int)strnlen_s(buffer.Ptr(), 128);
- }
- String(double val, const char * format = "%g")
- {
- buffer = new char[128];
- sprintf_s(buffer.Ptr(), 128, format, val);
- length = (int)strnlen_s(buffer.Ptr(), 128);
- }
- String(const char * str)
- {
- if (str)
- {
- length = (int)strlen(str);
- buffer = new char[length + 1];
- memcpy(buffer.Ptr(), str, length + 1);
- }
- }
- String(char chr)
- {
- if (chr)
- {
- length = 1;
- buffer = new char[2];
- buffer[0] = chr;
- buffer[1] = '\0';
- }
- }
- String(const String & str)
- {
- this->operator=(str);
- }
- String(String&& other)
+ return buffer.Ptr() + length;
+ }
+ String(int val, int radix = 10)
+ {
+ buffer = new char[33];
+ length = IntToAscii(buffer.Ptr(), val, radix);
+ ReverseInternalAscii(buffer.Ptr(), length);
+ }
+ String(unsigned int val, int radix = 10)
+ {
+ buffer = new char[33];
+ length = IntToAscii(buffer.Ptr(), val, radix);
+ ReverseInternalAscii(buffer.Ptr(), length);
+ }
+ String(long long val, int radix = 10)
+ {
+ buffer = new char[65];
+ length = IntToAscii(buffer.Ptr(), val, radix);
+ ReverseInternalAscii(buffer.Ptr(), length);
+ }
+ String(float val, const char * format = "%g")
+ {
+ buffer = new char[128];
+ sprintf_s(buffer.Ptr(), 128, format, val);
+ length = (int)strnlen_s(buffer.Ptr(), 128);
+ }
+ String(double val, const char * format = "%g")
+ {
+ buffer = new char[128];
+ sprintf_s(buffer.Ptr(), 128, format, val);
+ length = (int)strnlen_s(buffer.Ptr(), 128);
+ }
+ String(const char * str)
+ {
+ if (str)
{
- this->operator=(static_cast<String&&>(other));
+ length = (int)strlen(str);
+ buffer = new char[length + 1];
+ memcpy(buffer.Ptr(), str, length + 1);
}
- ~String()
+ }
+ String(char chr)
+ {
+ if (chr)
{
- Free();
+ length = 1;
+ buffer = new char[2];
+ buffer[0] = chr;
+ buffer[1] = '\0';
}
- String & operator=(const String & str)
- {
- if (str.buffer == buffer)
- return *this;
- Free();
- if (str.buffer)
- {
- length = str.length;
- buffer = str.buffer;
- wcharBuffer = 0;
- }
+ }
+ String(const String & str)
+ {
+ this->operator=(str);
+ }
+ String(String&& other)
+ {
+ this->operator=(static_cast<String&&>(other));
+ }
+ ~String()
+ {
+ Free();
+ }
+ String & operator=(const String & str)
+ {
+ if (str.buffer == buffer)
return *this;
- }
- String & operator=(String&& other)
+ Free();
+ if (str.buffer)
{
- if (this != &other)
- {
- Free();
- buffer = _Move(other.buffer);
- length = other.length;
- wcharBuffer = other.wcharBuffer;
- other.buffer = 0;
- other.length = 0;
- other.wcharBuffer = 0;
- }
- return *this;
+ length = str.length;
+ buffer = str.buffer;
+ wcharBuffer = 0;
}
- char operator[](int id) const
+ return *this;
+ }
+ String & operator=(String&& other)
+ {
+ if (this != &other)
{
+ Free();
+ buffer = _Move(other.buffer);
+ length = other.length;
+ wcharBuffer = other.wcharBuffer;
+ other.buffer = 0;
+ other.length = 0;
+ other.wcharBuffer = 0;
+ }
+ return *this;
+ }
+ char operator[](int id) const
+ {
#if _DEBUG
- if (id < 0 || id >= length)
- throw "Operator[]: index out of range.";
+ if (id < 0 || id >= length)
+ throw "Operator[]: index out of range.";
#endif
- return buffer.Ptr()[id];
- }
+ return buffer.Ptr()[id];
+ }
- friend String StringConcat(const char * lhs, int leftLen, const char * rhs, int rightLen);
- friend String operator+(const char*op1, const String & op2);
- friend String operator+(const String & op1, const char * op2);
- friend String operator+(const String & op1, const String & op2);
+ friend String StringConcat(const char * lhs, int leftLen, const char * rhs, int rightLen);
+ friend String operator+(const char*op1, const String & op2);
+ friend String operator+(const String & op1, const char * op2);
+ friend String operator+(const String & op1, const String & op2);
- String TrimStart() const
- {
- if (!buffer)
- return *this;
- int startIndex = 0;
- while (startIndex < length &&
- (buffer[startIndex] == ' ' || buffer[startIndex] == '\t' || buffer[startIndex] == '\r' || buffer[startIndex] == '\n'))
- startIndex++;
- return String(buffer + startIndex);
- }
+ String TrimStart() const
+ {
+ if (!buffer)
+ return *this;
+ int startIndex = 0;
+ while (startIndex < length &&
+ (buffer[startIndex] == ' ' || buffer[startIndex] == '\t' || buffer[startIndex] == '\r' || buffer[startIndex] == '\n'))
+ startIndex++;
+ return String(buffer + startIndex);
+ }
- String TrimEnd() const
- {
- if (!buffer)
- return *this;
-
- int endIndex = length - 1;
- while (endIndex >= 0 &&
- (buffer[endIndex] == ' ' || buffer[endIndex] == '\t' || buffer[endIndex] == '\r' || buffer[endIndex] == '\n'))
- endIndex--;
- String res;
- res.length = endIndex + 1;
- res.buffer = new char[endIndex + 2];
- strncpy_s(res.buffer.Ptr(), endIndex + 2, buffer.Ptr(), endIndex + 1);
- return res;
- }
+ String TrimEnd() const
+ {
+ if (!buffer)
+ return *this;
- String Trim() const
- {
- if (!buffer)
- return *this;
-
- int startIndex = 0;
- while (startIndex < length &&
- (buffer[startIndex] == ' ' || buffer[startIndex] == '\t'))
- startIndex++;
- int endIndex = length - 1;
- while (endIndex >= startIndex &&
- (buffer[endIndex] == ' ' || buffer[endIndex] == '\t'))
- endIndex--;
-
- String res;
- res.length = endIndex - startIndex + 1;
- res.buffer = new char[res.length + 1];
- memcpy(res.buffer.Ptr(), buffer + startIndex, res.length);
- res.buffer[res.length] = '\0';
- return res;
- }
+ int endIndex = length - 1;
+ while (endIndex >= 0 &&
+ (buffer[endIndex] == ' ' || buffer[endIndex] == '\t' || buffer[endIndex] == '\r' || buffer[endIndex] == '\n'))
+ endIndex--;
+ String res;
+ res.length = endIndex + 1;
+ res.buffer = new char[endIndex + 2];
+ strncpy_s(res.buffer.Ptr(), endIndex + 2, buffer.Ptr(), endIndex + 1);
+ return res;
+ }
- String SubString(int id, int len) const
- {
- if (len == 0)
- return "";
- if (id + len > length)
- len = length - id;
+ String Trim() const
+ {
+ if (!buffer)
+ return *this;
+
+ int startIndex = 0;
+ while (startIndex < length &&
+ (buffer[startIndex] == ' ' || buffer[startIndex] == '\t'))
+ startIndex++;
+ int endIndex = length - 1;
+ while (endIndex >= startIndex &&
+ (buffer[endIndex] == ' ' || buffer[endIndex] == '\t'))
+ endIndex--;
+
+ String res;
+ res.length = endIndex - startIndex + 1;
+ res.buffer = new char[res.length + 1];
+ memcpy(res.buffer.Ptr(), buffer + startIndex, res.length);
+ res.buffer[res.length] = '\0';
+ return res;
+ }
+
+ String SubString(int id, int len) const
+ {
+ if (len == 0)
+ return "";
+ if (id + len > length)
+ len = length - id;
#if _DEBUG
- if (id < 0 || id >= length || (id + len) > length)
- throw "SubString: index out of range.";
- if (len < 0)
- throw "SubString: length less than zero.";
+ if (id < 0 || id >= length || (id + len) > length)
+ throw "SubString: index out of range.";
+ if (len < 0)
+ throw "SubString: length less than zero.";
#endif
- String res;
- res.buffer = new char[len + 1];
- res.length = len;
- strncpy_s(res.buffer.Ptr(), len + 1, buffer + id, len);
- res.buffer[len] = 0;
- return res;
- }
+ String res;
+ res.buffer = new char[len + 1];
+ res.length = len;
+ strncpy_s(res.buffer.Ptr(), len + 1, buffer + id, len);
+ res.buffer[len] = 0;
+ return res;
+ }
- const char * Buffer() const
- {
- if (buffer)
- return buffer.Ptr();
- else
- return "";
- }
+ const char * Buffer() const
+ {
+ if (buffer)
+ return buffer.Ptr();
+ else
+ return "";
+ }
- const wchar_t * ToWString(int * len = 0) const;
+ const wchar_t * ToWString(int * len = 0) const;
- bool Equals(const String & str, bool caseSensitive = true)
+ bool Equals(const String & str, bool caseSensitive = true)
+ {
+ if (!buffer)
+ return (str.buffer == 0);
+ if (caseSensitive)
+ return (strcmp(buffer.Ptr(), str.buffer.Ptr()) == 0);
+ else
{
- if (!buffer)
- return (str.buffer == 0);
- if (caseSensitive)
- return (strcmp(buffer.Ptr(), str.buffer.Ptr()) == 0);
- else
- {
#ifdef _MSC_VER
- return (_stricmp(buffer.Ptr(), str.buffer.Ptr()) == 0);
+ return (_stricmp(buffer.Ptr(), str.buffer.Ptr()) == 0);
#else
- return (strcasecmp(buffer.Ptr(), str.buffer.Ptr()) == 0);
+ return (strcasecmp(buffer.Ptr(), str.buffer.Ptr()) == 0);
#endif
- }
- }
- bool operator==(const char * strbuffer) const
- {
- if (!buffer)
- return (strbuffer == 0 || strcmp(strbuffer, "") == 0);
- if (!strbuffer)
- return buffer == nullptr || strcmp(buffer.Ptr(), "") == 0;
- return (strcmp(buffer.Ptr(), strbuffer) == 0);
}
+ }
+ bool operator==(const char * strbuffer) const
+ {
+ if (!buffer)
+ return (strbuffer == 0 || strcmp(strbuffer, "") == 0);
+ if (!strbuffer)
+ return buffer == nullptr || strcmp(buffer.Ptr(), "") == 0;
+ return (strcmp(buffer.Ptr(), strbuffer) == 0);
+ }
- bool operator==(const String & str) const
- {
- if (!buffer)
- return (str.buffer == 0 || strcmp(str.buffer.Ptr(), "") == 0);
- if (!str.buffer)
- return buffer == nullptr || strcmp(buffer.Ptr(), "") == 0;
- return (strcmp(buffer.Ptr(), str.buffer.Ptr()) == 0);
- }
- bool operator!=(const char * strbuffer) const
- {
- if (!buffer)
- return (strbuffer != 0 && strcmp(strbuffer, "") != 0);
- if (strbuffer == 0)
- return length != 0;
- return (strcmp(buffer.Ptr(), strbuffer) != 0);
- }
- bool operator!=(const String & str) const
- {
- if (!buffer)
- return (str.buffer != 0 && strcmp(str.buffer.Ptr(), "") != 0);
- if (str.buffer.Ptr() == 0)
- return length != 0;
- return (strcmp(buffer.Ptr(), str.buffer.Ptr()) != 0);
- }
- bool operator>(const String & str) const
- {
- if (!buffer)
- return false;
- if (!str.buffer)
- return buffer.Ptr() != nullptr && length != 0;
- return (strcmp(buffer.Ptr(), str.buffer.Ptr()) > 0);
- }
- bool operator<(const String & str) const
- {
- if (!buffer)
- return (str.buffer != 0);
- if (!str.buffer)
- return false;
- return (strcmp(buffer.Ptr(), str.buffer.Ptr()) < 0);
- }
- bool operator>=(const String & str) const
- {
- if (!buffer)
- return (str.buffer == 0);
- if (!str.buffer)
- return length == 0;
- int res = strcmp(buffer.Ptr(), str.buffer.Ptr());
- return (res > 0 || res == 0);
- }
- bool operator<=(const String & str) const
- {
- if (!buffer)
- return true;
- if (!str.buffer)
- return length > 0;
- int res = strcmp(buffer.Ptr(), str.buffer.Ptr());
- return (res < 0 || res == 0);
- }
+ bool operator==(const String & str) const
+ {
+ if (!buffer)
+ return (str.buffer == 0 || strcmp(str.buffer.Ptr(), "") == 0);
+ if (!str.buffer)
+ return buffer == nullptr || strcmp(buffer.Ptr(), "") == 0;
+ return (strcmp(buffer.Ptr(), str.buffer.Ptr()) == 0);
+ }
+ bool operator!=(const char * strbuffer) const
+ {
+ if (!buffer)
+ return (strbuffer != 0 && strcmp(strbuffer, "") != 0);
+ if (strbuffer == 0)
+ return length != 0;
+ return (strcmp(buffer.Ptr(), strbuffer) != 0);
+ }
+ bool operator!=(const String & str) const
+ {
+ if (!buffer)
+ return (str.buffer != 0 && strcmp(str.buffer.Ptr(), "") != 0);
+ if (str.buffer.Ptr() == 0)
+ return length != 0;
+ return (strcmp(buffer.Ptr(), str.buffer.Ptr()) != 0);
+ }
+ bool operator>(const String & str) const
+ {
+ if (!buffer)
+ return false;
+ if (!str.buffer)
+ return buffer.Ptr() != nullptr && length != 0;
+ return (strcmp(buffer.Ptr(), str.buffer.Ptr()) > 0);
+ }
+ bool operator<(const String & str) const
+ {
+ if (!buffer)
+ return (str.buffer != 0);
+ if (!str.buffer)
+ return false;
+ return (strcmp(buffer.Ptr(), str.buffer.Ptr()) < 0);
+ }
+ bool operator>=(const String & str) const
+ {
+ if (!buffer)
+ return (str.buffer == 0);
+ if (!str.buffer)
+ return length == 0;
+ int res = strcmp(buffer.Ptr(), str.buffer.Ptr());
+ return (res > 0 || res == 0);
+ }
+ bool operator<=(const String & str) const
+ {
+ if (!buffer)
+ return true;
+ if (!str.buffer)
+ return length > 0;
+ int res = strcmp(buffer.Ptr(), str.buffer.Ptr());
+ return (res < 0 || res == 0);
+ }
- String ToUpper() const
- {
- if (!buffer)
- return *this;
- String res;
- res.length = length;
- res.buffer = new char[length + 1];
- for (int i = 0; i <= length; i++)
- res.buffer[i] = (buffer[i] >= 'a' && buffer[i] <= 'z') ?
- (buffer[i] - 'a' + 'A') : buffer[i];
- return res;
- }
+ String ToUpper() const
+ {
+ if (!buffer)
+ return *this;
+ String res;
+ res.length = length;
+ res.buffer = new char[length + 1];
+ for (int i = 0; i <= length; i++)
+ res.buffer[i] = (buffer[i] >= 'a' && buffer[i] <= 'z') ?
+ (buffer[i] - 'a' + 'A') : buffer[i];
+ return res;
+ }
- String ToLower() const
- {
- if (!buffer)
- return *this;
- String res;
- res.length = length;
- res.buffer = new char[length + 1];
- for (int i = 0; i <= length; i++)
- res.buffer[i] = (buffer[i] >= 'A' && buffer[i] <= 'Z') ?
- (buffer[i] - 'A' + 'a') : buffer[i];
- return res;
- }
+ String ToLower() const
+ {
+ if (!buffer)
+ return *this;
+ String res;
+ res.length = length;
+ res.buffer = new char[length + 1];
+ for (int i = 0; i <= length; i++)
+ res.buffer[i] = (buffer[i] >= 'A' && buffer[i] <= 'Z') ?
+ (buffer[i] - 'A' + 'a') : buffer[i];
+ return res;
+ }
- int Length() const
- {
- return length;
- }
+ int Length() const
+ {
+ return length;
+ }
- int IndexOf(const char * str, int id) const // String str
- {
- if (!buffer)
- return -1;
- if (id < 0 || id >= length)
- return -1;
- auto findRs = strstr(buffer + id, str);
- int res = findRs ? (int)(findRs - buffer.Ptr()) : -1;
- if (res >= 0)
- return res;
- else
- return -1;
- }
+ int IndexOf(const char * str, int id) const // String str
+ {
+ if (!buffer)
+ return -1;
+ if (id < 0 || id >= length)
+ return -1;
+ auto findRs = strstr(buffer + id, str);
+ int res = findRs ? (int)(findRs - buffer.Ptr()) : -1;
+ if (res >= 0)
+ return res;
+ else
+ return -1;
+ }
- int IndexOf(const String & str, int id) const
- {
- return IndexOf(str.buffer.Ptr(), id);
- }
+ int IndexOf(const String & str, int id) const
+ {
+ return IndexOf(str.buffer.Ptr(), id);
+ }
- int IndexOf(const char * str) const
- {
- return IndexOf(str, 0);
- }
+ int IndexOf(const char * str) const
+ {
+ return IndexOf(str, 0);
+ }
- int IndexOf(const String & str) const
- {
- return IndexOf(str.buffer.Ptr(), 0);
- }
+ int IndexOf(const String & str) const
+ {
+ return IndexOf(str.buffer.Ptr(), 0);
+ }
- int IndexOf(char ch, int id) const
- {
+ int IndexOf(char ch, int id) const
+ {
#if _DEBUG
- if (id < 0 || id >= length)
- throw "SubString: index out of range.";
+ if (id < 0 || id >= length)
+ throw "SubString: index out of range.";
#endif
- if (!buffer)
- return -1;
- for (int i = id; i < length; i++)
- if (buffer[i] == ch)
- return i;
+ if (!buffer)
return -1;
- }
+ for (int i = id; i < length; i++)
+ if (buffer[i] == ch)
+ return i;
+ return -1;
+ }
- int IndexOf(char ch) const
- {
- return IndexOf(ch, 0);
- }
+ int IndexOf(char ch) const
+ {
+ return IndexOf(ch, 0);
+ }
- int LastIndexOf(char ch) const
- {
- for (int i = length - 1; i >= 0; i--)
- if (buffer[i] == ch)
- return i;
- return -1;
- }
+ int LastIndexOf(char ch) const
+ {
+ for (int i = length - 1; i >= 0; i--)
+ if (buffer[i] == ch)
+ return i;
+ return -1;
+ }
- bool StartsWith(const char * str) const // String str
- {
- if (!buffer)
- return false;
- int strLen = (int)strlen(str);
- if (strLen > length)
+ bool StartsWith(const char * str) const // String str
+ {
+ if (!buffer)
+ return false;
+ int strLen = (int)strlen(str);
+ if (strLen > length)
+ return false;
+ for (int i = 0; i < strLen; i++)
+ if (str[i] != buffer[i])
return false;
- for (int i = 0; i < strLen; i++)
- if (str[i] != buffer[i])
- return false;
- return true;
- }
+ return true;
+ }
- bool StartsWith(const String & str) const
- {
- return StartsWith(str.buffer.Ptr());
- }
+ bool StartsWith(const String & str) const
+ {
+ return StartsWith(str.buffer.Ptr());
+ }
- bool EndsWith(char * str) const // String str
- {
- if (!buffer)
- return false;
- int strLen = (int)strlen(str);
- if (strLen > length)
+ bool EndsWith(char * str) const // String str
+ {
+ if (!buffer)
+ return false;
+ int strLen = (int)strlen(str);
+ if (strLen > length)
+ return false;
+ for (int i = strLen - 1; i >= 0; i--)
+ if (str[i] != buffer[length - strLen + i])
return false;
- for (int i = strLen - 1; i >= 0; i--)
- if (str[i] != buffer[length - strLen + i])
- return false;
- return true;
- }
+ return true;
+ }
- bool EndsWith(const String & str) const
- {
- return EndsWith(str.buffer.Ptr());
- }
+ bool EndsWith(const String & str) const
+ {
+ return EndsWith(str.buffer.Ptr());
+ }
- bool Contains(const char * str) const // String str
- {
- if (!buffer)
- return false;
- return (IndexOf(str) >= 0) ? true : false;
- }
+ bool Contains(const char * str) const // String str
+ {
+ if (!buffer)
+ return false;
+ return (IndexOf(str) >= 0) ? true : false;
+ }
- bool Contains(const String & str) const
- {
- return Contains(str.buffer.Ptr());
- }
+ bool Contains(const String & str) const
+ {
+ return Contains(str.buffer.Ptr());
+ }
- int GetHashCode() const
- {
- return CoreLib::Basic::GetHashCode((const char*)buffer.Ptr());
- }
- String PadLeft(char ch, int length);
- String PadRight(char ch, int length);
- String ReplaceAll(String src, String dst) const;
- };
-
- class StringBuilder
- {
- private:
- char * buffer;
- int length;
- int bufferSize;
- static const int InitialSize = 512;
- public:
- StringBuilder(int bufferSize = 1024)
- :buffer(0), length(0), bufferSize(0)
- {
- buffer = new char[InitialSize]; // new a larger buffer
- buffer[0] = '\0';
- length = 0;
- bufferSize = InitialSize;
- }
- ~StringBuilder()
+ int GetHashCode() const
+ {
+ return Slang::GetHashCode((const char*)buffer.Ptr());
+ }
+ String PadLeft(char ch, int length);
+ String PadRight(char ch, int length);
+ String ReplaceAll(String src, String dst) const;
+ };
+
+ class StringBuilder
+ {
+ private:
+ char * buffer;
+ int length;
+ int bufferSize;
+ static const int InitialSize = 512;
+ public:
+ StringBuilder(int bufferSize = 1024)
+ :buffer(0), length(0), bufferSize(0)
+ {
+ buffer = new char[InitialSize]; // new a larger buffer
+ buffer[0] = '\0';
+ length = 0;
+ bufferSize = InitialSize;
+ }
+ ~StringBuilder()
+ {
+ if (buffer)
+ delete[] buffer;
+ }
+ void EnsureCapacity(int size)
+ {
+ if (bufferSize < size)
{
+ char * newBuffer = new char[size + 1];
if (buffer)
- delete[] buffer;
- }
- void EnsureCapacity(int size)
- {
- if (bufferSize < size)
{
- char * newBuffer = new char[size + 1];
- if (buffer)
- {
- strcpy_s(newBuffer, size + 1, buffer);
- delete[] buffer;
- }
- buffer = newBuffer;
- bufferSize = size;
+ strcpy_s(newBuffer, size + 1, buffer);
+ delete[] buffer;
}
+ buffer = newBuffer;
+ bufferSize = size;
}
- StringBuilder & operator << (char ch)
- {
- Append(&ch, 1);
- return *this;
- }
- StringBuilder & operator << (int val)
- {
- Append(val);
- return *this;
- }
- StringBuilder & operator << (unsigned int val)
- {
- Append(val);
- return *this;
- }
- StringBuilder & operator << (long long val)
- {
- Append(val);
- return *this;
- }
- StringBuilder & operator << (float val)
- {
- Append(val);
- return *this;
- }
- StringBuilder & operator << (double val)
- {
- Append(val);
- return *this;
- }
- StringBuilder & operator << (const char * str)
- {
- Append(str, (int)strlen(str));
- return *this;
- }
- StringBuilder & operator << (const String & str)
- {
- Append(str);
- return *this;
- }
- StringBuilder & operator << (const _EndLine)
- {
- Append('\n');
- return *this;
- }
- void Append(char ch)
- {
- Append(&ch, 1);
- }
- void Append(float val)
- {
- char buf[128];
- sprintf_s(buf, 128, "%g", val);
- int len = (int)strnlen_s(buf, 128);
- Append(buf, len);
- }
- void Append(double val)
- {
- char buf[128];
- sprintf_s(buf, 128, "%g", val);
- int len = (int)strnlen_s(buf, 128);
- Append(buf, len);
- }
- void Append(unsigned int value, int radix = 10)
- {
- char vBuffer[33];
- int len = IntToAscii(vBuffer, value, radix);
- ReverseInternalAscii(vBuffer, len);
- Append(vBuffer);
- }
- void Append(int value, int radix = 10)
- {
- char vBuffer[33];
- int len = IntToAscii(vBuffer, value, radix);
- ReverseInternalAscii(vBuffer, len);
- Append(vBuffer);
- }
- void Append(long long value, int radix = 10)
- {
- char vBuffer[65];
- int len = IntToAscii(vBuffer, value, radix);
- ReverseInternalAscii(vBuffer, len);
- Append(vBuffer);
- }
- void Append(const String & str)
- {
- Append(str.Buffer(), str.Length());
- }
- void Append(const char * str)
- {
- Append(str, (int)strlen(str));
- }
- void Append(const char * str, int strLen)
+ }
+ StringBuilder & operator << (char ch)
+ {
+ Append(&ch, 1);
+ return *this;
+ }
+ StringBuilder & operator << (int val)
+ {
+ Append(val);
+ return *this;
+ }
+ StringBuilder & operator << (unsigned int val)
+ {
+ Append(val);
+ return *this;
+ }
+ StringBuilder & operator << (long long val)
+ {
+ Append(val);
+ return *this;
+ }
+ StringBuilder & operator << (float val)
+ {
+ Append(val);
+ return *this;
+ }
+ StringBuilder & operator << (double val)
+ {
+ Append(val);
+ return *this;
+ }
+ StringBuilder & operator << (const char * str)
+ {
+ Append(str, (int)strlen(str));
+ return *this;
+ }
+ StringBuilder & operator << (const String & str)
+ {
+ Append(str);
+ return *this;
+ }
+ StringBuilder & operator << (const _EndLine)
+ {
+ Append('\n');
+ return *this;
+ }
+ void Append(char ch)
+ {
+ Append(&ch, 1);
+ }
+ void Append(float val)
+ {
+ char buf[128];
+ sprintf_s(buf, 128, "%g", val);
+ int len = (int)strnlen_s(buf, 128);
+ Append(buf, len);
+ }
+ void Append(double val)
+ {
+ char buf[128];
+ sprintf_s(buf, 128, "%g", val);
+ int len = (int)strnlen_s(buf, 128);
+ Append(buf, len);
+ }
+ void Append(unsigned int value, int radix = 10)
+ {
+ char vBuffer[33];
+ int len = IntToAscii(vBuffer, value, radix);
+ ReverseInternalAscii(vBuffer, len);
+ Append(vBuffer);
+ }
+ void Append(int value, int radix = 10)
+ {
+ char vBuffer[33];
+ int len = IntToAscii(vBuffer, value, radix);
+ ReverseInternalAscii(vBuffer, len);
+ Append(vBuffer);
+ }
+ void Append(long long value, int radix = 10)
+ {
+ char vBuffer[65];
+ int len = IntToAscii(vBuffer, value, radix);
+ ReverseInternalAscii(vBuffer, len);
+ Append(vBuffer);
+ }
+ void Append(const String & str)
+ {
+ Append(str.Buffer(), str.Length());
+ }
+ void Append(const char * str)
+ {
+ Append(str, (int)strlen(str));
+ }
+ void Append(const char * str, int strLen)
+ {
+ int newLength = length + strLen;
+ if (bufferSize < newLength + 1)
{
- int newLength = length + strLen;
- if (bufferSize < newLength + 1)
- {
- int newBufferSize = InitialSize;
- while (newBufferSize < newLength + 1)
- newBufferSize <<= 1;
- char * newBuffer = new char[newBufferSize];
- if (buffer)
- {
- memcpy(newBuffer, buffer, length);
- delete[] buffer;
- }
- memcpy(newBuffer + length, str, strLen);
- newBuffer[newLength] = '\0';
- buffer = newBuffer;
- bufferSize = newBufferSize;
- }
- else
+ int newBufferSize = InitialSize;
+ while (newBufferSize < newLength + 1)
+ newBufferSize <<= 1;
+ char * newBuffer = new char[newBufferSize];
+ if (buffer)
{
- memcpy(buffer + length, str, strLen);
- buffer[newLength] = '\0';
+ memcpy(newBuffer, buffer, length);
+ delete[] buffer;
}
- length = newLength;
+ memcpy(newBuffer + length, str, strLen);
+ newBuffer[newLength] = '\0';
+ buffer = newBuffer;
+ bufferSize = newBufferSize;
}
-
- int Capacity()
+ else
{
- return bufferSize;
+ memcpy(buffer + length, str, strLen);
+ buffer[newLength] = '\0';
}
+ length = newLength;
+ }
- char * Buffer()
- {
- return buffer;
- }
+ int Capacity()
+ {
+ return bufferSize;
+ }
- int Length()
- {
- return length;
- }
+ char * Buffer()
+ {
+ return buffer;
+ }
- String ToString()
- {
- return String(buffer);
- }
+ int Length()
+ {
+ return length;
+ }
- String ProduceString()
- {
- String rs;
- rs.buffer = buffer;
- rs.length = length;
- buffer = 0;
- bufferSize = 0;
- length = 0;
- return rs;
+ String ToString()
+ {
+ return String(buffer);
+ }
- }
+ String ProduceString()
+ {
+ String rs;
+ rs.buffer = buffer;
+ rs.length = length;
+ buffer = 0;
+ bufferSize = 0;
+ length = 0;
+ return rs;
- String GetSubString(int start, int count)
- {
- String rs;
- rs.buffer = new char[count + 1];
- rs.length = count;
- strncpy_s(rs.buffer.Ptr(), count + 1, buffer + start, count);
- rs.buffer[count] = 0;
- return rs;
- }
+ }
- void Remove(int id, int len)
- {
+ String GetSubString(int start, int count)
+ {
+ String rs;
+ rs.buffer = new char[count + 1];
+ rs.length = count;
+ strncpy_s(rs.buffer.Ptr(), count + 1, buffer + start, count);
+ rs.buffer[count] = 0;
+ return rs;
+ }
+
+ void Remove(int id, int len)
+ {
#if _DEBUG
- if (id >= length || id < 0)
- throw "Remove: Index out of range.";
- if (len < 0)
- throw "Remove: remove length smaller than zero.";
+ if (id >= length || id < 0)
+ throw "Remove: Index out of range.";
+ if (len < 0)
+ throw "Remove: remove length smaller than zero.";
#endif
- int actualDelLength = ((id + len) >= length) ? (length - id) : len;
- for (int i = id + actualDelLength; i <= length; i++)
- buffer[i - actualDelLength] = buffer[i];
- length -= actualDelLength;
- }
+ int actualDelLength = ((id + len) >= length) ? (length - id) : len;
+ for (int i = id + actualDelLength; i <= length; i++)
+ buffer[i - actualDelLength] = buffer[i];
+ length -= actualDelLength;
+ }
- void Clear()
- {
- length = 0;
- if (buffer)
- buffer[0] = 0;
- }
- };
+ void Clear()
+ {
+ length = 0;
+ if (buffer)
+ buffer[0] = 0;
+ }
+ };
- int StringToInt(const String & str, int radix = 10);
- unsigned int StringToUInt(const String & str, int radix = 10);
- double StringToDouble(const String & str);
- float StringToFloat(const String & str);
- }
+ int StringToInt(const String & str, int radix = 10);
+ unsigned int StringToUInt(const String & str, int radix = 10);
+ double StringToDouble(const String & str);
+ float StringToFloat(const String & str);
}
#endif