diff options
Diffstat (limited to 'core/fxcrt/include/fx_string.h')
-rw-r--r-- | core/fxcrt/include/fx_string.h | 249 |
1 files changed, 7 insertions, 242 deletions
diff --git a/core/fxcrt/include/fx_string.h b/core/fxcrt/include/fx_string.h index 617e02ee5a..9019522eca 100644 --- a/core/fxcrt/include/fx_string.h +++ b/core/fxcrt/include/fx_string.h @@ -10,6 +10,7 @@ #include <stdint.h> // For intptr_t. #include <algorithm> +#include "core/fxcrt/cfx_string_c_template.h" #include "core/fxcrt/cfx_string_data_template.h" #include "core/fxcrt/include/cfx_retain_ptr.h" #include "core/fxcrt/include/fx_memory.h" @@ -18,134 +19,20 @@ class CFX_ByteString; class CFX_WideString; -// An immutable string with caller-provided storage which must outlive the -// string itself. These are not necessarily nul-terminated, so that substring -// extraction (via the Mid() method) is copy-free. -class CFX_ByteStringC { - public: - typedef FX_CHAR value_type; - - CFX_ByteStringC() { - m_Ptr = NULL; - m_Length = 0; - } - - CFX_ByteStringC(const uint8_t* ptr, FX_STRSIZE size) { - m_Ptr = ptr; - m_Length = size; - } - - // Deliberately implicit to avoid calling on every string literal. - CFX_ByteStringC(const FX_CHAR* ptr) { - m_Ptr = (const uint8_t*)ptr; - m_Length = ptr ? FXSYS_strlen(ptr) : 0; - } - - // Deliberately implicit to avoid calling on every string literal. - // |ch| must be an lvalue that outlives the the CFX_ByteStringC. - CFX_ByteStringC(FX_CHAR& ch) { - m_Ptr = (const uint8_t*)&ch; - m_Length = 1; - } - - CFX_ByteStringC(const FX_CHAR* ptr, FX_STRSIZE len) { - m_Ptr = (const uint8_t*)ptr; - m_Length = (len == -1) ? FXSYS_strlen(ptr) : len; - } - - CFX_ByteStringC(const CFX_ByteStringC& src) { - m_Ptr = src.m_Ptr; - m_Length = src.m_Length; - } - - CFX_ByteStringC& operator=(const FX_CHAR* src) { - m_Ptr = (const uint8_t*)src; - m_Length = m_Ptr ? FXSYS_strlen(src) : 0; - return *this; - } - - CFX_ByteStringC& operator=(const CFX_ByteStringC& src) { - m_Ptr = src.m_Ptr; - m_Length = src.m_Length; - return *this; - } - - bool operator==(const char* ptr) const { - return FXSYS_strlen(ptr) == m_Length && - FXSYS_memcmp(ptr, m_Ptr, m_Length) == 0; - } - bool operator==(const CFX_ByteStringC& other) const { - return other.m_Length == m_Length && - FXSYS_memcmp(other.m_Ptr, m_Ptr, m_Length) == 0; - } - bool operator!=(const char* ptr) const { return !(*this == ptr); } - bool operator!=(const CFX_ByteStringC& other) const { - return !(*this == other); - } - - uint32_t GetID(FX_STRSIZE start_pos = 0) const; - - const uint8_t* raw_str() const { return m_Ptr; } - const FX_CHAR* c_str() const { - return reinterpret_cast<const FX_CHAR*>(m_Ptr); - } - - FX_STRSIZE GetLength() const { return m_Length; } - bool IsEmpty() const { return m_Length == 0; } - - uint8_t GetAt(FX_STRSIZE index) const { return m_Ptr[index]; } - FX_CHAR CharAt(FX_STRSIZE index) const { - return static_cast<FX_CHAR>(m_Ptr[index]); - } - - FX_STRSIZE Find(FX_CHAR ch) const { - const uint8_t* found = - static_cast<const uint8_t*>(memchr(m_Ptr, ch, m_Length)); - return found ? found - m_Ptr : -1; - } - - CFX_ByteStringC Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const { - if (index < 0) { - index = 0; - } - if (index > m_Length) { - return CFX_ByteStringC(); - } - if (count < 0 || count > m_Length - index) { - count = m_Length - index; - } - return CFX_ByteStringC(m_Ptr + index, count); - } +using CFX_ByteStringC = CFX_StringCTemplate<FX_CHAR>; +using CFX_WideStringC = CFX_StringCTemplate<FX_WCHAR>; - const uint8_t& operator[](size_t index) const { return m_Ptr[index]; } - - bool operator<(const CFX_ByteStringC& that) const { - int result = memcmp(m_Ptr, that.m_Ptr, std::min(m_Length, that.m_Length)); - return result < 0 || (result == 0 && m_Length < that.m_Length); - } - - protected: - const uint8_t* m_Ptr; - FX_STRSIZE m_Length; - - private: - void* operator new(size_t) throw() { return NULL; } -}; -inline bool operator==(const char* lhs, const CFX_ByteStringC& rhs) { - return rhs == lhs; -} -inline bool operator!=(const char* lhs, const CFX_ByteStringC& rhs) { - return rhs != lhs; -} #define FXBSTR_ID(c1, c2, c3, c4) \ (((uint32_t)c1 << 24) | ((uint32_t)c2 << 16) | ((uint32_t)c3 << 8) | \ ((uint32_t)c4)) +#define FX_WSTRC(wstr) CFX_WideStringC(wstr, FX_ArraySize(wstr) - 1) + // A mutable string with shared buffers using copy-on-write semantics that // avoids the cost of std::string's iterator stability guarantees. class CFX_ByteString { public: - typedef FX_CHAR value_type; + using CharType = FX_CHAR; CFX_ByteString() {} CFX_ByteString(const CFX_ByteString& other) : m_pData(other.m_pData) {} @@ -346,133 +233,11 @@ inline CFX_ByteString operator+(const CFX_ByteStringC& str1, return CFX_ByteString(str1, str2.AsStringC()); } -class CFX_WideStringC { - public: - typedef FX_WCHAR value_type; - - CFX_WideStringC() { - m_Ptr = NULL; - m_Length = 0; - } - - // Deliberately implicit to avoid calling on every string literal. - CFX_WideStringC(const FX_WCHAR* ptr) { - m_Ptr = ptr; - m_Length = ptr ? FXSYS_wcslen(ptr) : 0; - } - - // Deliberately implicit to avoid calling on every string literal. - // |ch| must be an lvalue that outlives the the CFX_WideStringC. - CFX_WideStringC(FX_WCHAR& ch) { - m_Ptr = &ch; - m_Length = 1; - } - - CFX_WideStringC(const FX_WCHAR* ptr, FX_STRSIZE len) { - m_Ptr = ptr; - m_Length = (len == -1) ? FXSYS_wcslen(ptr) : len; - } - - CFX_WideStringC(const CFX_WideStringC& src) { - m_Ptr = src.m_Ptr; - m_Length = src.m_Length; - } - - CFX_WideStringC& operator=(const FX_WCHAR* src) { - m_Ptr = src; - m_Length = FXSYS_wcslen(src); - return *this; - } - - CFX_WideStringC& operator=(const CFX_WideStringC& src) { - m_Ptr = src.m_Ptr; - m_Length = src.m_Length; - return *this; - } - - bool operator==(const wchar_t* ptr) const { - return FXSYS_wcslen(ptr) == m_Length && wmemcmp(ptr, m_Ptr, m_Length) == 0; - } - bool operator==(const CFX_WideStringC& str) const { - return str.m_Length == m_Length && wmemcmp(str.m_Ptr, m_Ptr, m_Length) == 0; - } - bool operator!=(const wchar_t* ptr) const { return !(*this == ptr); } - bool operator!=(const CFX_WideStringC& str) const { return !(*this == str); } - - const FX_WCHAR* c_str() const { return m_Ptr; } - - FX_STRSIZE GetLength() const { return m_Length; } - bool IsEmpty() const { return m_Length == 0; } - - FX_WCHAR GetAt(FX_STRSIZE index) const { return m_Ptr[index]; } - - CFX_WideStringC Left(FX_STRSIZE count) const { - if (count < 1) { - return CFX_WideStringC(); - } - if (count > m_Length) { - count = m_Length; - } - return CFX_WideStringC(m_Ptr, count); - } - - FX_STRSIZE Find(FX_WCHAR ch) const { - const FX_WCHAR* found = - static_cast<const FX_WCHAR*>(wmemchr(m_Ptr, ch, m_Length)); - return found ? found - m_Ptr : -1; - } - - CFX_WideStringC Mid(FX_STRSIZE index, FX_STRSIZE count = -1) const { - if (index < 0) { - index = 0; - } - if (index > m_Length) { - return CFX_WideStringC(); - } - if (count < 0 || count > m_Length - index) { - count = m_Length - index; - } - return CFX_WideStringC(m_Ptr + index, count); - } - - CFX_WideStringC Right(FX_STRSIZE count) const { - if (count < 1) { - return CFX_WideStringC(); - } - if (count > m_Length) { - count = m_Length; - } - return CFX_WideStringC(m_Ptr + m_Length - count, count); - } - - const FX_WCHAR& operator[](size_t index) const { return m_Ptr[index]; } - - bool operator<(const CFX_WideStringC& that) const { - int result = wmemcmp(m_Ptr, that.m_Ptr, std::min(m_Length, that.m_Length)); - return result < 0 || (result == 0 && m_Length < that.m_Length); - } - - protected: - const FX_WCHAR* m_Ptr; - FX_STRSIZE m_Length; - - private: - void* operator new(size_t) throw() { return NULL; } -}; - -inline bool operator==(const wchar_t* lhs, const CFX_WideStringC& rhs) { - return rhs == lhs; -} -inline bool operator!=(const wchar_t* lhs, const CFX_WideStringC& rhs) { - return rhs != lhs; -} -#define FX_WSTRC(wstr) CFX_WideStringC(wstr, FX_ArraySize(wstr) - 1) - // A mutable string with shared buffers using copy-on-write semantics that // avoids the cost of std::string's iterator stability guarantees. class CFX_WideString { public: - typedef FX_WCHAR value_type; + using CharType = FX_WCHAR; CFX_WideString() {} CFX_WideString(const CFX_WideString& other) : m_pData(other.m_pData) {} |