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