16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* 26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (c) 2001-2012, International Business Machines 46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Corporation and others. All Rights Reserved. 56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Date Name Description 76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 11/19/2001 aliu Creation. 86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* 05/19/2010 markus Rewritten from scratch 96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org********************************************************************** 106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/ 116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef CHARSTRING_H 136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define CHARSTRING_H 146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h" 166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h" 176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uobject.h" 186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "cmemory.h" 196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN 216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Windows needs us to DLL-export the MaybeStackArray template specialization, 236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// but MacOS X cannot handle it. Same as in digitlst.h. 246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !U_PLATFORM_IS_DARWIN_BASED 256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtemplate class U_COMMON_API MaybeStackArray<char, 40>; 266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/** 296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ICU-internal char * string class. 306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This class does not assume or enforce any particular character encoding. 316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Raw bytes can be stored. The string object owns its characters. 326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A terminating NUL is stored, but the class does not prevent embedded NUL characters. 336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This class wants to be convenient but is also deliberately minimalist. 356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Please do not add methods if they only add minor convenience. 366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For example: 376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * cs.data()[5]='a'; // no need for setCharAt(5, 'a') 386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API CharString : public UMemory { 406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic: 416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString() : len(0) { buffer[0]=0; } 426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString(const StringPiece &s, UErrorCode &errorCode) : len(0) { 436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[0]=0; 446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org append(s, errorCode); 456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString(const CharString &s, UErrorCode &errorCode) : len(0) { 476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[0]=0; 486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org append(s, errorCode); 496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString(const char *s, int32_t sLength, UErrorCode &errorCode) : len(0) { 516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org buffer[0]=0; 526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org append(s, sLength, errorCode); 536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org ~CharString() {} 556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Replaces this string's contents with the other string's contents. 586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * CharString does not support the standard copy constructor nor 596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * the assignment operator, to make copies explicit and to 606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * use a UErrorCode where memory allocations might be needed. 616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString ©From(const CharString &other, UErrorCode &errorCode); 636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool isEmpty() const { return len==0; } 656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t length() const { return len; } 666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char operator[](int32_t index) const { return buffer[index]; } 676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org StringPiece toStringPiece() const { return StringPiece(buffer.getAlias(), len); } 686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org const char *data() const { return buffer.getAlias(); } 706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *data() { return buffer.getAlias(); } 716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString &clear() { len=0; buffer[0]=0; return *this; } 736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString &truncate(int32_t newLength); 746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString &append(char c, UErrorCode &errorCode); 766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString &append(const StringPiece &s, UErrorCode &errorCode) { 776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return append(s.data(), s.length(), errorCode); 786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString &append(const CharString &s, UErrorCode &errorCode) { 806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org return append(s.data(), s.length(), errorCode); 816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org } 826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString &append(const char *s, int32_t sLength, UErrorCode &status); 836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Returns a writable buffer for appending and writes the buffer's capacity to 856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * resultCapacity. Guarantees resultCapacity>=minCapacity if U_SUCCESS(). 866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * There will additionally be space for a terminating NUL right at resultCapacity. 876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (This function is similar to ByteSink.GetAppendBuffer().) 886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The returned buffer is only valid until the next write operation 906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * on this string. 916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * After writing at most resultCapacity bytes, call append() with the 936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * pointer returned from this function and the number of bytes written. 946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * 956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param minCapacity required minimum capacity of the returned buffer; 966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * must be non-negative 976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param desiredCapacityHint desired capacity of the returned buffer; 986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * must be non-negative 996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param resultCapacity will be set to the capacity of the returned buffer 1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param errorCode in/out error code 1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return a buffer with resultCapacity>=min_capacity 1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org char *getAppendBuffer(int32_t minCapacity, 1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t desiredCapacityHint, 1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t &resultCapacity, 1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UErrorCode &errorCode); 1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString &appendInvariantChars(const UnicodeString &s, UErrorCode &errorCode); 1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org /** 1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Appends a filename/path part, e.g., a directory name. 1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * First appends a U_FILE_SEP_CHAR if necessary. 1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Does nothing if s is empty. 1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */ 1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString &appendPathPart(const StringPiece &s, UErrorCode &errorCode); 1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate: 1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org MaybeStackArray<char, 40> buffer; 1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org int32_t len; 1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org UBool ensureCapacity(int32_t capacity, int32_t desiredCapacityHint, UErrorCode &errorCode); 1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString(const CharString &other); // forbid copying of this class 1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org CharString &operator=(const CharString &other); // forbid copying of this class 1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}; 1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END 1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org 1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif 1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//eof 131