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