1d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Copyright 2017 PDFium Authors. All rights reserved. 2d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Use of this source code is governed by a BSD-style license that can be 3d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// found in the LICENSE file. 4d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 5d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com 6d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 7d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#ifndef CORE_FXCRT_WIDESTRING_H_ 8d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#define CORE_FXCRT_WIDESTRING_H_ 9d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 10d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <functional> 11d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <iterator> 12d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include <utility> 13d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 14d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_memory.h" 15d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/fx_system.h" 16d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/retain_ptr.h" 17d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/string_data_template.h" 18d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "core/fxcrt/string_view_template.h" 19d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#include "third_party/base/optional.h" 20d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 21d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 22d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannnamespace fxcrt { 23d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 24d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass ByteString; 25d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass StringPool_WideString_Test; 26d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass WideString_ConcatInPlace_Test; 27d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 28d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// A mutable string with shared buffers using copy-on-write semantics that 29d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann// avoids the cost of std::string's iterator stability guarantees. 30d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannclass WideString { 31d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann public: 32d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann using CharType = wchar_t; 33d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann using const_iterator = const CharType*; 34d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann using const_reverse_iterator = std::reverse_iterator<const_iterator>; 35d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 36d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static WideString Format(const wchar_t* lpszFormat, ...) WARN_UNUSED_RESULT; 37d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static WideString FormatV(const wchar_t* lpszFormat, 38d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann va_list argList) WARN_UNUSED_RESULT; 39d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 40d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString(); 41d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString(const WideString& other); 42d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString(WideString&& other) noexcept; 43d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 44d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Deliberately implicit to avoid calling on every string literal. 45d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // NOLINTNEXTLINE(runtime/explicit) 46d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString(wchar_t ch); 47d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // NOLINTNEXTLINE(runtime/explicit) 48d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString(const wchar_t* ptr); 49d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 50d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // No implicit conversions from byte strings. 51d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // NOLINTNEXTLINE(runtime/explicit) 52d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString(char) = delete; 53d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 54d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString(const wchar_t* ptr, size_t len); 55d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 56d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann explicit WideString(const WideStringView& str); 57d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString(const WideStringView& str1, const WideStringView& str2); 58d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString(const std::initializer_list<WideStringView>& list); 59d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 60d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ~WideString(); 61d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 62d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static WideString FromLocal(const ByteStringView& str) WARN_UNUSED_RESULT; 63d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static WideString FromCodePage(const ByteStringView& str, 64d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann uint16_t codepage) WARN_UNUSED_RESULT; 65d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 66d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static WideString FromUTF8(const ByteStringView& str) WARN_UNUSED_RESULT; 67d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static WideString FromUTF16LE(const unsigned short* str, 68d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t len) WARN_UNUSED_RESULT; 69d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 70d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann static size_t WStringLength(const unsigned short* str) WARN_UNUSED_RESULT; 71d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 72d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Explicit conversion to C-style wide string. 73d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Note: Any subsequent modification of |this| will invalidate the result. 74d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const wchar_t* c_str() const { return m_pData ? m_pData->m_String : L""; } 75d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 76d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Explicit conversion to WideStringView. 77d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Note: Any subsequent modification of |this| will invalidate the result. 78d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideStringView AsStringView() const { 79d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideStringView(c_str(), GetLength()); 80d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 81d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 82d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Note: Any subsequent modification of |this| will invalidate iterators. 83d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const_iterator begin() const { return m_pData ? m_pData->m_String : nullptr; } 84d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const_iterator end() const { 85d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return m_pData ? m_pData->m_String + m_pData->m_nDataLength : nullptr; 86d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 87d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 88d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // Note: Any subsequent modification of |this| will invalidate iterators. 89d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const_reverse_iterator rbegin() const { 90d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return const_reverse_iterator(end()); 91d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 92d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const_reverse_iterator rend() const { 93d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return const_reverse_iterator(begin()); 94d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 95d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 96d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void clear() { m_pData.Reset(); } 97d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 98d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t GetLength() const { return m_pData ? m_pData->m_nDataLength : 0; } 99d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t GetStringLength() const { 100d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return m_pData ? wcslen(m_pData->m_String) : 0; 101d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 102d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool IsEmpty() const { return !GetLength(); } 103d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool IsValidIndex(size_t index) const { return index < GetLength(); } 104d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool IsValidLength(size_t length) const { return length <= GetLength(); } 105d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 106d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& operator=(const wchar_t* str); 107d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& operator=(const WideString& stringSrc); 108d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& operator=(const WideStringView& stringSrc); 109d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 110d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& operator+=(const wchar_t* str); 111d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& operator+=(wchar_t ch); 112d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& operator+=(const WideString& str); 113d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& operator+=(const WideStringView& str); 114d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 115d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool operator==(const wchar_t* ptr) const; 116d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool operator==(const WideStringView& str) const; 117d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool operator==(const WideString& other) const; 118d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 119d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool operator!=(const wchar_t* ptr) const { return !(*this == ptr); } 120d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool operator!=(const WideStringView& str) const { return !(*this == str); } 121d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool operator!=(const WideString& other) const { return !(*this == other); } 122d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 123d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool operator<(const wchar_t* ptr) const; 124d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool operator<(const WideStringView& str) const; 125d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool operator<(const WideString& other) const; 126d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 127d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CharType operator[](const size_t index) const { 128d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ASSERT(IsValidIndex(index)); 129d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return m_pData ? m_pData->m_String[index] : 0; 130d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 131d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 132d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CharType First() const { return GetLength() ? (*this)[0] : 0; } 133d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann CharType Last() const { return GetLength() ? (*this)[GetLength() - 1] : 0; } 134d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 135d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void SetAt(size_t index, wchar_t c); 136d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 137d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int Compare(const wchar_t* str) const; 138d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int Compare(const WideString& str) const; 139d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int CompareNoCase(const wchar_t* str) const; 140d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 141d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString Mid(size_t first, size_t count) const; 142d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString Left(size_t count) const; 143d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann WideString Right(size_t count) const; 144d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 145d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t Insert(size_t index, wchar_t ch); 146d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t InsertAtFront(wchar_t ch) { return Insert(0, ch); } 147d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t InsertAtBack(wchar_t ch) { return Insert(GetLength(), ch); } 148d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t Delete(size_t index, size_t count = 1); 149d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 150d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void MakeLower(); 151d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void MakeUpper(); 152d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 153d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void Trim(); 154d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void Trim(wchar_t target); 155d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void Trim(const WideStringView& targets); 156d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 157d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void TrimLeft(); 158d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void TrimLeft(wchar_t target); 159d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void TrimLeft(const WideStringView& targets); 160d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 161d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void TrimRight(); 162d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void TrimRight(wchar_t target); 163d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void TrimRight(const WideStringView& targets); 164d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 165d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void Reserve(size_t len); 166d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann wchar_t* GetBuffer(size_t len); 167d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void ReleaseBuffer(size_t len); 168d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 169d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann int GetInteger() const; 170d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann float GetFloat() const; 171d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 172d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<size_t> Find(const WideStringView& pSub, size_t start = 0) const; 173d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann Optional<size_t> Find(wchar_t ch, size_t start = 0) const; 174d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 175d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool Contains(const WideStringView& lpszSub, size_t start = 0) const { 176d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return Find(lpszSub, start).has_value(); 177d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 178d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 179d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann bool Contains(char ch, size_t start = 0) const { 180d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return Find(ch, start).has_value(); 181d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 182d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 183d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t Replace(const WideStringView& pOld, const WideStringView& pNew); 184d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann size_t Remove(wchar_t ch); 185d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 186d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString UTF8Encode() const; 187d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 188d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // This method will add \0\0 to the end of the string to represent the 189d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // wide string terminator. These values are in the string, not just the data, 190d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann // so GetLength() will include them. 191d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann ByteString UTF16LE_Encode() const; 192d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 193d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann protected: 194d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann using StringData = StringDataTemplate<wchar_t>; 195d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 196d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void ReallocBeforeWrite(size_t nLen); 197d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void AllocBeforeWrite(size_t nLen); 198d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void AllocCopy(WideString& dest, size_t nCopyLen, size_t nCopyIndex) const; 199d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void AssignCopy(const wchar_t* pSrcData, size_t nSrcLen); 200d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann void Concat(const wchar_t* lpszSrcData, size_t nSrcLen); 201d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 202d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann RetainPtr<StringData> m_pData; 203d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 204d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann friend WideString_ConcatInPlace_Test; 205d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann friend StringPool_WideString_Test; 206d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}; 207d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 208d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(const WideStringView& str1, 209d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideStringView& str2) { 210d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(str1, str2); 211d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 212d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(const WideStringView& str1, const wchar_t* str2) { 213d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(str1, str2); 214d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 215d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(const wchar_t* str1, const WideStringView& str2) { 216d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(str1, str2); 217d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 218d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(const WideStringView& str1, wchar_t ch) { 219d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(str1, WideStringView(ch)); 220d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 221d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(wchar_t ch, const WideStringView& str2) { 222d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(ch, str2); 223d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 224d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(const WideString& str1, const WideString& str2) { 225d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(str1.AsStringView(), str2.AsStringView()); 226d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 227d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(const WideString& str1, wchar_t ch) { 228d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(str1.AsStringView(), WideStringView(ch)); 229d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 230d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(wchar_t ch, const WideString& str2) { 231d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(ch, str2.AsStringView()); 232d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 233d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(const WideString& str1, const wchar_t* str2) { 234d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(str1.AsStringView(), str2); 235d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 236d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(const wchar_t* str1, const WideString& str2) { 237d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(str1, str2.AsStringView()); 238d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 239d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(const WideString& str1, 240d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideStringView& str2) { 241d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(str1.AsStringView(), str2); 242d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 243d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline WideString operator+(const WideStringView& str1, 244d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann const WideString& str2) { 245d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return WideString(str1, str2.AsStringView()); 246d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 247d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline bool operator==(const wchar_t* lhs, const WideString& rhs) { 248d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return rhs == lhs; 249d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 250d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline bool operator==(const WideStringView& lhs, const WideString& rhs) { 251d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return rhs == lhs; 252d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 253d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline bool operator!=(const wchar_t* lhs, const WideString& rhs) { 254d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return rhs != lhs; 255d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 256d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline bool operator!=(const WideStringView& lhs, const WideString& rhs) { 257d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return rhs != lhs; 258d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 259d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanninline bool operator<(const wchar_t* lhs, const WideString& rhs) { 260d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return rhs.Compare(lhs) > 0; 261d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} 262d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 263d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::wostream& operator<<(std::wostream& os, const WideString& str); 264d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::ostream& operator<<(std::ostream& os, const WideString& str); 265d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::wostream& operator<<(std::wostream& os, const WideStringView& str); 266d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstd::ostream& operator<<(std::ostream& os, const WideStringView& str); 267d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 268d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} // namespace fxcrt 269d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 270d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannusing WideString = fxcrt::WideString; 271d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 272d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannuint32_t FX_HashCode_GetW(const WideStringView& str, bool bIgnoreCase); 273d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 274d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannnamespace std { 275d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 276d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmanntemplate <> 277d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannstruct hash<WideString> { 278d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann std::size_t operator()(const WideString& str) const { 279d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann return FX_HashCode_GetW(str.AsStringView(), false); 280d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann } 281d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann}; 282d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 283d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann} // namespace std 284d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 285d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmannextern template struct std::hash<WideString>; 286d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann 287d904c1ec7e8d1d86ed56f0dd252435d12cd345aePhilip P. Moltmann#endif // CORE_FXCRT_WIDESTRING_H_ 288