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 /* 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 inline const char16_t* String16::string() const 143 { 144 return mString; 145 } 146 147 inline size_t String16::size() const 148 { 149 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 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