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 String8; 39 40 // DO NOT USE: please use std::u16string 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 private: 71 static inline std::string std_string(const String16& str); 72 public: 73 size_t size() const; 74 void setTo(const String16& other); 75 status_t setTo(const char16_t* other); 76 status_t setTo(const char16_t* other, size_t len); 77 status_t setTo(const String16& other, 78 size_t len, 79 size_t begin=0); 80 81 status_t append(const String16& other); 82 status_t append(const char16_t* other, size_t len); 83 84 inline String16& operator=(const String16& other); 85 86 inline String16& operator+=(const String16& other); 87 inline String16 operator+(const String16& other) const; 88 89 status_t insert(size_t pos, const char16_t* chrs); 90 status_t insert(size_t pos, 91 const char16_t* chrs, size_t len); 92 93 ssize_t findFirst(char16_t c) const; 94 ssize_t findLast(char16_t c) const; 95 96 bool startsWith(const String16& prefix) const; 97 bool startsWith(const char16_t* prefix) const; 98 99 bool contains(const char16_t* chrs) const; 100 101 status_t makeLower(); 102 103 status_t replaceAll(char16_t replaceThis, 104 char16_t withThis); 105 106 status_t remove(size_t len, size_t begin=0); 107 108 inline int compare(const String16& other) const; 109 110 inline bool operator<(const String16& other) const; 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 117 inline bool operator<(const char16_t* other) const; 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 124 inline operator const char16_t*() const; 125 126 private: 127 const char16_t* mString; 128 }; 129 130 // String16 can be trivially moved using memcpy() because moving does not 131 // require any change to the underlying SharedBuffer contents or reference count. 132 ANDROID_TRIVIAL_MOVE_TRAIT(String16) 133 134 // --------------------------------------------------------------------------- 135 // No user servicable parts below. 136 137 inline int compare_type(const String16& lhs, const String16& rhs) 138 { 139 return lhs.compare(rhs); 140 } 141 142 inline int strictly_order_type(const String16& lhs, const String16& rhs) 143 { 144 return compare_type(lhs, rhs) < 0; 145 } 146 147 inline const char16_t* String16::string() const 148 { 149 return mString; 150 } 151 152 inline std::string String16::std_string(const String16& str) 153 { 154 return std::string(String8(str).string()); 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 inline String16::operator const char16_t*() const 242 { 243 return mString; 244 } 245 246 }; // namespace android 247 248 // --------------------------------------------------------------------------- 249 250 #endif // ANDROID_STRING16_H 251