String16.h revision ba0165bef09729a33ab8e0ca329342be05e0d859
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 <utils/Errors.h>
21#include <utils/SharedBuffer.h>
22#include <utils/Unicode.h>
23
24// ---------------------------------------------------------------------------
25
26extern "C" {
27
28}
29
30// ---------------------------------------------------------------------------
31
32namespace android {
33
34// ---------------------------------------------------------------------------
35
36class String8;
37class TextOutput;
38
39//! This is a string holding UTF-16 characters.
40class String16
41{
42public:
43                                String16();
44                                String16(const String16& o);
45                                String16(const String16& o,
46                                         size_t len,
47                                         size_t begin=0);
48    explicit                    String16(const char16_t* o);
49    explicit                    String16(const char16_t* o, size_t len);
50    explicit                    String16(const String8& o);
51    explicit                    String16(const char* o);
52    explicit                    String16(const char* o, size_t len);
53
54                                ~String16();
55
56    inline  const char16_t*     string() const;
57    inline  size_t              size() const;
58
59    inline  const SharedBuffer* sharedBuffer() const;
60
61            void                setTo(const String16& other);
62            status_t            setTo(const char16_t* other);
63            status_t            setTo(const char16_t* other, size_t len);
64            status_t            setTo(const String16& other,
65                                      size_t len,
66                                      size_t begin=0);
67
68            status_t            append(const String16& other);
69            status_t            append(const char16_t* other, size_t len);
70
71    inline  String16&           operator=(const String16& other);
72
73    inline  String16&           operator+=(const String16& other);
74    inline  String16            operator+(const String16& other) const;
75
76            status_t            insert(size_t pos, const char16_t* chrs);
77            status_t            insert(size_t pos,
78                                       const char16_t* chrs, size_t len);
79
80            ssize_t             findFirst(char16_t c) const;
81            ssize_t             findLast(char16_t c) const;
82
83            bool                startsWith(const String16& prefix) const;
84            bool                startsWith(const char16_t* prefix) const;
85
86            status_t            makeLower();
87
88            status_t            replaceAll(char16_t replaceThis,
89                                           char16_t withThis);
90
91            status_t            remove(size_t len, size_t begin=0);
92
93    inline  int                 compare(const String16& other) const;
94
95    inline  bool                operator<(const String16& other) const;
96    inline  bool                operator<=(const String16& other) const;
97    inline  bool                operator==(const String16& other) const;
98    inline  bool                operator!=(const String16& other) const;
99    inline  bool                operator>=(const String16& other) const;
100    inline  bool                operator>(const String16& other) const;
101
102    inline  bool                operator<(const char16_t* other) const;
103    inline  bool                operator<=(const char16_t* other) const;
104    inline  bool                operator==(const char16_t* other) const;
105    inline  bool                operator!=(const char16_t* other) const;
106    inline  bool                operator>=(const char16_t* other) const;
107    inline  bool                operator>(const char16_t* other) const;
108
109    inline                      operator const char16_t*() const;
110
111private:
112            const char16_t*     mString;
113};
114
115TextOutput& operator<<(TextOutput& to, const String16& val);
116
117// ---------------------------------------------------------------------------
118// No user servicable parts below.
119
120inline int compare_type(const String16& lhs, const String16& rhs)
121{
122    return lhs.compare(rhs);
123}
124
125inline int strictly_order_type(const String16& lhs, const String16& rhs)
126{
127    return compare_type(lhs, rhs) < 0;
128}
129
130inline const char16_t* String16::string() const
131{
132    return mString;
133}
134
135inline size_t String16::size() const
136{
137    return SharedBuffer::sizeFromData(mString)/sizeof(char16_t)-1;
138}
139
140inline const SharedBuffer* String16::sharedBuffer() const
141{
142    return SharedBuffer::bufferFromData(mString);
143}
144
145inline String16& String16::operator=(const String16& other)
146{
147    setTo(other);
148    return *this;
149}
150
151inline String16& String16::operator+=(const String16& other)
152{
153    append(other);
154    return *this;
155}
156
157inline String16 String16::operator+(const String16& other) const
158{
159    String16 tmp;
160    tmp += other;
161    return tmp;
162}
163
164inline int String16::compare(const String16& other) const
165{
166    return strzcmp16(mString, size(), other.mString, other.size());
167}
168
169inline bool String16::operator<(const String16& other) const
170{
171    return strzcmp16(mString, size(), other.mString, other.size()) < 0;
172}
173
174inline bool String16::operator<=(const String16& other) const
175{
176    return strzcmp16(mString, size(), other.mString, other.size()) <= 0;
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{
191    return strzcmp16(mString, size(), other.mString, other.size()) >= 0;
192}
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 char16_t* other) const
200{
201    return strcmp16(mString, other) < 0;
202}
203
204inline bool String16::operator<=(const char16_t* other) const
205{
206    return strcmp16(mString, other) <= 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 String16::operator const char16_t*() const
230{
231    return mString;
232}
233
234}; // namespace android
235
236// ---------------------------------------------------------------------------
237
238#endif // ANDROID_STRING16_H
239