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 &copyFrom(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