Line data Source code
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 stagefright {
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 : /* use String16(StaticLinkage) if you're statically linking against
45 : * libutils and declaring an empty static String16, e.g.:
46 : *
47 : * static String16 sAStaticEmptyString(String16::kEmptyString);
48 : * static String16 sAnotherStaticEmptyString(sAStaticEmptyString);
49 : */
50 : enum StaticLinkage { kEmptyString };
51 :
52 : String16();
53 : explicit String16(StaticLinkage);
54 : String16(const String16& o);
55 : String16(const String16& o,
56 : size_t len,
57 : size_t begin=0);
58 : explicit String16(const char16_t* o);
59 : explicit String16(const char16_t* o, size_t len);
60 : explicit String16(const String8& o);
61 : explicit String16(const char* o);
62 : explicit String16(const char* o, size_t len);
63 :
64 : ~String16();
65 :
66 : inline const char16_t* string() const;
67 : inline size_t size() const;
68 :
69 : inline const SharedBuffer* sharedBuffer() const;
70 :
71 : void setTo(const String16& other);
72 : status_t setTo(const char16_t* other);
73 : status_t setTo(const char16_t* other, size_t len);
74 : status_t setTo(const String16& other,
75 : size_t len,
76 : size_t begin=0);
77 :
78 : status_t append(const String16& other);
79 : status_t append(const char16_t* other, size_t len);
80 :
81 : inline String16& operator=(const String16& other);
82 :
83 : inline String16& operator+=(const String16& other);
84 : inline String16 operator+(const String16& other) const;
85 :
86 : status_t insert(size_t pos, const char16_t* chrs);
87 : status_t insert(size_t pos,
88 : const char16_t* chrs, size_t len);
89 :
90 : ssize_t findFirst(char16_t c) const;
91 : ssize_t findLast(char16_t c) const;
92 :
93 : bool startsWith(const String16& prefix) const;
94 : bool startsWith(const char16_t* prefix) const;
95 :
96 : status_t makeLower();
97 :
98 : status_t replaceAll(char16_t replaceThis,
99 : char16_t withThis);
100 :
101 : status_t remove(size_t len, size_t begin=0);
102 :
103 : inline int compare(const String16& other) const;
104 :
105 : inline bool operator<(const String16& other) const;
106 : inline bool operator<=(const String16& other) const;
107 : inline bool operator==(const String16& other) const;
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 :
112 : inline bool operator<(const char16_t* other) const;
113 : inline bool operator<=(const char16_t* other) const;
114 : inline bool operator==(const char16_t* other) const;
115 : 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 :
119 : inline operator const char16_t*() const;
120 :
121 : private:
122 : const char16_t* mString;
123 : };
124 :
125 : // String16 can be trivially moved using memcpy() because moving does not
126 : // require any change to the underlying SharedBuffer contents or reference count.
127 : ANDROID_TRIVIAL_MOVE_TRAIT(String16)
128 :
129 : // ---------------------------------------------------------------------------
130 : // No user servicable parts below.
131 :
132 : inline int compare_type(const String16& lhs, const String16& rhs)
133 : {
134 : return lhs.compare(rhs);
135 : }
136 :
137 : inline int strictly_order_type(const String16& lhs, const String16& rhs)
138 : {
139 : return compare_type(lhs, rhs) < 0;
140 : }
141 :
142 0 : inline const char16_t* String16::string() const
143 : {
144 0 : return mString;
145 : }
146 :
147 0 : inline size_t String16::size() const
148 : {
149 0 : return SharedBuffer::sizeFromData(mString)/sizeof(char16_t)-1;
150 : }
151 :
152 : inline const SharedBuffer* String16::sharedBuffer() const
153 : {
154 : return SharedBuffer::bufferFromData(mString);
155 : }
156 :
157 : inline String16& String16::operator=(const String16& other)
158 : {
159 : setTo(other);
160 : return *this;
161 : }
162 :
163 : inline String16& String16::operator+=(const String16& other)
164 : {
165 : append(other);
166 : return *this;
167 : }
168 :
169 : inline String16 String16::operator+(const String16& other) const
170 : {
171 : String16 tmp(*this);
172 : tmp += other;
173 : return tmp;
174 : }
175 :
176 : inline int String16::compare(const String16& other) const
177 : {
178 : return strzcmp16(mString, size(), other.mString, other.size());
179 : }
180 :
181 : inline bool String16::operator<(const String16& other) const
182 : {
183 : return strzcmp16(mString, size(), other.mString, other.size()) < 0;
184 : }
185 :
186 : inline bool String16::operator<=(const String16& other) const
187 : {
188 : return strzcmp16(mString, size(), other.mString, other.size()) <= 0;
189 : }
190 :
191 : inline bool String16::operator==(const String16& other) const
192 : {
193 : return strzcmp16(mString, size(), other.mString, other.size()) == 0;
194 : }
195 :
196 : inline bool String16::operator!=(const String16& other) const
197 : {
198 : return strzcmp16(mString, size(), other.mString, other.size()) != 0;
199 : }
200 :
201 : inline bool String16::operator>=(const String16& other) const
202 : {
203 : return strzcmp16(mString, size(), other.mString, other.size()) >= 0;
204 : }
205 :
206 : inline bool String16::operator>(const String16& other) const
207 : {
208 : return strzcmp16(mString, size(), other.mString, other.size()) > 0;
209 : }
210 :
211 : inline bool String16::operator<(const char16_t* other) const
212 : {
213 : return strcmp16(mString, other) < 0;
214 : }
215 :
216 : inline bool String16::operator<=(const char16_t* other) const
217 : {
218 : return strcmp16(mString, other) <= 0;
219 : }
220 :
221 : inline bool String16::operator==(const char16_t* other) const
222 : {
223 : return strcmp16(mString, other) == 0;
224 : }
225 :
226 : inline bool String16::operator!=(const char16_t* other) const
227 : {
228 : return strcmp16(mString, other) != 0;
229 : }
230 :
231 : inline bool String16::operator>=(const char16_t* other) const
232 : {
233 : return strcmp16(mString, other) >= 0;
234 : }
235 :
236 : inline bool String16::operator>(const char16_t* other) const
237 : {
238 : return strcmp16(mString, other) > 0;
239 : }
240 :
241 0 : inline String16::operator const char16_t*() const
242 : {
243 0 : return mString;
244 : }
245 :
246 : }; // namespace stagefright
247 :
248 : // ---------------------------------------------------------------------------
249 :
250 : #endif // ANDROID_STRING16_H
|