String8.h revision 9ac4e005b4fbc32fe63dd566c5c7e54e186fbe5c
1cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project/* 2cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 3cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 4cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * you may not use this file except in compliance with the License. 6cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * You may obtain a copy of the License at 7cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 8cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 10cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * See the License for the specific language governing permissions and 14cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * limitations under the License. 15cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 16cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 17cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#ifndef ANDROID_STRING8_H 18cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#define ANDROID_STRING8_H 19cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 209ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan#include <string> // for std::string 219ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan 22cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#include <utils/Errors.h> 23ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root#include <utils/Unicode.h> 249a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown#include <utils/TypeHelpers.h> 25cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 26ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root#include <string.h> // for strcmp 27647925ddf053989b641b4c5c8a51efd55c931f22Jeff Brown#include <stdarg.h> 2844dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 2944dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa// --------------------------------------------------------------------------- 3044dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 31cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectnamespace android { 32cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 33ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Rootclass String16; 34cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass TextOutput; 35cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 3644dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa//! This is a string holding UTF-8 characters. Does not allow the value more 3744dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa// than 0x10FFFF, which is not valid unicode codepoint. 38cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectclass String8 39cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 40cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectpublic: 414485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian /* use String8(StaticLinkage) if you're statically linking against 424485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * libutils and declaring an empty static String8, e.g.: 434485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * 444485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * static String8 sAStaticEmptyString(String8::kEmptyString); 454485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian * static String8 sAnotherStaticEmptyString(sAStaticEmptyString); 464485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian */ 474485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian enum StaticLinkage { kEmptyString }; 484485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian 49cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8(); 504485d0d966d062d1b45b635e2447a2d2f96c3f38Mathias Agopian explicit String8(StaticLinkage); 51cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8(const String8& o); 52cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char* o); 53cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char* o, size_t numChars); 5495fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 55cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const String16& o); 56cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char16_t* o); 57cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project explicit String8(const char16_t* o, size_t numChars); 5844dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa explicit String8(const char32_t* o); 5944dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa explicit String8(const char32_t* o, size_t numChars); 60cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ~String8(); 611d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 621d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown static inline const String8 empty(); 631d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 641d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown static String8 format(const char* fmt, ...) __attribute__((format (printf, 1, 2))); 651d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown static String8 formatV(const char* fmt, va_list args); 661d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 67cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline const char* string() const; 689ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan static inline std::string std_string(const String8& str); 69cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline size_t size() const; 70cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline size_t bytes() const; 7148da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown inline bool isEmpty() const; 7295fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 73d2529f28308ba7583f4d8baaa937218d81cbe8bdSergio Giro size_t length() const; 7495fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 7548da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown void clear(); 7648da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown 77cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void setTo(const String8& other); 78cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t setTo(const char* other); 79cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t setTo(const char* other, size_t numChars); 80cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t setTo(const char16_t* other, size_t numChars); 8144dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa status_t setTo(const char32_t* other, 8244dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa size_t length); 8344dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 84cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t append(const String8& other); 85cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t append(const char* other); 86cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t append(const char* other, size_t numChars); 87cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 8838fb25b9d040ac16dc838027da2889301a38fc7dJeff Brown status_t appendFormat(const char* fmt, ...) 8938fb25b9d040ac16dc838027da2889301a38fc7dJeff Brown __attribute__((format (printf, 2, 3))); 90647925ddf053989b641b4c5c8a51efd55c931f22Jeff Brown status_t appendFormatV(const char* fmt, va_list args); 9135a154e57f2f59722de580395ccd5172e44842cbJeff Brown 9244dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa // Note that this function takes O(N) time to calculate the value. 9344dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa // No cache value is stored. 9444dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa size_t getUtf32Length() const; 9544dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa int32_t getUtf32At(size_t index, 9644dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa size_t *next_index) const; 97ba0165bef09729a33ab8e0ca329342be05e0d859Kenny Root void getUtf32(char32_t* dst) const; 9844dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 99cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator=(const String8& other); 100cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator=(const char* other); 10195fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 102cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator+=(const String8& other); 103cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8 operator+(const String8& other) const; 10495fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 105cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8& operator+=(const char* other); 106cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline String8 operator+(const char* other) const; 107cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 108cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline int compare(const String8& other) const; 109cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 110cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<(const String8& other) const; 111cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<=(const String8& other) const; 112cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator==(const String8& other) const; 113cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator!=(const String8& other) const; 114cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>=(const String8& other) const; 115cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>(const String8& other) const; 11695fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 117cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<(const char* other) const; 118cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator<=(const char* other) const; 119cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator==(const char* other) const; 120cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator!=(const char* other) const; 121cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>=(const char* other) const; 122cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline bool operator>(const char* other) const; 12395fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 124cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project inline operator const char*() const; 12595fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 126cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char* lockBuffer(size_t size); 127cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void unlockBuffer(); 128cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t unlockBuffer(size_t size); 12995fd5270653d9004466ab54bfc3d7f82a5014bafSamuel Tan 130cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project // return the index of the first byte of other in this at or after 131cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project // start, or -1 if not found 132cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project ssize_t find(const char* other, size_t start = 0) const; 133cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 1345ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown // return true if this string contains the specified substring 1355ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown inline bool contains(const char* other) const; 1365ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown 1375ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown // removes all occurrence of the specified substring 1385ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown // returns true if any were found and removed 1395ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown bool removeAll(const char* other); 1405ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown 141cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toLower(); 142cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toLower(size_t start, size_t numChars); 143cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toUpper(); 144cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void toUpper(size_t start, size_t numChars); 14544dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa 1465ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown 147cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 148cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * These methods operate on the string as if it were a path name. 149cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 150cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 151cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 152cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Set the filename field to a specific value. 153cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 154cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Normalizes the filename, removing a trailing '/' if present. 155cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 156cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void setPathName(const char* name); 157cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project void setPathName(const char* name, size_t numChars); 158cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 159cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 160cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Get just the filename component. 161cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 162cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "bar.c" 163cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 164cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getPathLeaf(void) const; 165cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 166cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 167cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Remove the last (file name) component, leaving just the directory 168cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * name. 169cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 170cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "/tmp/foo" 171cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp" --> "" // ????? shouldn't this be "/" ???? XXX 172cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "bar.c" --> "" 173cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 174cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getPathDir(void) const; 175cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 176cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 177cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Retrieve the front (root dir) component. Optionally also return the 178cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * remaining components. 179cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 180cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "tmp" (remain = "foo/bar.c") 181cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp" --> "tmp" (remain = "") 182cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "bar.c" --> "bar.c" (remain = "") 183cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 184cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 walkPath(String8* outRemains = NULL) const; 185cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 186cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 18729d4d20c24fa94f2db71bd0edcbe4b64d59e4d6eGlenn Kasten * Return the filename extension. This is the last '.' and any number 18829d4d20c24fa94f2db71bd0edcbe4b64d59e4d6eGlenn Kasten * of characters that follow it. The '.' is included in case we 189cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * decide to expand our definition of what constitutes an extension. 190cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 191cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> ".c" 192cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp" --> "" 193cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo.bar/baz" --> "" 194cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "foo.jpeg" --> ".jpeg" 195cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "foo." --> "" 196cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 197cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getPathExtension(void) const; 198cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 199cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 200cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Return the path without the extension. Rules for what constitutes 201cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * an extension are described in the comment for getPathExtension(). 202cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 203cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * "/tmp/foo/bar.c" --> "/tmp/foo/bar" 204cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 205cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 getBasePath(void) const; 206cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 207cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 208cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Add a component to the pathname. We guarantee that there is 209cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * exactly one path separator between the old path and the new. 210cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * If there is no existing name, we just copy the new name in. 211cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 212cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * If leaf is a fully qualified path (i.e. starts with '/', it 213cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * replaces whatever was there before. 214cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 215cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8& appendPath(const char* leaf); 216cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8& appendPath(const String8& leaf) { return appendPath(leaf.string()); } 217cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 218cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 219cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Like appendPath(), but does not affect this string. Returns a new one instead. 220cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 221cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 appendPathCopy(const char* leaf) const 222cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project { String8 p(*this); p.appendPath(leaf); return p; } 223cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8 appendPathCopy(const String8& leaf) const { return appendPathCopy(leaf.string()); } 224cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 225cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project /* 226cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Converts all separators in this string to /, the default path separator. 227cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * 228cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * If the default OS separator is backslash, this converts all 229cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * backslashes to slashes, in-place. Otherwise it does nothing. 230cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project * Returns self. 231cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project */ 232cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project String8& convertToResPath(); 233cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 234cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectprivate: 235cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project status_t real_append(const char* other, size_t numChars); 236cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project char* find_extension(void) const; 237cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 238cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project const char* mString; 239cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project}; 240cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 2419a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown// String8 can be trivially moved using memcpy() because moving does not 2429a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown// require any change to the underlying SharedBuffer contents or reference count. 2439a0a76df1e961ef4621e81814d8bf891a09bef66Jeff BrownANDROID_TRIVIAL_MOVE_TRAIT(String8) 2449a0a76df1e961ef4621e81814d8bf891a09bef66Jeff Brown 245cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 246cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// No user servicable parts below. 247cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 248cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline int compare_type(const String8& lhs, const String8& rhs) 249cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 250cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return lhs.compare(rhs); 251cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 252cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 253cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline int strictly_order_type(const String8& lhs, const String8& rhs) 254cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 255cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return compare_type(lhs, rhs) < 0; 256cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 257cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 2581d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Browninline const String8 String8::empty() { 2591d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown return String8(); 2601d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown} 2611d618d63c1bb99728b5b0afe320f5a6afa95436cJeff Brown 262cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline const char* String8::string() const 263cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 264cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mString; 265cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 266cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 2679ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Taninline std::string String8::std_string(const String8& str) 2689ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan{ 2699ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan return std::string(str.string()); 2709ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan} 2719ac4e005b4fbc32fe63dd566c5c7e54e186fbe5cSamuel Tan 272cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline size_t String8::size() const 273cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 274cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return length(); 275cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 276cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 27748da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Browninline bool String8::isEmpty() const 27848da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown{ 27948da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown return length() == 0; 28048da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown} 28148da31b735ebbc6a00c4e9fe9631f4af79e2c9dfJeff Brown 282cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline size_t String8::bytes() const 283cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 284d2529f28308ba7583f4d8baaa937218d81cbe8bdSergio Giro return length(); 285cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 286cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 2875ee915afe17b7190f992addc48cb53ed6371a68dJeff Browninline bool String8::contains(const char* other) const 2885ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown{ 2895ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown return find(other) >= 0; 2905ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown} 2915ee915afe17b7190f992addc48cb53ed6371a68dJeff Brown 292cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8& String8::operator=(const String8& other) 293cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 294cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project setTo(other); 295cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 296cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 297cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 298cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8& String8::operator=(const char* other) 299cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 300cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project setTo(other); 301cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 302cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 303cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 304cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8& String8::operator+=(const String8& other) 305cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 306cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project append(other); 307cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 308cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 309cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 310cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8 String8::operator+(const String8& other) const 311cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 31223b4a0936f1ee11e587b7be9dc3bcae5b55d31cfKenny Root String8 tmp(*this); 313cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project tmp += other; 314cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return tmp; 315cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 316cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 317cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8& String8::operator+=(const char* other) 318cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 319cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project append(other); 320cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return *this; 321cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 322cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 323cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8 String8::operator+(const char* other) const 324cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 32523b4a0936f1ee11e587b7be9dc3bcae5b55d31cfKenny Root String8 tmp(*this); 326cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project tmp += other; 327cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return tmp; 328cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 329cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 330cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline int String8::compare(const String8& other) const 331cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 332cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString); 333cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 334cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 335cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<(const String8& other) const 336cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 337cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) < 0; 338cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 339cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 340cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<=(const String8& other) const 341cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 342cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) <= 0; 343cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 344cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 345cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator==(const String8& other) const 346cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 3479d589aa0d63e1eb088b10f065ee7fb0765d2e285Brad Fitzpatrick return strcmp(mString, other.mString) == 0; 348cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 349cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 350cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator!=(const String8& other) const 351cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 352cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) != 0; 353cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 354cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 355cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>=(const String8& other) const 356cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 357cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) >= 0; 358cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 359cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 360cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>(const String8& other) const 361cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 362cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other.mString) > 0; 363cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 364cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 365cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<(const char* other) const 366cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 367cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) < 0; 368cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 369cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 370cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator<=(const char* other) const 371cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 372cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) <= 0; 373cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 374cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 375cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator==(const char* other) const 376cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 377cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) == 0; 378cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 379cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 380cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator!=(const char* other) const 381cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 382cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) != 0; 383cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 384cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 385cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>=(const char* other) const 386cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 387cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) >= 0; 388cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 389cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 390cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline bool String8::operator>(const char* other) const 391cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 392cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return strcmp(mString, other) > 0; 393cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 394cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 395cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Projectinline String8::operator const char*() const 396cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project{ 397cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project return mString; 398cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project} 399cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 40044dad3e006e0a966d93473dde3d74b2b43555519Daisuke Miyakawa} // namespace android 401cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 402cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project// --------------------------------------------------------------------------- 403cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project 404cbb1011c95e0c25c29e40e203a6a31bccd029da3The Android Open Source Project#endif // ANDROID_STRING8_H 405