blob: 07c4de7462849ecc9350c2218c4322b733dc0b2f [file] [log] [blame]
The Android Open Source Projectcbb10112009-03-03 19:31:44 -08001/*
2 * Copyright (C) 2005 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_STRING16_H
18#define ANDROID_STRING16_H
19
Samuel Tan9ac4e002016-02-16 14:20:05 -080020#include <string> // for std::string
21
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080022#include <utils/Errors.h>
Samuel Tan9ac4e002016-02-16 14:20:05 -080023#include <utils/String8.h>
Jeff Brown9a0a76d2012-03-16 14:45:49 -070024#include <utils/TypeHelpers.h>
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080025
26// ---------------------------------------------------------------------------
27
28extern "C" {
29
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080030}
31
32// ---------------------------------------------------------------------------
33
34namespace android {
35
Kenny Root9a2d83e2009-12-04 09:38:48 -080036// ---------------------------------------------------------------------------
37
Sergio Girod2529f22015-09-23 16:22:59 +010038class SharedBuffer;
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080039class String8;
40class TextOutput;
41
42//! This is a string holding UTF-16 characters.
43class String16
44{
45public:
Mathias Agopian4485d0d2013-05-08 16:04:13 -070046 /* use String16(StaticLinkage) if you're statically linking against
47 * libutils and declaring an empty static String16, e.g.:
48 *
49 * static String16 sAStaticEmptyString(String16::kEmptyString);
50 * static String16 sAnotherStaticEmptyString(sAStaticEmptyString);
51 */
52 enum StaticLinkage { kEmptyString };
53
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080054 String16();
Mathias Agopian4485d0d2013-05-08 16:04:13 -070055 explicit String16(StaticLinkage);
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080056 String16(const String16& o);
57 String16(const String16& o,
58 size_t len,
59 size_t begin=0);
60 explicit String16(const char16_t* o);
61 explicit String16(const char16_t* o, size_t len);
62 explicit String16(const String8& o);
63 explicit String16(const char* o);
64 explicit String16(const char* o, size_t len);
65
66 ~String16();
Samuel Tanf9d16ef2016-02-16 15:17:10 -080067
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080068 inline const char16_t* string() const;
Samuel Tanf9d16ef2016-02-16 15:17:10 -080069
Samuel Tan9ac4e002016-02-16 14:20:05 -080070 static inline std::string std_string(const String16& str);
Sergio Girod2529f22015-09-23 16:22:59 +010071 size_t size() const;
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080072 void setTo(const String16& other);
73 status_t setTo(const char16_t* other);
74 status_t setTo(const char16_t* other, size_t len);
75 status_t setTo(const String16& other,
76 size_t len,
77 size_t begin=0);
Samuel Tanf9d16ef2016-02-16 15:17:10 -080078
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080079 status_t append(const String16& other);
80 status_t append(const char16_t* other, size_t len);
Samuel Tanf9d16ef2016-02-16 15:17:10 -080081
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080082 inline String16& operator=(const String16& other);
Samuel Tanf9d16ef2016-02-16 15:17:10 -080083
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080084 inline String16& operator+=(const String16& other);
85 inline String16 operator+(const String16& other) const;
86
87 status_t insert(size_t pos, const char16_t* chrs);
88 status_t insert(size_t pos,
89 const char16_t* chrs, size_t len);
90
91 ssize_t findFirst(char16_t c) const;
92 ssize_t findLast(char16_t c) const;
93
94 bool startsWith(const String16& prefix) const;
95 bool startsWith(const char16_t* prefix) const;
Samuel Tanf9d16ef2016-02-16 15:17:10 -080096
Michael Wright5bacef32016-05-09 14:43:31 +010097 bool contains(const char16_t* chrs) const;
98
The Android Open Source Projectcbb10112009-03-03 19:31:44 -080099 status_t makeLower();
100
101 status_t replaceAll(char16_t replaceThis,
102 char16_t withThis);
103
104 status_t remove(size_t len, size_t begin=0);
105
106 inline int compare(const String16& other) const;
107
108 inline bool operator<(const String16& other) const;
109 inline bool operator<=(const String16& other) const;
110 inline bool operator==(const String16& other) const;
111 inline bool operator!=(const String16& other) const;
112 inline bool operator>=(const String16& other) const;
113 inline bool operator>(const String16& other) const;
Samuel Tanf9d16ef2016-02-16 15:17:10 -0800114
The Android Open Source Projectcbb10112009-03-03 19:31:44 -0800115 inline bool operator<(const char16_t* other) const;
116 inline bool operator<=(const char16_t* other) const;
117 inline bool operator==(const char16_t* other) const;
118 inline bool operator!=(const char16_t* other) const;
119 inline bool operator>=(const char16_t* other) const;
120 inline bool operator>(const char16_t* other) const;
Samuel Tanf9d16ef2016-02-16 15:17:10 -0800121
The Android Open Source Projectcbb10112009-03-03 19:31:44 -0800122 inline operator const char16_t*() const;
Samuel Tanf9d16ef2016-02-16 15:17:10 -0800123
The Android Open Source Projectcbb10112009-03-03 19:31:44 -0800124private:
125 const char16_t* mString;
126};
127
Jeff Brown9a0a76d2012-03-16 14:45:49 -0700128// String16 can be trivially moved using memcpy() because moving does not
129// require any change to the underlying SharedBuffer contents or reference count.
130ANDROID_TRIVIAL_MOVE_TRAIT(String16)
131
The Android Open Source Projectcbb10112009-03-03 19:31:44 -0800132// ---------------------------------------------------------------------------
133// No user servicable parts below.
134
135inline int compare_type(const String16& lhs, const String16& rhs)
136{
137 return lhs.compare(rhs);
138}
139
140inline int strictly_order_type(const String16& lhs, const String16& rhs)
141{
142 return compare_type(lhs, rhs) < 0;
143}
144
145inline const char16_t* String16::string() const
146{
147 return mString;
148}
149
Samuel Tan9ac4e002016-02-16 14:20:05 -0800150inline std::string String16::std_string(const String16& str)
151{
152 return std::string(String8(str).string());
153}
154
The Android Open Source Projectcbb10112009-03-03 19:31:44 -0800155inline String16& String16::operator=(const String16& other)
156{
157 setTo(other);
158 return *this;
159}
160
161inline String16& String16::operator+=(const String16& other)
162{
163 append(other);
164 return *this;
165}
166
167inline String16 String16::operator+(const String16& other) const
168{
Josiah Gaskin9ee3fc42011-08-16 15:16:04 -0700169 String16 tmp(*this);
The Android Open Source Projectcbb10112009-03-03 19:31:44 -0800170 tmp += other;
171 return tmp;
172}
173
174inline int String16::compare(const String16& other) const
175{
176 return strzcmp16(mString, size(), other.mString, other.size());
177}
178
179inline bool String16::operator<(const String16& other) const
180{
181 return strzcmp16(mString, size(), other.mString, other.size()) < 0;
182}
183
184inline bool String16::operator<=(const String16& other) const
185{
186 return strzcmp16(mString, size(), other.mString, other.size()) <= 0;
187}
188
189inline bool String16::operator==(const String16& other) const
190{
Brad Fitzpatrick9d589aa2010-10-20 17:06:28 -0700191 return strzcmp16(mString, size(), other.mString, other.size()) == 0;
The Android Open Source Projectcbb10112009-03-03 19:31:44 -0800192}
193
194inline bool String16::operator!=(const String16& other) const
195{
196 return strzcmp16(mString, size(), other.mString, other.size()) != 0;
197}
198
199inline bool String16::operator>=(const String16& other) const
200{
201 return strzcmp16(mString, size(), other.mString, other.size()) >= 0;
202}
203
204inline bool String16::operator>(const String16& other) const
205{
206 return strzcmp16(mString, size(), other.mString, other.size()) > 0;
207}
208
209inline bool String16::operator<(const char16_t* other) const
210{
211 return strcmp16(mString, other) < 0;
212}
213
214inline bool String16::operator<=(const char16_t* other) const
215{
216 return strcmp16(mString, other) <= 0;
217}
218
219inline bool String16::operator==(const char16_t* other) const
220{
221 return strcmp16(mString, other) == 0;
222}
223
224inline bool String16::operator!=(const char16_t* other) const
225{
226 return strcmp16(mString, other) != 0;
227}
228
229inline bool String16::operator>=(const char16_t* other) const
230{
231 return strcmp16(mString, other) >= 0;
232}
233
234inline bool String16::operator>(const char16_t* other) const
235{
236 return strcmp16(mString, other) > 0;
237}
238
239inline String16::operator const char16_t*() const
240{
241 return mString;
242}
243
244}; // namespace android
245
246// ---------------------------------------------------------------------------
247
248#endif // ANDROID_STRING16_H