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 28 extern "C" { 29 30 } 31 32 // --------------------------------------------------------------------------- 33 34 namespace android { 35 36 // --------------------------------------------------------------------------- 37 38 class SharedBuffer; 39 class String8; 40 class TextOutput; 41 42 //! This is a string holding UTF-16 characters. 43 class String16 44 { 45 public: 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 71 private: 72 static inline std::string std_string(const String16& str); 73 public: 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 127 private: 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. 133 ANDROID_TRIVIAL_MOVE_TRAIT(String16) 134 135 // --------------------------------------------------------------------------- 136 // No user servicable parts below. 137 138 inline int compare_type(const String16& lhs, const String16& rhs) 139 { 140 return lhs.compare(rhs); 141 } 142 143 inline int strictly_order_type(const String16& lhs, const String16& rhs) 144 { 145 return compare_type(lhs, rhs) < 0; 146 } 147 148 inline const char16_t* String16::string() const 149 { 150 return mString; 151 } 152 153 inline std::string String16::std_string(const String16& str) 154 { 155 return std::string(String8(str).string()); 156 } 157 158 inline String16& String16::operator=(const String16& other) 159 { 160 setTo(other); 161 return *this; 162 } 163 164 inline String16& String16::operator+=(const String16& other) 165 { 166 append(other); 167 return *this; 168 } 169 170 inline String16 String16::operator+(const String16& other) const 171 { 172 String16 tmp(*this); 173 tmp += other; 174 return tmp; 175 } 176 177 inline int String16::compare(const String16& other) const 178 { 179 return strzcmp16(mString, size(), other.mString, other.size()); 180 } 181 182 inline bool String16::operator<(const String16& other) const 183 { 184 return strzcmp16(mString, size(), other.mString, other.size()) < 0; 185 } 186 187 inline bool String16::operator<=(const String16& other) const 188 { 189 return strzcmp16(mString, size(), other.mString, other.size()) <= 0; 190 } 191 192 inline bool String16::operator==(const String16& other) const 193 { 194 return strzcmp16(mString, size(), other.mString, other.size()) == 0; 195 } 196 197 inline bool String16::operator!=(const String16& other) const 198 { 199 return strzcmp16(mString, size(), other.mString, other.size()) != 0; 200 } 201 202 inline bool String16::operator>=(const String16& other) const 203 { 204 return strzcmp16(mString, size(), other.mString, other.size()) >= 0; 205 } 206 207 inline bool String16::operator>(const String16& other) const 208 { 209 return strzcmp16(mString, size(), other.mString, other.size()) > 0; 210 } 211 212 inline bool String16::operator<(const char16_t* other) const 213 { 214 return strcmp16(mString, other) < 0; 215 } 216 217 inline bool String16::operator<=(const char16_t* other) const 218 { 219 return strcmp16(mString, other) <= 0; 220 } 221 222 inline bool String16::operator==(const char16_t* other) const 223 { 224 return strcmp16(mString, other) == 0; 225 } 226 227 inline bool String16::operator!=(const char16_t* other) const 228 { 229 return strcmp16(mString, other) != 0; 230 } 231 232 inline bool String16::operator>=(const char16_t* other) const 233 { 234 return strcmp16(mString, other) >= 0; 235 } 236 237 inline bool String16::operator>(const char16_t* other) const 238 { 239 return strcmp16(mString, other) > 0; 240 } 241 242 inline String16::operator const char16_t*() const 243 { 244 return mString; 245 } 246 247 }; // namespace android 248 249 // --------------------------------------------------------------------------- 250 251 #endif // ANDROID_STRING16_H 252