1/*
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
20#include <string> // for std::string
21
22#include <utils/Errors.h>
23#include <utils/String8.h>
24#include <utils/TypeHelpers.h>
25
26// ---------------------------------------------------------------------------
27
28extern "C" {
29
30}
31
32// ---------------------------------------------------------------------------
33
34namespace android {
35
36// ---------------------------------------------------------------------------
37
38class SharedBuffer;
39class String8;
40class TextOutput;
41
42//! This is a string holding UTF-16 characters.
43class String16
44{
45public:
46    /* 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
54                                String16();
55    explicit                    String16(StaticLinkage);
56                                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();
67
68    inline  const char16_t*     string() const;
69
70//TODO(b/35363681): remove
71private:
72    static inline std::string   std_string(const String16& str);
73public:
74            size_t              size() const;
75            void                setTo(const String16& other);
76            status_t            setTo(const char16_t* other);
77            status_t            setTo(const char16_t* other, size_t len);
78            status_t            setTo(const String16& other,
79                                      size_t len,
80                                      size_t begin=0);
81
82            status_t            append(const String16& other);
83            status_t            append(const char16_t* other, size_t len);
84
85    inline  String16&           operator=(const String16& other);
86
87    inline  String16&           operator+=(const String16& other);
88    inline  String16            operator+(const String16& other) const;
89
90            status_t            insert(size_t pos, const char16_t* chrs);
91            status_t            insert(size_t pos,
92                                       const char16_t* chrs, size_t len);
93
94            ssize_t             findFirst(char16_t c) const;
95            ssize_t             findLast(char16_t c) const;
96
97            bool                startsWith(const String16& prefix) const;
98            bool                startsWith(const char16_t* prefix) const;
99
100            bool                contains(const char16_t* chrs) const;
101
102            status_t            makeLower();
103
104            status_t            replaceAll(char16_t replaceThis,
105                                           char16_t withThis);
106
107            status_t            remove(size_t len, size_t begin=0);
108
109    inline  int                 compare(const String16& other) const;
110
111    inline  bool                operator<(const String16& other) const;
112    inline  bool                operator<=(const String16& other) const;
113    inline  bool                operator==(const String16& other) const;
114    inline  bool                operator!=(const String16& other) const;
115    inline  bool                operator>=(const String16& other) const;
116    inline  bool                operator>(const String16& other) const;
117
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;
121    inline  bool                operator!=(const char16_t* other) const;
122    inline  bool                operator>=(const char16_t* other) const;
123    inline  bool                operator>(const char16_t* other) const;
124
125    inline                      operator const char16_t*() const;
126
127private:
128            const char16_t*     mString;
129};
130
131// String16 can be trivially moved using memcpy() because moving does not
132// require any change to the underlying SharedBuffer contents or reference count.
133ANDROID_TRIVIAL_MOVE_TRAIT(String16)
134
135// ---------------------------------------------------------------------------
136// No user servicable parts below.
137
138inline int compare_type(const String16& lhs, const String16& rhs)
139{
140    return lhs.compare(rhs);
141}
142
143inline int strictly_order_type(const String16& lhs, const String16& rhs)
144{
145    return compare_type(lhs, rhs) < 0;
146}
147
148inline const char16_t* String16::string() const
149{
150    return mString;
151}
152
153inline std::string String16::std_string(const String16& str)
154{
155    return std::string(String8(str).string());
156}
157
158inline String16& String16::operator=(const String16& other)
159{
160    setTo(other);
161    return *this;
162}
163
164inline String16& String16::operator+=(const String16& other)
165{
166    append(other);
167    return *this;
168}
169
170inline String16 String16::operator+(const String16& other) const
171{
172    String16 tmp(*this);
173    tmp += other;
174    return tmp;
175}
176
177inline int String16::compare(const String16& other) const
178{
179    return strzcmp16(mString, size(), other.mString, other.size());
180}
181
182inline bool String16::operator<(const String16& other) const
183{
184    return strzcmp16(mString, size(), other.mString, other.size()) < 0;
185}
186
187inline bool String16::operator<=(const String16& other) const
188{
189    return strzcmp16(mString, size(), other.mString, other.size()) <= 0;
190}
191
192inline bool String16::operator==(const String16& other) const
193{
194    return strzcmp16(mString, size(), other.mString, other.size()) == 0;
195}
196
197inline bool String16::operator!=(const String16& other) const
198{
199    return strzcmp16(mString, size(), other.mString, other.size()) != 0;
200}
201
202inline bool String16::operator>=(const String16& other) const
203{
204    return strzcmp16(mString, size(), other.mString, other.size()) >= 0;
205}
206
207inline bool String16::operator>(const String16& other) const
208{
209    return strzcmp16(mString, size(), other.mString, other.size()) > 0;
210}
211
212inline bool String16::operator<(const char16_t* other) const
213{
214    return strcmp16(mString, other) < 0;
215}
216
217inline bool String16::operator<=(const char16_t* other) const
218{
219    return strcmp16(mString, other) <= 0;
220}
221
222inline bool String16::operator==(const char16_t* other) const
223{
224    return strcmp16(mString, other) == 0;
225}
226
227inline bool String16::operator!=(const char16_t* other) const
228{
229    return strcmp16(mString, other) != 0;
230}
231
232inline bool String16::operator>=(const char16_t* other) const
233{
234    return strcmp16(mString, other) >= 0;
235}
236
237inline bool String16::operator>(const char16_t* other) const
238{
239    return strcmp16(mString, other) > 0;
240}
241
242inline String16::operator const char16_t*() const
243{
244    return mString;
245}
246
247}; // namespace android
248
249// ---------------------------------------------------------------------------
250
251#endif // ANDROID_STRING16_H
252