diff options
author | chai <chaifix@163.com> | 2019-03-14 23:12:54 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2019-03-14 23:12:54 +0800 |
commit | 8644e03586ac9c39741f62cbcbce87b18805538c (patch) | |
tree | 72021765f5262b7f2f7eebe299fd4e1aaa7c89b7 /Source/Asura.Engine/text/string.cpp | |
parent | 8d8c4ff1664625e7428d0d31cd798d9321680cb2 (diff) |
*大小写
Diffstat (limited to 'Source/Asura.Engine/text/string.cpp')
-rw-r--r-- | Source/Asura.Engine/text/string.cpp | 376 |
1 files changed, 376 insertions, 0 deletions
diff --git a/Source/Asura.Engine/text/string.cpp b/Source/Asura.Engine/text/string.cpp new file mode 100644 index 0000000..8c9c55a --- /dev/null +++ b/Source/Asura.Engine/text/string.cpp @@ -0,0 +1,376 @@ +#include "String.hpp" +#include "Utf.hpp" + +namespace AsuraEngine +{ + namespace Text + { + + + //////////////////////////////////////////////////////////// + const std::size_t String::InvalidPos = std::basic_string<uint32>::npos; + + + //////////////////////////////////////////////////////////// + String::String() + { + } + + + //////////////////////////////////////////////////////////// + String::String(char ansiChar, const std::locale& locale) + { + mString += Utf32::DecodeAnsi(ansiChar, locale); + } + + + //////////////////////////////////////////////////////////// + String::String(wchar_t wideChar) + { + mString += Utf32::DecodeWide(wideChar); + } + + + //////////////////////////////////////////////////////////// + String::String(uint32 utf32Char) + { + mString += utf32Char; + } + + + //////////////////////////////////////////////////////////// + String::String(const char* ansiString, const std::locale& locale) + { + if (ansiString) + { + std::size_t length = strlen(ansiString); + if (length > 0) + { + mString.reserve(length + 1); + Utf32::FromAnsi(ansiString, ansiString + length, std::back_inserter(mString), locale); + } + } + } + + + //////////////////////////////////////////////////////////// + String::String(const std::string& ansiString, const std::locale& locale) + { + mString.reserve(ansiString.length() + 1); + Utf32::FromAnsi(ansiString.begin(), ansiString.end(), std::back_inserter(mString), locale); + } + + + //////////////////////////////////////////////////////////// + String::String(const wchar_t* wideString) + { + if (wideString) + { + std::size_t length = std::wcslen(wideString); + if (length > 0) + { + mString.reserve(length + 1); + Utf32::FromWide(wideString, wideString + length, std::back_inserter(mString)); + } + } + } + + + //////////////////////////////////////////////////////////// + String::String(const std::wstring& wideString) + { + mString.reserve(wideString.length() + 1); + Utf32::FromWide(wideString.begin(), wideString.end(), std::back_inserter(mString)); + } + + + //////////////////////////////////////////////////////////// + String::String(const uint32* utf32String) + { + if (utf32String) + mString = utf32String; + } + + + //////////////////////////////////////////////////////////// + String::String(const std::basic_string<uint32>& utf32String) : + mString(utf32String) + { + } + + + //////////////////////////////////////////////////////////// + String::String(const String& copy) : + mString(copy.mString) + { + } + + + //////////////////////////////////////////////////////////// + String::operator std::string() const + { + return ToAnsiString(); + } + + + //////////////////////////////////////////////////////////// + String::operator std::wstring() const + { + return ToWideString(); + } + + + //////////////////////////////////////////////////////////// + std::string String::ToAnsiString(const std::locale& locale) const + { + // Prepare the output string + std::string output; + output.reserve(mString.length() + 1); + + // Convert + Utf32::ToAnsi(mString.begin(), mString.end(), std::back_inserter(output), 0, locale); + + return output; + } + + + //////////////////////////////////////////////////////////// + std::wstring String::ToWideString() const + { + // Prepare the output string + std::wstring output; + output.reserve(mString.length() + 1); + + // Convert + Utf32::ToWide(mString.begin(), mString.end(), std::back_inserter(output), 0); + + return output; + } + + + //////////////////////////////////////////////////////////// + std::basic_string<uint8> String::ToUtf8() const + { + // Prepare the output string + std::basic_string<uint8> output; + output.reserve(mString.length()); + + // Convert + Utf32::ToUtf8(mString.begin(), mString.end(), std::back_inserter(output)); + + return output; + } + + + //////////////////////////////////////////////////////////// + std::basic_string<uint16> String::ToUtf16() const + { + // Prepare the output string + std::basic_string<uint16> output; + output.reserve(mString.length()); + + // Convert + Utf32::ToUtf16(mString.begin(), mString.end(), std::back_inserter(output)); + + return output; + } + + + //////////////////////////////////////////////////////////// + std::basic_string<uint32> String::ToUtf32() const + { + return mString; + } + + + //////////////////////////////////////////////////////////// + String& String::operator =(const String& right) + { + mString = right.mString; + return *this; + } + + + //////////////////////////////////////////////////////////// + String& String::operator +=(const String& right) + { + mString += right.mString; + return *this; + } + + + //////////////////////////////////////////////////////////// + uint32 String::operator [](std::size_t index) const + { + return mString[index]; + } + + + //////////////////////////////////////////////////////////// + uint32& String::operator [](std::size_t index) + { + return mString[index]; + } + + + //////////////////////////////////////////////////////////// + void String::Clear() + { + mString.clear(); + } + + + //////////////////////////////////////////////////////////// + std::size_t String::GetSize() const + { + return mString.size(); + } + + + //////////////////////////////////////////////////////////// + bool String::IsEmpty() const + { + return mString.empty(); + } + + + //////////////////////////////////////////////////////////// + void String::Erase(std::size_t position, std::size_t count) + { + mString.erase(position, count); + } + + + //////////////////////////////////////////////////////////// + void String::Insert(std::size_t position, const String& str) + { + mString.insert(position, str.mString); + } + + + //////////////////////////////////////////////////////////// + std::size_t String::Find(const String& str, std::size_t start) const + { + return mString.find(str.mString, start); + } + + + //////////////////////////////////////////////////////////// + void String::Replace(std::size_t position, std::size_t length, const String& replaceWith) + { + mString.replace(position, length, replaceWith.mString); + } + + + //////////////////////////////////////////////////////////// + void String::Replace(const String& searchFor, const String& replaceWith) + { + std::size_t step = replaceWith.GetSize(); + std::size_t len = searchFor.GetSize(); + std::size_t pos = Find(searchFor); + + // Replace each occurrence of search + while (pos != InvalidPos) + { + Replace(pos, len, replaceWith); + pos = Find(searchFor, pos + step); + } + } + + + //////////////////////////////////////////////////////////// + String String::Substring(std::size_t position, std::size_t length) const + { + return mString.substr(position, length); + } + + + //////////////////////////////////////////////////////////// + const uint32* String::GetData() const + { + return mString.c_str(); + } + + + //////////////////////////////////////////////////////////// + String::Iterator String::Begin() + { + return mString.begin(); + } + + + //////////////////////////////////////////////////////////// + String::ConstIterator String::Begin() const + { + return mString.begin(); + } + + + //////////////////////////////////////////////////////////// + String::Iterator String::End() + { + return mString.end(); + } + + + //////////////////////////////////////////////////////////// + String::ConstIterator String::End() const + { + return mString.end(); + } + + + //////////////////////////////////////////////////////////// + bool operator ==(const String& left, const String& right) + { + return left.mString == right.mString; + } + + + //////////////////////////////////////////////////////////// + bool operator !=(const String& left, const String& right) + { + return !(left == right); + } + + + //////////////////////////////////////////////////////////// + bool operator <(const String& left, const String& right) + { + return left.mString < right.mString; + } + + + //////////////////////////////////////////////////////////// + bool operator >(const String& left, const String& right) + { + return right < left; + } + + + //////////////////////////////////////////////////////////// + bool operator <=(const String& left, const String& right) + { + return !(right < left); + } + + + //////////////////////////////////////////////////////////// + bool operator >=(const String& left, const String& right) + { + return !(left < right); + } + + + //////////////////////////////////////////////////////////// + String operator +(const String& left, const String& right) + { + String string = left; + string += right; + + return string; + } + + + } +} |