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