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