From e5b3502b03bdbdbecbd2e8b328e0f874499b452b Mon Sep 17 00:00:00 2001 From: crupest Date: Wed, 15 Sep 2021 21:54:06 +0800 Subject: ... --- include/cru/common/String.hpp | 61 +++++++++++++++++++++++-------------------- 1 file changed, 32 insertions(+), 29 deletions(-) (limited to 'include/cru/common') diff --git a/include/cru/common/String.hpp b/include/cru/common/String.hpp index ed3deb4c..f407cb60 100644 --- a/include/cru/common/String.hpp +++ b/include/cru/common/String.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -21,20 +22,36 @@ class StringView; class CRU_BASE_API String { public: + using value_type = std::uint16_t; + using size_type = Index; + using difference_type = Index; + using reference = std::uint16_t&; + using const_reference = const std::uint16_t&; + using pointer = std::uint16_t*; + using const_pointer = const std::uint16_t*; + using iterator = std::uint16_t*; + using const_iterator = const std::uint16_t*; + using reverse_iterator = std::reverse_iterator; + using const_reverse_iterator = std::reverse_iterator; + + public: + static String FromUtf8(const char* str); + static String FromUtf8(const char* str, Index size); static String FromUtf8(std::string_view str) { return FromUtf8(str.data(), str.size()); } - static String FromUtf8(const char* str, Index size); - static String FromUtf16(const std::uint16_t* str) { return String(str); } - static String FromUtf16(const std::uint16_t* str, Index size) { - return String(str, size); + static String FromUtf16(const char16_t* str) { + return String(reinterpret_cast(str)); } - - static String FromUtf16(const char16_t* str) { return String(str); } static String FromUtf16(const char16_t* str, Index size) { - return String(str, size); + return String(reinterpret_cast(str), size); } + static String FromUtf16(std::u16string_view str) { + return FromUtf16(str.data(), str.size()); + } + + static inline String From(StringView str); // Never use this if you don't know what this mean! static String FromBuffer(std::uint16_t* buffer, Index size, Index capacity) { @@ -48,31 +65,15 @@ class CRU_BASE_API String { } #endif - public: - using value_type = std::uint16_t; - using size_type = Index; - using difference_type = Index; - using reference = std::uint16_t&; - using const_reference = const std::uint16_t&; - using pointer = std::uint16_t*; - using const_pointer = const std::uint16_t*; - using iterator = std::uint16_t*; - using const_iterator = const std::uint16_t*; - using reverse_iterator = std::reverse_iterator; - using const_reverse_iterator = std::reverse_iterator; - public: String() = default; - explicit String(const std::uint16_t* str); - String(const std::uint16_t* str, Index size); - - explicit String(const char16_t* str); - String(const char16_t* str, Index size); - String(const std::u16string_view& str) : String(str.data(), str.size()) {} + explicit String(const_pointer str); + String(const_pointer str, size_type size); template - constexpr String(const char16_t (&str)[size]) : String(str, size) {} + String(const char16_t (&str)[size]) + : String(reinterpret_cast(str), size) {} template String(Iter start, Iter end) { @@ -81,8 +82,7 @@ class CRU_BASE_API String { } } - String(const std::initializer_list& l) - : String(l.begin(), l.end()) {} + String(std::initializer_list l) : String(l.begin(), l.end()) {} #ifdef CRU_PLATFORM_WINDOWS String(const wchar_t* str); @@ -112,6 +112,7 @@ class CRU_BASE_API String { void resize(Index new_size); void reserve(Index new_capacity); + void shrink_to_fit(); std::uint16_t& front() { return this->operator[](0); } const std::uint16_t& front() const { return this->operator[](0); } @@ -369,6 +370,8 @@ inline String::iterator String::insert(const_iterator pos, StringView str) { inline void String::append(StringView str) { this->append(str.data(), str.size()); } + +inline String String::From(StringView str) { return str.ToString(); } } // namespace cru template <> -- cgit v1.2.3