16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**********************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Copyright (C) 1998-2013, International Business Machines
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Corporation and others.  All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org**********************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* File unistr.h
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Modification History:
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Date        Name        Description
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   09/25/98    stephen     Creation.
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   11/11/98    stephen     Changed per 11/9 code review.
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   04/20/99    stephen     Overhauled per 4/16 code review.
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   11/18/99    aliu        Made to inherit from Replaceable.  Added method
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*                           handleReplaceBetween(); other methods unchanged.
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   06/25/01    grhoten     Remove dependency on iostream.
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org******************************************************************************
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef UNISTR_H
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UNISTR_H
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: Unicode String
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/utypes.h"
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/rep.h"
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/std_string.h"
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/stringpiece.h"
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/bytestream.h"
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/ucasemap.h"
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgstruct UConverter;          // unicode/ucnv.h
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass  StringThreadTest;
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_COMPARE_CODE_POINT_ORDER
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* see also ustring.h and unorm.h */
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Option bit for u_strCaseCompare, u_strcasecmp, unorm_compare, etc:
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Compare strings in code point order instead of code unit order.
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.2
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define U_COMPARE_CODE_POINT_ORDER  0x8000
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef USTRING_H
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \ingroup ustring_ustrlen
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_STABLE int32_t U_EXPORT2
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgu_strlen(const UChar *s);
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \def U_STRING_CASE_MAPPER_DEFINED
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_STRING_CASE_MAPPER_DEFINED
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define U_STRING_CASE_MAPPER_DEFINED
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Internal string case mapping function type.
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @internal
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgtypedef int32_t U_CALLCONV
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUStringCaseMapper(const UCaseMap *csm,
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  UChar *dest, int32_t destCapacity,
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  const UChar *src, int32_t srcLength,
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  UErrorCode *pErrorCode);
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass BreakIterator;        // unicode/brkiter.h
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass Locale;               // unicode/locid.h
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass StringCharacterIterator;
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass UnicodeStringAppendable;  // unicode/appendable.h
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/* The <iostream> include has been moved to unicode/ustream.h */
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Constant to be used in the UnicodeString(char *, int32_t, EInvariant) constructor
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * which constructs a Unicode string from an invariant-character char * string.
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * About invariant characters see utypes.h.
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This constructor has no runtime dependency on conversion code and is
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * therefore recommended over ones taking a charset name string
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (where the empty string "" indicates invariant-character conversion).
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 3.2
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define US_INV icu::UnicodeString::kInvariant
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Unicode String literals in C++.
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Dependent on the platform properties, different UnicodeString
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * constructors should be used to create a UnicodeString object from
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a string literal.
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The macros are defined for maximum performance.
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * They work only for strings that contain "invariant characters", i.e.,
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * only latin letters, digits, and some punctuation.
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * See utypes.h for details.
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The string parameter must be a C string literal.
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The length of the string, not including the terminating
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>NUL</code>, must be specified as a constant.
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The U_STRING_DECL macro should be invoked exactly once for one
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * such string variable before it is used.
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.0
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if defined(U_DECLARE_UTF16)
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const UChar *)U_DECLARE_UTF16(cs), _length)
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_SIZEOF_WCHAR_T==U_SIZEOF_UCHAR && (U_CHARSET_FAMILY==U_ASCII_FAMILY || (U_SIZEOF_UCHAR == 2 && defined(U_WCHAR_IS_UTF16)))
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const UChar *)L ## cs, _length)
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#elif U_SIZEOF_UCHAR==1 && U_CHARSET_FAMILY==U_ASCII_FAMILY
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define UNICODE_STRING(cs, _length) icu::UnicodeString(TRUE, (const UChar *)cs, _length)
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#else
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define UNICODE_STRING(cs, _length) icu::UnicodeString(cs, _length, US_INV)
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Unicode String literals in C++.
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Dependent on the platform properties, different UnicodeString
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * constructors should be used to create a UnicodeString object from
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a string literal.
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The macros are defined for improved performance.
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * They work only for strings that contain "invariant characters", i.e.,
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * only latin letters, digits, and some punctuation.
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * See utypes.h for details.
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The string parameter must be a C string literal.
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.0
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UNICODE_STRING_SIMPLE(cs) UNICODE_STRING(cs, -1)
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \def UNISTR_FROM_CHAR_EXPLICIT
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This can be defined to be empty or "explicit".
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If explicit, then the UnicodeString(UChar) and UnicodeString(UChar32)
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * constructors are marked as explicit, preventing their inadvertent use.
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 49
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef UNISTR_FROM_CHAR_EXPLICIT
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# if defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION)
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Auto-"explicit" in ICU library code.
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define UNISTR_FROM_CHAR_EXPLICIT explicit
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# else
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Empty by default for source code compatibility.
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define UNISTR_FROM_CHAR_EXPLICIT
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# endif
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \def UNISTR_FROM_STRING_EXPLICIT
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This can be defined to be empty or "explicit".
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If explicit, then the UnicodeString(const char *) and UnicodeString(const UChar *)
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * constructors are marked as explicit, preventing their inadvertent use.
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * In particular, this helps prevent accidentally depending on ICU conversion code
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * by passing a string literal into an API with a const UnicodeString & parameter.
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 49
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef UNISTR_FROM_STRING_EXPLICIT
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# if defined(U_COMBINED_IMPLEMENTATION) || defined(U_COMMON_IMPLEMENTATION) || defined(U_I18N_IMPLEMENTATION) || defined(U_IO_IMPLEMENTATION)
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Auto-"explicit" in ICU library code.
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define UNISTR_FROM_STRING_EXPLICIT explicit
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# else
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Empty by default for source code compatibility.
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#   define UNISTR_FROM_STRING_EXPLICIT
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org# endif
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UnicodeString is a string class that stores Unicode characters directly and provides
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * similar functionality as the Java String and StringBuffer classes.
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * It is a concrete implementation of the abstract class Replaceable (for transliteration).
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * The UnicodeString class is not suitable for subclassing.
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>For an overview of Unicode strings in C and C++ see the
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <a href="http://icu-project.org/userguide/strings.html">User Guide Strings chapter</a>.</p>
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>In ICU, a Unicode string consists of 16-bit Unicode <em>code units</em>.
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A Unicode character may be stored with either one code unit
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (the most common case) or with a matched pair of special code units
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ("surrogates"). The data type for code units is UChar.
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For single-character handling, a Unicode character code <em>point</em> is a value
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * in the range 0..0x10ffff. ICU uses the UChar32 type for code points.</p>
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Indexes and offsets into and lengths of strings always count code units, not code points.
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This is the same as with multi-byte char* strings in traditional string handling.
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Operations on partial strings typically do not test for code point boundaries.
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * If necessary, the user needs to take care of such boundaries by testing for the code unit
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * values or by using functions like
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UnicodeString::getChar32Start() and UnicodeString::getChar32Limit()
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * (or, in C, the equivalent macros U16_SET_CP_START() and U16_SET_CP_LIMIT(), see utf.h).</p>
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * UnicodeString methods are more lenient with regard to input parameter values
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * than other ICU APIs. In particular:
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - If indexes are out of bounds for a UnicodeString object
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   (<0 or >length()) then they are "pinned" to the nearest boundary.
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - If primitive string pointer values (e.g., const UChar * or char *)
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   for input strings are NULL, then those input string parameters are treated
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   as if they pointed to an empty string.
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   However, this is <em>not</em> the case for char * parameters for charset names
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   or other IDs.
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * - Most UnicodeString methods do not take a UErrorCode parameter because
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   there are usually very few opportunities for failure other than a shortage
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   of memory, error codes in low-level C++ string methods would be inconvenient,
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   and the error code as the last parameter (ICU convention) would prevent
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   the use of default parameter values.
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Instead, such methods set the UnicodeString into a "bogus" state
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   (see isBogus()) if an error occurs.
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * In string comparisons, two UnicodeString objects that are both "bogus"
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * compare equal (to be transitive and prevent endless loops in sorting),
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * and a "bogus" string compares less than any non-"bogus" one.
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Const UnicodeString methods are thread-safe. Multiple threads can use
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * const methods on the same UnicodeString object simultaneously,
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * but non-const methods must not be called concurrently (in multiple threads)
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with any other (const or non-const) methods.
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Similarly, const UnicodeString & parameters are thread-safe.
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * One object may be passed in as such a parameter concurrently in multiple threads.
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * This includes the const UnicodeString & parameters for
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * copy construction, assignment, and cloning.
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>UnicodeString uses several storage methods.
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * String contents can be stored inside the UnicodeString object itself,
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * in an allocated and shared buffer, or in an outside buffer that is "aliased".
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Most of this is done transparently, but careful aliasing in particular provides
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * significant performance improvements.
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Also, the internal buffer is accessible via special functions.
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * For details see the
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <a href="http://icu-project.org/userguide/strings.html">User Guide Strings chapter</a>.</p>
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see utf.h
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @see CharacterIterator
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.0
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API UnicodeString : public Replaceable
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Constant to be used in the UnicodeString(char *, int32_t, EInvariant) constructor
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * which constructs a Unicode string from an invariant-character char * string.
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Use the macro US_INV instead of the full qualification for this value.
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see US_INV
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 3.2
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  enum EInvariant {
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see EInvariant
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.2
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kInvariant
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  };
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //========================================
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Read-only operations
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //========================================
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Comparison - bitwise only - for international comparison use collation */
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Equality operator. Performs only bitwise comparison.
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The UnicodeString to compare to this one.
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if <TT>text</TT> contains the same characters as this one,
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * FALSE otherwise.
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool operator== (const UnicodeString& text) const;
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Inequality operator. Performs only bitwise comparison.
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The UnicodeString to compare to this one.
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return FALSE if <TT>text</TT> contains the same characters as this one,
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * TRUE otherwise.
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool operator!= (const UnicodeString& text) const;
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Greater than operator. Performs only bitwise comparison.
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The UnicodeString to compare to this one.
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if the characters in this are bitwise
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * greater than the characters in <code>text</code>, FALSE otherwise
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool operator> (const UnicodeString& text) const;
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Less than operator. Performs only bitwise comparison.
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The UnicodeString to compare to this one.
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if the characters in this are bitwise
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * less than the characters in <code>text</code>, FALSE otherwise
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool operator< (const UnicodeString& text) const;
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Greater than or equal operator. Performs only bitwise comparison.
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The UnicodeString to compare to this one.
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if the characters in this are bitwise
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * greater than or equal to the characters in <code>text</code>, FALSE otherwise
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool operator>= (const UnicodeString& text) const;
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Less than or equal operator. Performs only bitwise comparison.
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The UnicodeString to compare to this one.
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if the characters in this are bitwise
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * less than or equal to the characters in <code>text</code>, FALSE otherwise
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool operator<= (const UnicodeString& text) const;
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare the characters bitwise in this UnicodeString to
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the characters in <code>text</code>.
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The UnicodeString to compare to this one.
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The result of bitwise character comparison: 0 if this
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * contains the same characters as <code>text</code>, -1 if the characters in
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this are bitwise less than the characters in <code>text</code>, +1 if the
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * characters in this are bitwise greater than the characters
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <code>text</code>.
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compare(const UnicodeString& text) const;
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare the characters bitwise in the range
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) with the characters
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the <b>entire string</b> <TT>text</TT>.
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * (The parameters "start" and "length" are not applied to the other text "text".)
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the compare operation begins
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters of text to compare.
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text the other text to be compared against this string.
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The result of bitwise character comparison: 0 if this
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * contains the same characters as <code>text</code>, -1 if the characters in
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this are bitwise less than the characters in <code>text</code>, +1 if the
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * characters in this are bitwise greater than the characters
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <code>text</code>.
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compare(int32_t start,
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t length,
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const UnicodeString& text) const;
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare the characters bitwise in the range
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) with the characters
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcText</TT> in the range
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the compare operation begins
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters in this to compare.
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the text to be compared
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> to start comparison
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>src</TT> to compare
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The result of bitwise character comparison: 0 if this
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * contains the same characters as <code>srcText</code>, -1 if the characters in
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this are bitwise less than the characters in <code>srcText</code>, +1 if the
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * characters in this are bitwise greater than the characters
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <code>srcText</code>.
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   inline int8_t compare(int32_t start,
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t length,
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const UnicodeString& srcText,
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t srcStart,
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t srcLength) const;
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare the characters bitwise in this UnicodeString with the first
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcLength</TT> characters in <TT>srcChars</TT>.
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The characters to compare to this UnicodeString.
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT> to compare
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The result of bitwise character comparison: 0 if this
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * contains the same characters as <code>srcChars</code>, -1 if the characters in
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this are bitwise less than the characters in <code>srcChars</code>, +1 if the
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * characters in this are bitwise greater than the characters
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <code>srcChars</code>.
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compare(const UChar *srcChars,
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t srcLength) const;
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare the characters bitwise in the range
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) with the first
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>length</TT> characters in <TT>srcChars</TT>
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the compare operation begins
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters to compare.
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars the characters to be compared
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The result of bitwise character comparison: 0 if this
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * contains the same characters as <code>srcChars</code>, -1 if the characters in
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this are bitwise less than the characters in <code>srcChars</code>, +1 if the
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * characters in this are bitwise greater than the characters
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <code>srcChars</code>.
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compare(int32_t start,
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t length,
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const UChar *srcChars) const;
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare the characters bitwise in the range
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) with the characters
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcChars</TT> in the range
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the compare operation begins
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters in this to compare
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars the characters to be compared
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcChars</TT> to start comparison
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT> to compare
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The result of bitwise character comparison: 0 if this
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * contains the same characters as <code>srcChars</code>, -1 if the characters in
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this are bitwise less than the characters in <code>srcChars</code>, +1 if the
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * characters in this are bitwise greater than the characters
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <code>srcChars</code>.
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compare(int32_t start,
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t length,
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const UChar *srcChars,
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t srcStart,
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t srcLength) const;
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare the characters bitwise in the range
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>limit</TT>) with the characters
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcText</TT> in the range
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcLimit</TT>).
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the compare operation begins
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit the offset immediately following the compare operation
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the text to be compared
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> to start comparison
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLimit the offset into <TT>srcText</TT> to limit comparison
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The result of bitwise character comparison: 0 if this
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * contains the same characters as <code>srcText</code>, -1 if the characters in
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this are bitwise less than the characters in <code>srcText</code>, +1 if the
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * characters in this are bitwise greater than the characters
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <code>srcText</code>.
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compareBetween(int32_t start,
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t limit,
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UnicodeString& srcText,
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcStart,
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLimit) const;
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two Unicode strings in code point order.
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The result may be different from the results of compare(), operator<, etc.
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if supplementary characters are present:
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In UTF-16, supplementary characters (with code points U+10000 and above) are
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * stored with pairs of surrogate code units. These have values from 0xd800 to 0xdfff,
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * which means that they compare as less than some other BMP characters like U+feff.
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function compares Unicode strings in code point order.
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If either of the UTF-16 strings is malformed (i.e., it contains unpaired surrogates), then the result is not defined.
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text Another string to compare this one to.
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a negative/zero/positive integer corresponding to whether
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this string is less than/equal to/greater than the second one
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in code point order
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compareCodePointOrder(const UnicodeString& text) const;
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two Unicode strings in code point order.
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The result may be different from the results of compare(), operator<, etc.
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if supplementary characters are present:
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In UTF-16, supplementary characters (with code points U+10000 and above) are
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * stored with pairs of surrogate code units. These have values from 0xd800 to 0xdfff,
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * which means that they compare as less than some other BMP characters like U+feff.
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function compares Unicode strings in code point order.
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If either of the UTF-16 strings is malformed (i.e., it contains unpaired surrogates), then the result is not defined.
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The start offset in this string at which the compare operation begins.
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of code units from this string to compare.
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText Another string to compare this one to.
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a negative/zero/positive integer corresponding to whether
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this string is less than/equal to/greater than the second one
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in code point order
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compareCodePointOrder(int32_t start,
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      int32_t length,
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      const UnicodeString& srcText) const;
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two Unicode strings in code point order.
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The result may be different from the results of compare(), operator<, etc.
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if supplementary characters are present:
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In UTF-16, supplementary characters (with code points U+10000 and above) are
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * stored with pairs of surrogate code units. These have values from 0xd800 to 0xdfff,
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * which means that they compare as less than some other BMP characters like U+feff.
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function compares Unicode strings in code point order.
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If either of the UTF-16 strings is malformed (i.e., it contains unpaired surrogates), then the result is not defined.
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The start offset in this string at which the compare operation begins.
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of code units from this string to compare.
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText Another string to compare this one to.
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart The start offset in that string at which the compare operation begins.
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength The number of code units from that string to compare.
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a negative/zero/positive integer corresponding to whether
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this string is less than/equal to/greater than the second one
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in code point order
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   inline int8_t compareCodePointOrder(int32_t start,
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       int32_t length,
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       const UnicodeString& srcText,
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       int32_t srcStart,
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       int32_t srcLength) const;
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two Unicode strings in code point order.
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The result may be different from the results of compare(), operator<, etc.
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if supplementary characters are present:
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In UTF-16, supplementary characters (with code points U+10000 and above) are
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * stored with pairs of surrogate code units. These have values from 0xd800 to 0xdfff,
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * which means that they compare as less than some other BMP characters like U+feff.
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function compares Unicode strings in code point order.
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If either of the UTF-16 strings is malformed (i.e., it contains unpaired surrogates), then the result is not defined.
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars A pointer to another string to compare this one to.
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength The number of code units from that string to compare.
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a negative/zero/positive integer corresponding to whether
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this string is less than/equal to/greater than the second one
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in code point order
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compareCodePointOrder(const UChar *srcChars,
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      int32_t srcLength) const;
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two Unicode strings in code point order.
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The result may be different from the results of compare(), operator<, etc.
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if supplementary characters are present:
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In UTF-16, supplementary characters (with code points U+10000 and above) are
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * stored with pairs of surrogate code units. These have values from 0xd800 to 0xdfff,
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * which means that they compare as less than some other BMP characters like U+feff.
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function compares Unicode strings in code point order.
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If either of the UTF-16 strings is malformed (i.e., it contains unpaired surrogates), then the result is not defined.
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The start offset in this string at which the compare operation begins.
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of code units from this string to compare.
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars A pointer to another string to compare this one to.
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a negative/zero/positive integer corresponding to whether
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this string is less than/equal to/greater than the second one
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in code point order
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compareCodePointOrder(int32_t start,
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      int32_t length,
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      const UChar *srcChars) const;
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two Unicode strings in code point order.
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The result may be different from the results of compare(), operator<, etc.
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if supplementary characters are present:
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In UTF-16, supplementary characters (with code points U+10000 and above) are
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * stored with pairs of surrogate code units. These have values from 0xd800 to 0xdfff,
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * which means that they compare as less than some other BMP characters like U+feff.
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function compares Unicode strings in code point order.
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If either of the UTF-16 strings is malformed (i.e., it contains unpaired surrogates), then the result is not defined.
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The start offset in this string at which the compare operation begins.
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of code units from this string to compare.
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars A pointer to another string to compare this one to.
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart The start offset in that string at which the compare operation begins.
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength The number of code units from that string to compare.
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a negative/zero/positive integer corresponding to whether
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this string is less than/equal to/greater than the second one
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in code point order
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compareCodePointOrder(int32_t start,
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      int32_t length,
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      const UChar *srcChars,
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      int32_t srcStart,
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      int32_t srcLength) const;
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two Unicode strings in code point order.
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The result may be different from the results of compare(), operator<, etc.
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if supplementary characters are present:
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In UTF-16, supplementary characters (with code points U+10000 and above) are
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * stored with pairs of surrogate code units. These have values from 0xd800 to 0xdfff,
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * which means that they compare as less than some other BMP characters like U+feff.
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function compares Unicode strings in code point order.
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If either of the UTF-16 strings is malformed (i.e., it contains unpaired surrogates), then the result is not defined.
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The start offset in this string at which the compare operation begins.
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit The offset after the last code unit from this string to compare.
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText Another string to compare this one to.
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart The start offset in that string at which the compare operation begins.
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLimit The offset after the last code unit from that string to compare.
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a negative/zero/positive integer corresponding to whether
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this string is less than/equal to/greater than the second one
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in code point order
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t compareCodePointOrderBetween(int32_t start,
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                             int32_t limit,
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                             const UnicodeString& srcText,
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                             int32_t srcStart,
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                             int32_t srcLimit) const;
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two strings case-insensitively using full case folding.
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This is equivalent to this->foldCase(options).compare(text.foldCase(options)).
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text Another string to compare this one to.
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param options A bit set of options:
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Comparison in code unit order with default case folding.
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_COMPARE_CODE_POINT_ORDER
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Set to choose code point order instead of code unit order
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     (see u_strCompare for details).
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A negative, zero, or positive integer indicating the comparison result.
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t caseCompare(const UnicodeString& text, uint32_t options) const;
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two strings case-insensitively using full case folding.
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This is equivalent to this->foldCase(options).compare(srcText.foldCase(options)).
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The start offset in this string at which the compare operation begins.
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of code units from this string to compare.
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText Another string to compare this one to.
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param options A bit set of options:
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Comparison in code unit order with default case folding.
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_COMPARE_CODE_POINT_ORDER
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Set to choose code point order instead of code unit order
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     (see u_strCompare for details).
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A negative, zero, or positive integer indicating the comparison result.
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t caseCompare(int32_t start,
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t length,
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const UnicodeString& srcText,
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         uint32_t options) const;
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two strings case-insensitively using full case folding.
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This is equivalent to this->foldCase(options).compare(srcText.foldCase(options)).
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The start offset in this string at which the compare operation begins.
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of code units from this string to compare.
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText Another string to compare this one to.
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart The start offset in that string at which the compare operation begins.
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength The number of code units from that string to compare.
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param options A bit set of options:
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Comparison in code unit order with default case folding.
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_COMPARE_CODE_POINT_ORDER
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Set to choose code point order instead of code unit order
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     (see u_strCompare for details).
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A negative, zero, or positive integer indicating the comparison result.
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t caseCompare(int32_t start,
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t length,
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const UnicodeString& srcText,
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t srcStart,
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t srcLength,
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         uint32_t options) const;
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two strings case-insensitively using full case folding.
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This is equivalent to this->foldCase(options).compare(srcChars.foldCase(options)).
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars A pointer to another string to compare this one to.
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength The number of code units from that string to compare.
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param options A bit set of options:
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Comparison in code unit order with default case folding.
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_COMPARE_CODE_POINT_ORDER
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Set to choose code point order instead of code unit order
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     (see u_strCompare for details).
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A negative, zero, or positive integer indicating the comparison result.
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t caseCompare(const UChar *srcChars,
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t srcLength,
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         uint32_t options) const;
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two strings case-insensitively using full case folding.
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This is equivalent to this->foldCase(options).compare(srcChars.foldCase(options)).
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The start offset in this string at which the compare operation begins.
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of code units from this string to compare.
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars A pointer to another string to compare this one to.
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param options A bit set of options:
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Comparison in code unit order with default case folding.
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_COMPARE_CODE_POINT_ORDER
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Set to choose code point order instead of code unit order
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     (see u_strCompare for details).
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A negative, zero, or positive integer indicating the comparison result.
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t caseCompare(int32_t start,
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t length,
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const UChar *srcChars,
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         uint32_t options) const;
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two strings case-insensitively using full case folding.
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This is equivalent to this->foldCase(options).compare(srcChars.foldCase(options)).
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The start offset in this string at which the compare operation begins.
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of code units from this string to compare.
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars A pointer to another string to compare this one to.
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart The start offset in that string at which the compare operation begins.
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength The number of code units from that string to compare.
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param options A bit set of options:
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Comparison in code unit order with default case folding.
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_COMPARE_CODE_POINT_ORDER
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Set to choose code point order instead of code unit order
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     (see u_strCompare for details).
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A negative, zero, or positive integer indicating the comparison result.
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t caseCompare(int32_t start,
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t length,
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         const UChar *srcChars,
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t srcStart,
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t srcLength,
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         uint32_t options) const;
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Compare two strings case-insensitively using full case folding.
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This is equivalent to this->foldCase(options).compareBetween(text.foldCase(options)).
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The start offset in this string at which the compare operation begins.
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit The offset after the last code unit from this string to compare.
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText Another string to compare this one to.
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart The start offset in that string at which the compare operation begins.
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLimit The offset after the last code unit from that string to compare.
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param options A bit set of options:
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_DEFAULT or 0 is used for default options:
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Comparison in code unit order with default case folding.
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_COMPARE_CODE_POINT_ORDER
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     Set to choose code point order instead of code unit order
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *     (see u_strCompare for details).
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   - U_FOLD_CASE_EXCLUDE_SPECIAL_I
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A negative, zero, or positive integer indicating the comparison result.
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t caseCompareBetween(int32_t start,
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t limit,
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UnicodeString& srcText,
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcStart,
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLimit,
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            uint32_t options) const;
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine if this starts with the characters in <TT>text</TT>
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The text to match.
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if this starts with the characters in <TT>text</TT>,
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * FALSE otherwise
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool startsWith(const UnicodeString& text) const;
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine if this starts with the characters in <TT>srcText</TT>
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the range [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText The text to match.
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> to start matching
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcText</TT> to match
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if this starts with the characters in <TT>text</TT>,
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * FALSE otherwise
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool startsWith(const UnicodeString& srcText,
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcStart,
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength) const;
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine if this starts with the characters in <TT>srcChars</TT>
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The characters to match.
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT>
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if this starts with the characters in <TT>srcChars</TT>,
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * FALSE otherwise
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool startsWith(const UChar *srcChars,
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength) const;
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine if this ends with the characters in <TT>srcChars</TT>
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the range  [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The characters to match.
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> to start matching
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT> to match
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if this ends with the characters in <TT>srcChars</TT>, FALSE otherwise
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool startsWith(const UChar *srcChars,
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcStart,
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength) const;
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine if this ends with the characters in <TT>text</TT>
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The text to match.
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if this ends with the characters in <TT>text</TT>,
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * FALSE otherwise
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool endsWith(const UnicodeString& text) const;
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine if this ends with the characters in <TT>srcText</TT>
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the range [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText The text to match.
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> to start matching
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcText</TT> to match
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if this ends with the characters in <TT>text</TT>,
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * FALSE otherwise
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool endsWith(const UnicodeString& srcText,
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t srcStart,
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t srcLength) const;
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine if this ends with the characters in <TT>srcChars</TT>
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The characters to match.
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT>
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if this ends with the characters in <TT>srcChars</TT>,
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * FALSE otherwise
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool endsWith(const UChar *srcChars,
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t srcLength) const;
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine if this ends with the characters in <TT>srcChars</TT>
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the range  [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The characters to match.
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> to start matching
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT> to match
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if this ends with the characters in <TT>srcChars</TT>,
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * FALSE otherwise
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool endsWith(const UChar *srcChars,
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t srcStart,
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          int32_t srcLength) const;
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Searching - bitwise only */
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence of the characters in <TT>text</TT>,
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The text to search for.
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(const UnicodeString& text) const;
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence of the characters in <TT>text</TT>
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * starting at offset <TT>start</TT>, using bitwise comparison.
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The text to search for.
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The offset at which searching will start.
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(const UnicodeString& text,
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start) const;
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence in the range
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) of the characters
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>text</TT>, using bitwise comparison.
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The text to search for.
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The offset at which searching will start.
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of characters to search
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(const UnicodeString& text,
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence in the range
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) of the characters
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *  in <TT>srcText</TT> in the range
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>),
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText The text to search for.
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> at which
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to start matching
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcText</TT> to match
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset into this at which to start matching
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters in this to search
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(const UnicodeString& srcText,
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcStart,
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength,
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence of the characters in
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcChars</TT>
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * starting at offset <TT>start</TT>, using bitwise comparison.
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The text to search for.
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT> to match
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset into this at which to start matching
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(const UChar *srcChars,
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength,
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start) const;
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence in the range
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) of the characters
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcChars</TT>, using bitwise comparison.
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The text to search for.
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT>
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The offset at which searching will start.
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of characters to search
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>srcChars</TT>,
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(const UChar *srcChars,
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength,
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence in the range
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) of the characters
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcChars</TT> in the range
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>),
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The text to search for.
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcChars</TT> at which
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to start matching
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT> to match
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset into this at which to start matching
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters in this to search
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t indexOf(const UChar *srcChars,
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcStart,
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength,
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence of the BMP code point <code>c</code>,
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code unit to search for.
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(UChar c) const;
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence of the code point <TT>c</TT>,
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code point to search for.
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(UChar32 c) const;
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence of the BMP code point <code>c</code>,
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * starting at offset <TT>start</TT>, using bitwise comparison.
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code unit to search for.
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The offset at which searching will start.
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(UChar c,
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start) const;
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence of the code point <TT>c</TT>
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * starting at offset <TT>start</TT>, using bitwise comparison.
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code point to search for.
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The offset at which searching will start.
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(UChar32 c,
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start) const;
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence of the BMP code point <code>c</code>
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the range [<TT>start</TT>, <TT>start + length</TT>),
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code unit to search for.
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset into this at which to start matching
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters in this to search
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(UChar c,
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the first occurrence of the code point <TT>c</TT>
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the range [<TT>start</TT>, <TT>start + length</TT>),
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code point to search for.
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset into this at which to start matching
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters in this to search
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t indexOf(UChar32 c,
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence of the characters in <TT>text</TT>,
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The text to search for.
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(const UnicodeString& text) const;
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence of the characters in <TT>text</TT>
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * starting at offset <TT>start</TT>, using bitwise comparison.
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The text to search for.
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The offset at which searching will start.
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(const UnicodeString& text,
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start) const;
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence in the range
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) of the characters
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>text</TT>, using bitwise comparison.
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The text to search for.
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The offset at which searching will start.
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of characters to search
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(const UnicodeString& text,
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence in the range
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) of the characters
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcText</TT> in the range
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>),
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText The text to search for.
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> at which
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to start matching
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcText</TT> to match
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset into this at which to start matching
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters in this to search
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(const UnicodeString& srcText,
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcStart,
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength,
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence of the characters in <TT>srcChars</TT>
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * starting at offset <TT>start</TT>, using bitwise comparison.
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The text to search for.
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT> to match
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset into this at which to start matching
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(const UChar *srcChars,
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength,
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start) const;
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence in the range
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) of the characters
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcChars</TT>, using bitwise comparison.
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The text to search for.
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT>
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The offset at which searching will start.
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length The number of characters to search
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>srcChars</TT>,
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(const UChar *srcChars,
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength,
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence in the range
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) of the characters
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcChars</TT> in the range
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>),
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars The text to search for.
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcChars</TT> at which
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to start matching
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT> to match
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset into this at which to start matching
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters in this to search
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of the start of <TT>text</TT>,
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or -1 if not found.
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t lastIndexOf(const UChar *srcChars,
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcStart,
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength,
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence of the BMP code point <code>c</code>,
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code unit to search for.
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(UChar c) const;
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence of the code point <TT>c</TT>,
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code point to search for.
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(UChar32 c) const;
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence of the BMP code point <code>c</code>
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * starting at offset <TT>start</TT>, using bitwise comparison.
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code unit to search for.
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The offset at which searching will start.
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(UChar c,
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start) const;
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence of the code point <TT>c</TT>
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * starting at offset <TT>start</TT>, using bitwise comparison.
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code point to search for.
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start The offset at which searching will start.
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(UChar32 c,
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start) const;
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence of the BMP code point <code>c</code>
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the range [<TT>start</TT>, <TT>start + length</TT>),
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code unit to search for.
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset into this at which to start matching
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters in this to search
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(UChar c,
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Locate in this the last occurrence of the code point <TT>c</TT>
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the range [<TT>start</TT>, <TT>start + length</TT>),
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * using bitwise comparison.
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c The code point to search for.
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset into this at which to start matching
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters in this to search
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The offset into this of <TT>c</TT>, or -1 if not found.
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t lastIndexOf(UChar32 c,
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t start,
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t length) const;
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Character access */
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return the code unit at offset <tt>offset</tt>.
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the offset is not valid (0..length()-1) then U+ffff is returned.
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param offset a valid offset into the text
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the code unit at offset <tt>offset</tt>
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *         or 0xffff if the offset is not valid for this string
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UChar charAt(int32_t offset) const;
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return the code unit at offset <tt>offset</tt>.
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the offset is not valid (0..length()-1) then U+ffff is returned.
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param offset a valid offset into the text
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the code unit at offset <tt>offset</tt>
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UChar operator[] (int32_t offset) const;
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return the code point that contains the code unit
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * at offset <tt>offset</tt>.
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the offset is not valid (0..length()-1) then U+ffff is returned.
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param offset a valid offset into the text
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * that indicates the text offset of any of the code units
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * that will be assembled into a code point (21-bit value) and returned
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the code point of text at <tt>offset</tt>
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *         or 0xffff if the offset is not valid for this string
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UChar32 char32At(int32_t offset) const;
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Adjust a random-access offset so that
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * it points to the beginning of a Unicode character.
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The offset that is passed in points to
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * any code unit of a code point,
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * while the returned offset will point to the first code unit
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * of the same code point.
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In UTF-16, if the input offset points to a second surrogate
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * of a surrogate pair, then the returned offset will point
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to the first surrogate.
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param offset a valid offset into one code point of the text
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return offset of the first code unit of the same code point
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see U16_SET_CP_START
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t getChar32Start(int32_t offset) const;
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Adjust a random-access offset so that
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * it points behind a Unicode character.
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The offset that is passed in points behind
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * any code unit of a code point,
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * while the returned offset will point behind the last code unit
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * of the same code point.
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In UTF-16, if the input offset points behind the first surrogate
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * (i.e., to the second surrogate)
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * of a surrogate pair, then the returned offset will point
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * behind the second surrogate (i.e., to the first surrogate).
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param offset a valid offset after any code unit of a code point of the text
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return offset of the first code unit after the same code point
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see U16_SET_CP_LIMIT
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t getChar32Limit(int32_t offset) const;
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Move the code unit index along the string by delta code points.
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Interpret the input index as a code unit-based offset into the string,
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * move the index forward or backward by delta code points, and
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * return the resulting index.
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The input index should point to the first code unit of a code point,
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if there is more than one.
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Both input and output indexes are code unit-based as for all
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * string indexes/offsets in ICU (and other libraries, like MBCS char*).
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If delta<0 then the index is moved backward (toward the start of the string).
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If delta>0 then the index is moved forward (toward the end of the string).
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This behaves like CharacterIterator::move32(delta, kCurrent).
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Behavior for out-of-bounds indexes:
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <code>moveIndex32</code> pins the input index to 0..length(), i.e.,
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if the input index<0 then it is pinned to 0;
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if it is index>length() then it is pinned to length().
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Afterwards, the index is moved by <code>delta</code> code points
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * forward or backward,
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * but no further backward than to 0 and no further forward than to length().
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The resulting index return value will be in between 0 and length(), inclusively.
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Examples:
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <pre>
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * // s has code points 'a' U+10000 'b' U+10ffff U+2029
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * UnicodeString s=UNICODE_STRING("a\\U00010000b\\U0010ffff\\u2029", 31).unescape();
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * // initial index: position of U+10000
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * int32_t index=1;
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * // the following examples will all result in index==4, position of U+10ffff
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * // skip 2 code points from some position in the string
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * index=s.moveIndex32(index, 2); // skips U+10000 and 'b'
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * // go to the 3rd code point from the start of s (0-based)
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * index=s.moveIndex32(0, 3); // skips 'a', U+10000, and 'b'
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * // go to the next-to-last code point of s
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * index=s.moveIndex32(s.length(), -2); // backward-skips U+2029 and U+10ffff
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * </pre>
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param index input code unit index
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param delta (signed) code point count to move the index forward or backward
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *        in the string
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the resulting code unit index
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t moveIndex32(int32_t index, int32_t delta) const;
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Substring extraction */
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy the characters in the range
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<tt>start</tt>, <tt>start + length</tt>) into the array <tt>dst</tt>,
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * beginning at <tt>dstStart</tt>.
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the string aliases to <code>dst</code> itself as an external buffer,
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * then extract() will not copy the contents.
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start offset of first character which will be copied into the array
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters to extract
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param dst array in which to copy characters.  The length of <tt>dst</tt>
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * must be at least (<tt>dstStart + length</tt>).
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param dstStart the offset in <TT>dst</TT> where the first character
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be extracted
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline void extract(int32_t start,
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t length,
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           UChar *dst,
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t dstStart = 0) const;
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy the contents of the string into dest.
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This is a convenience function that
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * checks if there is enough space in dest,
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * extracts the entire string if possible,
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * and NUL-terminates dest if possible.
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the string fits into dest but cannot be NUL-terminated
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * (length()==destCapacity) then the error code is set to U_STRING_NOT_TERMINATED_WARNING.
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the string itself does not fit into dest
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * (length()>destCapacity) then the error code is set to U_BUFFER_OVERFLOW_ERROR.
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the string aliases to <code>dest</code> itself as an external buffer,
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * then extract() will not copy the contents.
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param dest Destination string buffer.
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param destCapacity Number of UChars available at dest.
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param errorCode ICU error code.
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return length()
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  extract(UChar *dest, int32_t destCapacity,
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org          UErrorCode &errorCode) const;
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy the characters in the range
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<tt>start</tt>, <tt>start + length</tt>) into the  UnicodeString
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <tt>target</tt>.
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start offset of first character which will be copied
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters to extract
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param target UnicodeString into which to copy characters.
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to <TT>target</TT>
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline void extract(int32_t start,
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t length,
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           UnicodeString& target) const;
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy the characters in the range [<tt>start</tt>, <tt>limit</tt>)
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * into the array <tt>dst</tt>, beginning at <tt>dstStart</tt>.
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start offset of first character which will be copied into the array
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit offset immediately following the last character to be copied
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param dst array in which to copy characters.  The length of <tt>dst</tt>
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * must be at least (<tt>dstStart + (limit - start)</tt>).
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param dstStart the offset in <TT>dst</TT> where the first character
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be extracted
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline void extractBetween(int32_t start,
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t limit,
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UChar *dst,
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t dstStart = 0) const;
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy the characters in the range [<tt>start</tt>, <tt>limit</tt>)
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * into the UnicodeString <tt>target</tt>.  Replaceable API.
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start offset of first character which will be copied
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit offset immediately following the last character to be copied
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param target UnicodeString into which to copy characters.
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to <TT>target</TT>
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual void extractBetween(int32_t start,
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t limit,
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UnicodeString& target) const;
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy the characters in the range
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<tt>start</TT>, <tt>start + length</TT>) into an array of characters.
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * All characters must be invariant (see utypes.h).
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Use US_INV as the last, signature-distinguishing parameter.
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function does not write any more than <code>targetLength</code>
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * characters but returns the length of the entire output string
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * so that one can allocate a larger buffer and call the function again
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if necessary.
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The output string is NUL-terminated if possible.
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start offset of first character which will be copied
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param startLength the number of characters to extract
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param target the target buffer for extraction, can be NULL
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *               if targetLength is 0
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param targetCapacity the length of the target buffer
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param inv Signature-distinguishing paramater, use US_INV.
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the output string length, not including the terminating NUL
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 3.2
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t extract(int32_t start,
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t startLength,
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           char *target,
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t targetCapacity,
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           enum EInvariant inv) const;
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_CHARSET_IS_UTF8 || !UCONFIG_NO_CONVERSION
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy the characters in the range
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<tt>start</TT>, <tt>start + length</TT>) into an array of characters
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the platform's default codepage.
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function does not write any more than <code>targetLength</code>
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * characters but returns the length of the entire output string
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * so that one can allocate a larger buffer and call the function again
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if necessary.
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The output string is NUL-terminated if possible.
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start offset of first character which will be copied
15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param startLength the number of characters to extract
15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param target the target buffer for extraction
15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param targetLength the length of the target buffer
15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If <TT>target</TT> is NULL, then the number of bytes required for
15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>target</TT> is returned.
15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the output string length, not including the terminating NUL
15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t extract(int32_t start,
15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t startLength,
15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           char *target,
15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           uint32_t targetLength) const;
15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_CONVERSION
15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy the characters in the range
15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<tt>start</TT>, <tt>start + length</TT>) into an array of characters
15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in a specified codepage.
15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The output string is NUL-terminated.
15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Recommendation: For invariant-character strings use
15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * extract(int32_t start, int32_t length, char *target, int32_t targetCapacity, enum EInvariant inv) const
15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * because it avoids object code dependencies of UnicodeString on
15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the conversion code.
15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start offset of first character which will be copied
15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param startLength the number of characters to extract
15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param target the target buffer for extraction
15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param codepage the desired codepage for the characters.  0 has
15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the special meaning of the default codepage
15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If <code>codepage</code> is an empty string (<code>""</code>),
15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * then a simple conversion is performed on the codepage-invariant
15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * subset ("invariant characters") of the platform encoding. See utypes.h.
15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If <TT>target</TT> is NULL, then the number of bytes required for
15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>target</TT> is returned. It is assumed that the target is big enough
15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to fit all of the characters.
15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the output string length, not including the terminating NUL
15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t extract(int32_t start,
15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 int32_t startLength,
15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 char *target,
15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                 const char *codepage = 0) const;
15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy the characters in the range
15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<tt>start</TT>, <tt>start + length</TT>) into an array of characters
15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in a specified codepage.
15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function does not write any more than <code>targetLength</code>
15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * characters but returns the length of the entire output string
15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * so that one can allocate a larger buffer and call the function again
15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if necessary.
15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The output string is NUL-terminated if possible.
15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Recommendation: For invariant-character strings use
15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * extract(int32_t start, int32_t length, char *target, int32_t targetCapacity, enum EInvariant inv) const
15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * because it avoids object code dependencies of UnicodeString on
15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the conversion code.
15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start offset of first character which will be copied
15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param startLength the number of characters to extract
15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param target the target buffer for extraction
15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param targetLength the length of the target buffer
15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param codepage the desired codepage for the characters.  0 has
15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the special meaning of the default codepage
15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If <code>codepage</code> is an empty string (<code>""</code>),
15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * then a simple conversion is performed on the codepage-invariant
15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * subset ("invariant characters") of the platform encoding. See utypes.h.
15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If <TT>target</TT> is NULL, then the number of bytes required for
15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>target</TT> is returned.
15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the output string length, not including the terminating NUL
15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t extract(int32_t start,
16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t startLength,
16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           char *target,
16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           uint32_t targetLength,
16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           const char *codepage) const;
16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Convert the UnicodeString into a codepage string using an existing UConverter.
16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The output string is NUL-terminated if possible.
16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function avoids the overhead of opening and closing a converter if
16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * multiple strings are extracted.
16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param dest destination string buffer, can be NULL if destCapacity==0
16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param destCapacity the number of chars available at dest
16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param cnv the converter object to be used (ucnv_resetFromUnicode() will be called),
16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *        or NULL for the default converter
16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param errorCode normal ICU error code
16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the length of the output string, not counting the terminating NUL;
16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *         if the length is greater than destCapacity, then the string will not fit
16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *         and a buffer of the indicated length would need to be passed in
16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t extract(char *dest, int32_t destCapacity,
16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  UConverter *cnv,
16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  UErrorCode &errorCode) const;
16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Create a temporary substring for the specified range.
16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Unlike the substring constructor and setTo() functions,
16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the object returned here will be a read-only alias (using getBuffer())
16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * rather than copying the text.
16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * As a result, this substring operation is much faster but requires
16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * that the original string not be modified or deleted during the lifetime
16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * of the returned substring object.
16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start offset of the first character visible in the substring
16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length length of the substring
16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a read-only alias UnicodeString object for the substring
16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.4
16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString tempSubString(int32_t start=0, int32_t length=INT32_MAX) const;
16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Create a temporary substring for the specified range.
16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Same as tempSubString(start, length) except that the substring range
16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * is specified as a (start, limit) pair (with an exclusive limit index)
16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * rather than a (start, length) pair.
16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start offset of the first character visible in the substring
16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit offset immediately following the last character visible in the substring
16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a read-only alias UnicodeString object for the substring
16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.4
16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString tempSubStringBetween(int32_t start, int32_t limit=INT32_MAX) const;
16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Convert the UnicodeString to UTF-8 and write the result
16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to a ByteSink. This is called by toUTF8String().
16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Unpaired surrogates are replaced with U+FFFD.
16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Calls u_strToUTF8WithSub().
16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param sink A ByteSink to which the UTF-8 version of the string is written.
16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *             sink.Flush() is called at the end.
16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see toUTF8String
16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void toUTF8(ByteSink &sink) const;
16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_HAVE_STD_STRING
16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Convert the UnicodeString to UTF-8 and append the result
16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to a standard string.
16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Unpaired surrogates are replaced with U+FFFD.
16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Calls toUTF8().
16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param result A standard string (or a compatible object)
16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *        to which the UTF-8 version of the string is appended.
16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The string object.
16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see toUTF8
16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  template<typename StringClass>
16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  StringClass &toUTF8String(StringClass &result) const {
16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    StringByteSink<StringClass> sbs(&result);
16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    toUTF8(sbs);
16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return result;
16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
16926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Convert the UnicodeString to UTF-32.
16936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Unpaired surrogates are replaced with U+FFFD.
16946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Calls u_strToUTF32WithSub().
16956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
16966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param utf32 destination string buffer, can be NULL if capacity==0
16976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param capacity the number of UChar32s available at utf32
16986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param errorCode Standard ICU error code. Its input value must
16996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  pass the U_SUCCESS() test, or else the function returns
17006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  immediately. Check for U_FAILURE() on output or use with
17016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  function chaining. (See User Guide for details.)
17026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The length of the UTF-32 string.
17036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see fromUTF32
17046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
17056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
17066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t toUTF32(UChar32 *utf32, int32_t capacity, UErrorCode &errorCode) const;
17076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Length operations */
17096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
17116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return the length of the UnicodeString object.
17126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The length is the number of UChar code units are in the UnicodeString.
17136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If you want the number of code points, please use countChar32().
17146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the length of the UnicodeString object
17156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see countChar32
17166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
17176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
17186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t length(void) const;
17196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
17216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Count Unicode code points in the length UChar code units of the string.
17226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * A code point may occupy either one or two UChar code units.
17236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Counting code points involves reading all code units.
17246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
17256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This functions is basically the inverse of moveIndex32().
17266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
17276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the index of the first code unit to check
17286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of UChar code units to check
17296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the number of code points in the specified code units
17306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see length
17316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
17326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
17336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t
17346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  countChar32(int32_t start=0, int32_t length=INT32_MAX) const;
17356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
17376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Check if the length UChar code units of the string
17386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * contain more Unicode code points than a certain number.
17396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This is more efficient than counting all code points in this part of the string
17406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * and comparing that number with a threshold.
17416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function may not need to scan the string at all if the length
17426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * falls within a certain range, and
17436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * never needs to count more than 'number+1' code points.
17446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Logically equivalent to (countChar32(start, length)>number).
17456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * A Unicode code point may occupy either one or two UChar code units.
17466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
17476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the index of the first code unit to check (0 for the entire string)
17486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of UChar code units to check
17496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *               (use INT32_MAX for the entire string; remember that start/length
17506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                values are pinned)
17516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param number The number of code points in the (sub)string is compared against
17526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *               the 'number' parameter.
17536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return Boolean value for whether the string contains more Unicode code points
17546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *         than 'number'. Same as (u_countChar32(s, length)>number).
17556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see countChar32
17566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see u_strHasMoreChar32Than
17576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.4
17586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
17596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool
17606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  hasMoreChar32Than(int32_t start, int32_t length, int32_t number) const;
17616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
17636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine if this string is empty.
17646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if this string contains 0 characters, FALSE otherwise.
17656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
17666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
17676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool isEmpty(void) const;
17686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
17706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return the capacity of the internal buffer of the UnicodeString object.
17716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This is useful together with the getBuffer functions.
17726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * See there for details.
17736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
17746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the number of UChars available in the internal buffer
17756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see getBuffer
17766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
17776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
17786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t getCapacity(void) const;
17796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Other operations */
17816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
17836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Generate a hash code for this object.
17846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return The hash code of this UnicodeString.
17856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
17866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
17876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int32_t hashCode(void) const;
17886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
17896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
17906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Determine if this object contains a valid string.
17916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * A bogus string has no value. It is different from an empty string,
17926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * although in both cases isEmpty() returns TRUE and length() returns 0.
17936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * setToBogus() and isBogus() can be used to indicate that no string value is available.
17946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * For a bogus string, getBuffer() and getTerminatedBuffer() return NULL, and
17956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * length() returns 0.
17966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
17976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if the string is bogus/invalid, FALSE otherwise
17986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see setToBogus()
17996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
18006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
18016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool isBogus(void) const;
18026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //========================================
18056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Write operations
18066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //========================================
18076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Assignment operations */
18096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
18116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Assignment operator.  Replace the characters in this UnicodeString
18126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * with the characters from <TT>srcText</TT>.
18136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText The text containing the characters to replace
18146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
18156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
18166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
18176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &operator=(const UnicodeString &srcText);
18186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
18206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Almost the same as the assignment operator.
18216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace the characters in this UnicodeString
18226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * with the characters from <code>srcText</code>.
18236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
18246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function works the same as the assignment operator
18256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * for all strings except for ones that are readonly aliases.
18266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
18276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Starting with ICU 2.4, the assignment operator and the copy constructor
18286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * allocate a new buffer and copy the buffer contents even for readonly aliases.
18296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function implements the old, more efficient but less safe behavior
18306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * of making this string also a readonly alias to the same buffer.
18316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
18326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The fastCopyFrom function must be used only if it is known that the lifetime of
18336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this UnicodeString does not exceed the lifetime of the aliased buffer
18346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * including its contents, for example for strings from resource bundles
18356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or aliases to string constants.
18366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
18376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param src The text containing the characters to replace.
18386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
18396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.4
18406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
18416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &fastCopyFrom(const UnicodeString &src);
18426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
18446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Assignment operator.  Replace the characters in this UnicodeString
18456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * with the code unit <TT>ch</TT>.
18466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param ch the code unit to replace
18476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
18486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
18496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
18506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& operator= (UChar ch);
18516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
18536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Assignment operator.  Replace the characters in this UnicodeString
18546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * with the code point <TT>ch</TT>.
18556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param ch the code point to replace
18566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
18576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
18586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
18596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& operator= (UChar32 ch);
18606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
18626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Set the text in the UnicodeString object to the characters
18636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcText</TT> in the range
18646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcText.length()</TT>).
18656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcText</TT> is not modified.
18666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
18676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> where new characters
18686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be obtained
18696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
18706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.2
18716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
18726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& setTo(const UnicodeString& srcText,
18736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcStart);
18746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
18766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Set the text in the UnicodeString object to the characters
18776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcText</TT> in the range
18786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
18796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcText</TT> is not modified.
18806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
18816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> where new characters
18826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be obtained
18836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcText</TT> in the
18846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * replace string.
18856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
18866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
18876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
18886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& setTo(const UnicodeString& srcText,
18896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcStart,
18906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength);
18916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
18926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
18936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Set the text in the UnicodeString object to the characters in
18946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcText</TT>.
18956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcText</TT> is not modified.
18966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
18976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
18986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
18996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
19006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& setTo(const UnicodeString& srcText);
19016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
19036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Set the characters in the UnicodeString object to the characters
19046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcChars</TT>. <TT>srcChars</TT> is not modified.
19056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars the source for the new characters
19066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of Unicode characters in srcChars.
19076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
19086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
19096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
19106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& setTo(const UChar *srcChars,
19116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength);
19126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
19146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Set the characters in the UnicodeString object to the code unit
19156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcChar</TT>.
19166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChar the code unit which becomes the UnicodeString's character
19176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * content
19186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
19196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
19206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
19216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& setTo(UChar srcChar);
19226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
19246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Set the characters in the UnicodeString object to the code point
19256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcChar</TT>.
19266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChar the code point which becomes the UnicodeString's character
19276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * content
19286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
19296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
19306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
19316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& setTo(UChar32 srcChar);
19326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
19346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Aliasing setTo() function, analogous to the readonly-aliasing UChar* constructor.
19356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The text will be used for the UnicodeString object, but
19366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * it will not be released when the UnicodeString is destroyed.
19376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This has copy-on-write semantics:
19386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * When the string is modified, then the buffer is first copied into
19396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * newly allocated memory.
19406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The aliased buffer is never modified.
19416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
19426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In an assignment to another UnicodeString, when using the copy constructor
19436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or the assignment operator, the text will be copied.
19446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * When using fastCopyFrom(), the text will be aliased again,
19456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * so that both strings then alias the same readonly-text.
19466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
19476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param isTerminated specifies if <code>text</code> is <code>NUL</code>-terminated.
19486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                     This must be true if <code>textLength==-1</code>.
19496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The characters to alias for the UnicodeString.
19506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param textLength The number of Unicode characters in <code>text</code> to alias.
19516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                   If -1, then this constructor will determine the length
19526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                   by calling <code>u_strlen()</code>.
19536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
19546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
19556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
19566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &setTo(UBool isTerminated,
19576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       const UChar *text,
19586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       int32_t textLength);
19596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
19616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Aliasing setTo() function, analogous to the writable-aliasing UChar* constructor.
19626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The text will be used for the UnicodeString object, but
19636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * it will not be released when the UnicodeString is destroyed.
19646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This has write-through semantics:
19656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * For as long as the capacity of the buffer is sufficient, write operations
19666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will directly affect the buffer. When more capacity is necessary, then
19676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * a new buffer will be allocated and the contents copied as with regularly
19686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * constructed strings.
19696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In an assignment to another UnicodeString, the buffer will be copied.
19706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The extract(UChar *dst) function detects whether the dst pointer is the same
19716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * as the string buffer itself and will in this case not copy the contents.
19726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
19736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param buffer The characters to alias for the UnicodeString.
19746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param buffLength The number of Unicode characters in <code>buffer</code> to alias.
19756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param buffCapacity The size of <code>buffer</code> in UChars.
19766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
19776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
19786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
19796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &setTo(UChar *buffer,
19806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       int32_t buffLength,
19816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                       int32_t buffCapacity);
19826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
19836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
19846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Make this UnicodeString object invalid.
19856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The string will test TRUE with isBogus().
19866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
19876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * A bogus string has no value. It is different from an empty string.
19886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It can be used to indicate that no string value is available.
19896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * getBuffer() and getTerminatedBuffer() return NULL, and
19906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * length() returns 0.
19916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
19926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This utility function is used throughout the UnicodeString
19936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * implementation to indicate that a UnicodeString operation failed,
19946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * and may be used in other functions,
19956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * especially but not exclusively when such functions do not
19966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * take a UErrorCode for simplicity.
19976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
19986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The following methods, and no others, will clear a string object's bogus flag:
19996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - remove()
20006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - remove(0, INT32_MAX)
20016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - truncate(0)
20026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - operator=() (assignment operator)
20036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - setTo(...)
20046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
20056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The simplest ways to turn a bogus string into an empty one
20066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * is to use the remove() function.
20076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Examples for other functions that are equivalent to "set to empty string":
20086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \code
20096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * if(s.isBogus()) {
20106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   s.remove();           // set to an empty string (remove all), or
20116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   s.remove(0, INT32_MAX); // set to an empty string (remove all), or
20126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   s.truncate(0);        // set to an empty string (complete truncation), or
20136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   s=UnicodeString();    // assign an empty string, or
20146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   s.setTo((UChar32)-1); // set to a pseudo code point that is out of range, or
20156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   static const UChar nul=0;
20166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   s.setTo(&nul, 0);     // set to an empty C Unicode string
20176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * }
20186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \endcode
20196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
20206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see isBogus()
20216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
20226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
20236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void setToBogus();
20246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
20266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Set the character at the specified offset to the specified character.
20276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param offset A valid offset into the text of the character to set
20286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param ch The new character
20296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to this
20306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
20316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
20326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& setCharAt(int32_t offset,
20336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               UChar ch);
20346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Append operations */
20376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
20396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Append operator. Append the code unit <TT>ch</TT> to the UnicodeString
20406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * object.
20416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param ch the code unit to be appended
20426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
20436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
20446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
20456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inline  UnicodeString& operator+= (UChar ch);
20466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
20486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Append operator. Append the code point <TT>ch</TT> to the UnicodeString
20496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * object.
20506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param ch the code point to be appended
20516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
20526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
20536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
20546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org inline  UnicodeString& operator+= (UChar32 ch);
20556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
20576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Append operator. Append the characters in <TT>srcText</TT> to the
20586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * UnicodeString object. <TT>srcText</TT> is not modified.
20596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
20606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
20616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
20626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
20636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& operator+= (const UnicodeString& srcText);
20646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
20666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Append the characters
20676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcText</TT> in the range
20686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>) to the
20696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * UnicodeString object at offset <TT>start</TT>. <TT>srcText</TT>
20706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * is not modified.
20716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
20726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> where new characters
20736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be obtained
20746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcText</TT> in
20756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the append string
20766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
20776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
20786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
20796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& append(const UnicodeString& srcText,
20806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcStart,
20816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength);
20826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
20846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Append the characters in <TT>srcText</TT> to the UnicodeString object.
20856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcText</TT> is not modified.
20866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
20876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
20886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
20896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
20906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& append(const UnicodeString& srcText);
20916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
20926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
20936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Append the characters in <TT>srcChars</TT> in the range
20946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>) to the UnicodeString
20956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * object at offset
20966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>start</TT>. <TT>srcChars</TT> is not modified.
20976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars the source for the new characters
20986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcChars</TT> where new characters
20996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be obtained
21006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT> in
21016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  the append string; can be -1 if <TT>srcChars</TT> is NUL-terminated
21026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
21036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
21046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
21056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& append(const UChar *srcChars,
21066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcStart,
21076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength);
21086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
21106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Append the characters in <TT>srcChars</TT> to the UnicodeString object
21116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * at offset <TT>start</TT>. <TT>srcChars</TT> is not modified.
21126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars the source for the new characters
21136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of Unicode characters in <TT>srcChars</TT>;
21146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  can be -1 if <TT>srcChars</TT> is NUL-terminated
21156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
21166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
21176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
21186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& append(const UChar *srcChars,
21196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength);
21206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
21226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Append the code unit <TT>srcChar</TT> to the UnicodeString object.
21236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChar the code unit to append
21246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
21256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
21266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
21276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& append(UChar srcChar);
21286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
21306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Append the code point <TT>srcChar</TT> to the UnicodeString object.
21316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChar the code point to append
21326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
21336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
21346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
21356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& append(UChar32 srcChar);
21366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Insert operations */
21396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
21416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Insert the characters in <TT>srcText</TT> in the range
21426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>) into the UnicodeString
21436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * object at offset <TT>start</TT>. <TT>srcText</TT> is not modified.
21446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset where the insertion begins
21456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
21466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> where new characters
21476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be obtained
21486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcText</TT> in
21496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the insert string
21506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
21516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
21526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
21536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& insert(int32_t start,
21546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UnicodeString& srcText,
21556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcStart,
21566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength);
21576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
21596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Insert the characters in <TT>srcText</TT> into the UnicodeString object
21606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * at offset <TT>start</TT>. <TT>srcText</TT> is not modified.
21616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset where the insertion begins
21626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
21636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
21646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
21656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
21666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& insert(int32_t start,
21676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UnicodeString& srcText);
21686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
21706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Insert the characters in <TT>srcChars</TT> in the range
21716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>) into the UnicodeString
21726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *  object at offset <TT>start</TT>. <TT>srcChars</TT> is not modified.
21736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the insertion begins
21746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars the source for the new characters
21756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcChars</TT> where new characters
21766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be obtained
21776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT>
21786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the insert string
21796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
21806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
21816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
21826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& insert(int32_t start,
21836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UChar *srcChars,
21846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcStart,
21856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength);
21866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
21876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
21886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Insert the characters in <TT>srcChars</TT> into the UnicodeString object
21896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * at offset <TT>start</TT>. <TT>srcChars</TT> is not modified.
21906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset where the insertion begins
21916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars the source for the new characters
21926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of Unicode characters in srcChars.
21936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
21946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
21956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
21966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& insert(int32_t start,
21976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            const UChar *srcChars,
21986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength);
21996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
22016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Insert the code unit <TT>srcChar</TT> into the UnicodeString object at
22026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * offset <TT>start</TT>.
22036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the insertion occurs
22046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChar the code unit to insert
22056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
22066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
22076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
22086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& insert(int32_t start,
22096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar srcChar);
22106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
22126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Insert the code point <TT>srcChar</TT> into the UnicodeString object at
22136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * offset <TT>start</TT>.
22146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the insertion occurs
22156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChar the code point to insert
22166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
22176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
22186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
22196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& insert(int32_t start,
22206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            UChar32 srcChar);
22216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Replace operations */
22246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
22266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace the characters in the range
22276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) with the characters in
22286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcText</TT> in the range
22296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>).
22306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcText</TT> is not modified.
22316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the replace operation begins
22326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters to replace. The character at
22336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>start + length</TT> is not modified.
22346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
22356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcText</TT> where new characters
22366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be obtained
22376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcText</TT> in
22386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the replace string
22396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
22406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
22416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
22426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& replace(int32_t start,
22436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t length,
22446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             const UnicodeString& srcText,
22456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t srcStart,
22466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t srcLength);
22476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
22496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace the characters in the range
22506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>)
22516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * with the characters in <TT>srcText</TT>.  <TT>srcText</TT> is
22526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *  not modified.
22536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the replace operation begins
22546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters to replace. The character at
22556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>start + length</TT> is not modified.
22566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
22576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
22586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
22596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
22606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& replace(int32_t start,
22616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t length,
22626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             const UnicodeString& srcText);
22636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
22656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace the characters in the range
22666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) with the characters in
22676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcChars</TT> in the range
22686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcStart + srcLength</TT>). <TT>srcChars</TT>
22696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * is not modified.
22706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the replace operation begins
22716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters to replace.  The character at
22726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>start + length</TT> is not modified.
22736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars the source for the new characters
22746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcChars</TT> where new characters
22756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be obtained
22766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of characters in <TT>srcChars</TT>
22776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the replace string
22786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
22796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
22806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
22816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& replace(int32_t start,
22826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t length,
22836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             const UChar *srcChars,
22846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t srcStart,
22856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t srcLength);
22866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
22876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
22886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace the characters in the range
22896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) with the characters in
22906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcChars</TT>.  <TT>srcChars</TT> is not modified.
22916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the replace operation begins
22926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length number of characters to replace.  The character at
22936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>start + length</TT> is not modified.
22946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChars the source for the new characters
22956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength the number of Unicode characters in srcChars
22966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
22976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
22986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
22996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& replace(int32_t start,
23006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t length,
23016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             const UChar *srcChars,
23026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t srcLength);
23036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
23056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace the characters in the range
23066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) with the code unit
23076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcChar</TT>.
23086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the replace operation begins
23096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters to replace.  The character at
23106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>start + length</TT> is not modified.
23116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChar the new code unit
23126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
23136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
23146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
23156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& replace(int32_t start,
23166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t length,
23176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             UChar srcChar);
23186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
23206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace the characters in the range
23216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) with the code point
23226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>srcChar</TT>.
23236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the replace operation begins
23246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters to replace.  The character at
23256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <TT>start + length</TT> is not modified.
23266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcChar the new code point
23276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
23286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
23296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
23306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& replace(int32_t start, int32_t length, UChar32 srcChar);
23316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
23336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace the characters in the range [<TT>start</TT>, <TT>limit</TT>)
23346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * with the characters in <TT>srcText</TT>. <TT>srcText</TT> is not modified.
23356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the replace operation begins
23366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit the offset immediately following the replace range
23376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
23386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
23396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
23406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
23416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& replaceBetween(int32_t start,
23426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t limit,
23436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UnicodeString& srcText);
23446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
23466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace the characters in the range [<TT>start</TT>, <TT>limit</TT>)
23476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * with the characters in <TT>srcText</TT> in the range
23486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>srcStart</TT>, <TT>srcLimit</TT>). <TT>srcText</TT> is not modified.
23496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset at which the replace operation begins
23506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit the offset immediately following the replace range
23516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcText the source for the new characters
23526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart the offset into <TT>srcChars</TT> where new characters
23536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will be obtained
23546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLimit the offset immediately following the range to copy
23556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in <TT>srcText</TT>
23566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
23576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
23586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
23596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& replaceBetween(int32_t start,
23606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t limit,
23616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UnicodeString& srcText,
23626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t srcStart,
23636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t srcLimit);
23646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
23666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace a substring of this object with the given text.
23676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the beginning index, inclusive; <code>0 <= start
23686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <= limit</code>.
23696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit the ending index, exclusive; <code>start <= limit
23706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <= length()</code>.
23716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text the text to replace characters <code>start</code>
23726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to <code>limit - 1</code>
23736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
23746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
23756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual void handleReplaceBetween(int32_t start,
23766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    int32_t limit,
23776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    const UnicodeString& text);
23786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
23806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replaceable API
23816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if it has MetaData
23826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.4
23836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
23846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual UBool hasMetaData() const;
23856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
23866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
23876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy a substring of this object, retaining attribute (out-of-band)
23886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * information.  This method is used to duplicate or reorder substrings.
23896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The destination index must not overlap the source range.
23906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
23916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the beginning index, inclusive; <code>0 <= start <=
23926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * limit</code>.
23936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit the ending index, exclusive; <code>start <= limit <=
23946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * length()</code>.
23956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param dest the destination index.  The characters from
23966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <code>start..limit-1</code> will be copied to <code>dest</code>.
23976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Implementations of this method may assume that <code>dest <= start ||
23986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * dest >= limit</code>.
23996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
24006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
24016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual void copy(int32_t start, int32_t limit, int32_t dest);
24026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Search and replace operations */
24046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
24066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace all occurrences of characters in oldText with the characters
24076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in newText
24086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param oldText the text containing the search text
24096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param newText the text containing the replacement text
24106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
24116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
24126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
24136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& findAndReplace(const UnicodeString& oldText,
24146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UnicodeString& newText);
24156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
24176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace all occurrences of characters in oldText with characters
24186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in newText
24196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the range [<TT>start</TT>, <TT>start + length</TT>).
24206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the start of the range in which replace will performed
24216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the length of the range in which replace will be performed
24226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param oldText the text containing the search text
24236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param newText the text containing the replacement text
24246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
24256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
24266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
24276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& findAndReplace(int32_t start,
24286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t length,
24296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UnicodeString& oldText,
24306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UnicodeString& newText);
24316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
24336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Replace all occurrences of characters in oldText in the range
24346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>oldStart</TT>, <TT>oldStart + oldLength</TT>) with the characters
24356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in newText in the range
24366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>newStart</TT>, <TT>newStart + newLength</TT>)
24376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in the range [<TT>start</TT>, <TT>start + length</TT>).
24386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the start of the range in which replace will performed
24396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the length of the range in which replace will be performed
24406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param oldText the text containing the search text
24416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param oldStart the start of the search range in <TT>oldText</TT>
24426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param oldLength the length of the search range in <TT>oldText</TT>
24436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param newText the text containing the replacement text
24446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param newStart the start of the replacement range in <TT>newText</TT>
24456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param newLength the length of the replacement range in <TT>newText</TT>
24466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
24476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
24486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
24496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& findAndReplace(int32_t start,
24506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t length,
24516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UnicodeString& oldText,
24526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t oldStart,
24536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t oldLength,
24546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UnicodeString& newText,
24556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t newStart,
24566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t newLength);
24576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Remove operations */
24606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
24626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Remove all characters from the UnicodeString object.
24636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
24646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
24656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
24666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& remove(void);
24676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
24696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Remove the characters in the range
24706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>start + length</TT>) from the UnicodeString object.
24716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset of the first character to remove
24726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters to remove
24736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
24746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
24756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
24766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& remove(int32_t start,
24776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                               int32_t length = (int32_t)INT32_MAX);
24786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
24806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Remove the characters in the range
24816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<TT>start</TT>, <TT>limit</TT>) from the UnicodeString object.
24826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset of the first character to remove
24836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit the offset immediately following the range to remove
24846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
24856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
24866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
24876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& removeBetween(int32_t start,
24886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      int32_t limit = (int32_t)INT32_MAX);
24896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
24906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
24916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Retain only the characters in the range
24926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * [<code>start</code>, <code>limit</code>) from the UnicodeString object.
24936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Removes characters before <code>start</code> and at and after <code>limit</code>.
24946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the offset of the first character to retain
24956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param limit the offset immediately following the range to retain
24966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
24976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.4
24986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
24996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString &retainBetween(int32_t start, int32_t limit = INT32_MAX);
25006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Length operations */
25026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
25046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Pad the start of this UnicodeString with the character <TT>padChar</TT>.
25056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the length of this UnicodeString is less than targetLength,
25066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * length() - targetLength copies of padChar will be added to the
25076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * beginning of this UnicodeString.
25086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param targetLength the desired length of the string
25096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param padChar the character to use for padding. Defaults to
25106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * space (U+0020)
25116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if the text was padded, FALSE otherwise.
25126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
25136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
25146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool padLeading(int32_t targetLength,
25156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    UChar padChar = 0x0020);
25166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
25186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Pad the end of this UnicodeString with the character <TT>padChar</TT>.
25196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the length of this UnicodeString is less than targetLength,
25206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * length() - targetLength copies of padChar will be added to the
25216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * end of this UnicodeString.
25226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param targetLength the desired length of the string
25236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param padChar the character to use for padding. Defaults to
25246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * space (U+0020)
25256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if the text was padded, FALSE otherwise.
25266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
25276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
25286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool padTrailing(int32_t targetLength,
25296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     UChar padChar = 0x0020);
25306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
25326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Truncate this UnicodeString to the <TT>targetLength</TT>.
25336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param targetLength the desired length of this UnicodeString.
25346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return TRUE if the text was truncated, FALSE otherwise
25356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
25366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
25376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool truncate(int32_t targetLength);
25386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
25406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Trims leading and trailing whitespace from this UnicodeString.
25416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
25426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
25436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
25446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& trim(void);
25456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Miscellaneous operations */
25486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
25506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Reverse this UnicodeString in place.
25516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
25526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
25536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
25546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& reverse(void);
25556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
25576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Reverse the range [<TT>start</TT>, <TT>start + length</TT>) in
25586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * this UnicodeString.
25596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param start the start of the range to reverse
25606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length the number of characters to to reverse
25616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a reference to this
25626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
25636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
25646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString& reverse(int32_t start,
25656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t length);
25666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
25686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Convert the characters in this to UPPER CASE following the conventions of
25696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the default locale.
25706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to this.
25716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
25726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
25736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& toUpper(void);
25746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
25766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Convert the characters in this to UPPER CASE following the conventions of
25776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * a specific locale.
25786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param locale The locale containing the conventions to use.
25796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to this.
25806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
25816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
25826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& toUpper(const Locale& locale);
25836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
25856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Convert the characters in this to lower case following the conventions of
25866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the default locale.
25876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to this.
25886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
25896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
25906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& toLower(void);
25916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
25926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
25936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Convert the characters in this to lower case following the conventions of
25946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * a specific locale.
25956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param locale The locale containing the conventions to use.
25966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to this.
25976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
25986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
25996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& toLower(const Locale& locale);
26006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_BREAK_ITERATION
26026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
26046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Titlecase this string, convenience function using the default locale.
26056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Casing is locale-dependent and context-sensitive.
26076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Titlecasing uses a break iterator to find the first characters of words
26086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * that are to be titlecased. It titlecases those characters and lowercases
26096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * all others.
26106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The titlecase break iterator can be provided to customize for arbitrary
26126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * styles, using rules and dictionaries beyond the standard iterators.
26136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It may be more efficient to always provide an iterator to avoid
26146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * opening and closing one for each string.
26156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The standard titlecase iterator for the root locale implements the
26166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * algorithm of Unicode TR 21.
26176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function uses only the setText(), first() and next() methods of the
26196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * provided break iterator.
26206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param titleIter A break iterator to find the first characters of words
26226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  that are to be titlecased.
26236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  If none is provided (0), then a standard titlecase
26246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  break iterator is opened.
26256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  Otherwise the provided iterator is set to the string's text.
26266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to this.
26276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.1
26286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
26296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &toTitle(BreakIterator *titleIter);
26306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
26326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Titlecase this string.
26336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Casing is locale-dependent and context-sensitive.
26356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Titlecasing uses a break iterator to find the first characters of words
26366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * that are to be titlecased. It titlecases those characters and lowercases
26376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * all others.
26386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The titlecase break iterator can be provided to customize for arbitrary
26406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * styles, using rules and dictionaries beyond the standard iterators.
26416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It may be more efficient to always provide an iterator to avoid
26426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * opening and closing one for each string.
26436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The standard titlecase iterator for the root locale implements the
26446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * algorithm of Unicode TR 21.
26456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function uses only the setText(), first() and next() methods of the
26476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * provided break iterator.
26486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param titleIter A break iterator to find the first characters of words
26506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  that are to be titlecased.
26516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  If none is provided (0), then a standard titlecase
26526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  break iterator is opened.
26536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  Otherwise the provided iterator is set to the string's text.
26546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param locale    The locale to consider.
26556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to this.
26566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.1
26576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
26586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &toTitle(BreakIterator *titleIter, const Locale &locale);
26596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
26616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Titlecase this string, with options.
26626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Casing is locale-dependent and context-sensitive.
26646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Titlecasing uses a break iterator to find the first characters of words
26656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * that are to be titlecased. It titlecases those characters and lowercases
26666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * all others. (This can be modified with options.)
26676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The titlecase break iterator can be provided to customize for arbitrary
26696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * styles, using rules and dictionaries beyond the standard iterators.
26706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It may be more efficient to always provide an iterator to avoid
26716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * opening and closing one for each string.
26726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The standard titlecase iterator for the root locale implements the
26736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * algorithm of Unicode TR 21.
26746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function uses only the setText(), first() and next() methods of the
26766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * provided break iterator.
26776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param titleIter A break iterator to find the first characters of words
26796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  that are to be titlecased.
26806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  If none is provided (0), then a standard titlecase
26816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  break iterator is opened.
26826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                  Otherwise the provided iterator is set to the string's text.
26836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param locale    The locale to consider.
26846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param options Options bit set, see ucasemap_open().
26856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to this.
26866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see U_TITLECASE_NO_LOWERCASE
26876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see U_TITLECASE_NO_BREAK_ADJUSTMENT
26886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see ucasemap_open
26896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 3.8
26906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
26916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &toTitle(BreakIterator *titleIter, const Locale &locale, uint32_t options);
26926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
26946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
26956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
26966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Case-folds the characters in this string.
26976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
26986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Case-folding is locale-independent and not context-sensitive,
26996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * but there is an option for whether to include or exclude mappings for dotted I
27006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * and dotless i that are marked with 'T' in CaseFolding.txt.
27016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The result may be longer or shorter than the original.
27036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param options Either U_FOLD_CASE_DEFAULT or U_FOLD_CASE_EXCLUDE_SPECIAL_I
27056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A reference to this.
27066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
27076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
27086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &foldCase(uint32_t options=0 /*U_FOLD_CASE_DEFAULT*/);
27096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //========================================
27116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Access to the internal buffer
27126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //========================================
27136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
27156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Get a read/write pointer to the internal buffer.
27166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The buffer is guaranteed to be large enough for at least minCapacity UChars,
27176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * writable, and is still owned by the UnicodeString object.
27186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Calls to getBuffer(minCapacity) must not be nested, and
27196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * must be matched with calls to releaseBuffer(newLength).
27206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the string buffer was read-only or shared,
27216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * then it will be reallocated and copied.
27226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * An attempted nested call will return 0, and will not further modify the
27246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * state of the UnicodeString object.
27256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It also returns 0 if the string is bogus.
27266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The actual capacity of the string buffer may be larger than minCapacity.
27286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * getCapacity() returns the actual capacity.
27296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * For many operations, the full capacity should be used to avoid reallocations.
27306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * While the buffer is "open" between getBuffer(minCapacity)
27326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * and releaseBuffer(newLength), the following applies:
27336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - The string length is set to 0.
27346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - Any read API call on the UnicodeString object will behave like on a 0-length string.
27356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - Any write API call on the UnicodeString object is disallowed and will have no effect.
27366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - You can read from and write to the returned buffer.
27376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - The previous string contents will still be in the buffer;
27386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   if you want to use it, then you need to call length() before getBuffer(minCapacity).
27396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   If the length() was greater than minCapacity, then any contents after minCapacity
27406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   may be lost.
27416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   The buffer contents is not NUL-terminated by getBuffer().
27426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   If length()<getCapacity() then you can terminate it by writing a NUL
27436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   at index length().
27446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - You must call releaseBuffer(newLength) before and in order to
27456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   return to normal UnicodeString operation.
27466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param minCapacity the minimum number of UChars that are to be available
27486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *        in the buffer, starting at the returned pointer;
27496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *        default to the current string capacity if minCapacity==-1
27506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a writable pointer to the internal string buffer,
27516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *         or 0 if an error occurs (nested calls, out of memory)
27526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see releaseBuffer
27546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see getTerminatedBuffer()
27556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
27566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
27576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UChar *getBuffer(int32_t minCapacity);
27586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
27606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Release a read/write buffer on a UnicodeString object with an
27616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * "open" getBuffer(minCapacity).
27626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function must be called in a matched pair with getBuffer(minCapacity).
27636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * releaseBuffer(newLength) must be called if and only if a getBuffer(minCapacity) is "open".
27646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It will set the string length to newLength, at most to the current capacity.
27666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If newLength==-1 then it will set the length according to the
27676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * first NUL in the buffer, or to the capacity if there is no NUL.
27686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * After calling releaseBuffer(newLength) the UnicodeString is back to normal operation.
27706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param newLength the new length of the UnicodeString object;
27726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *        defaults to the current capacity if newLength is greater than that;
27736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *        if newLength==-1, it defaults to u_strlen(buffer) but not more than
27746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *        the current capacity of the string
27756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see getBuffer(int32_t minCapacity)
27776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
27786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
27796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void releaseBuffer(int32_t newLength=-1);
27806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
27816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
27826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Get a read-only pointer to the internal buffer.
27836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This can be called at any time on a valid UnicodeString.
27846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It returns 0 if the string is bogus, or
27866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * during an "open" getBuffer(minCapacity).
27876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It can be called as many times as desired.
27896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The pointer that it returns will remain valid until the UnicodeString object is modified,
27906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * at which time the pointer is semantically invalidated and must not be used any more.
27916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The capacity of the buffer can be determined with getCapacity().
27936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The part after length() may or may not be initialized and valid,
27946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * depending on the history of the UnicodeString object.
27956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
27966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The buffer contents is (probably) not NUL-terminated.
27976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * You can check if it is with
27986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <code>(s.length()<s.getCapacity() && buffer[s.length()]==0)</code>.
27996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * (See getTerminatedBuffer().)
28006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The buffer may reside in read-only memory. Its contents must not
28026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * be modified.
28036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a read-only pointer to the internal string buffer,
28056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *         or 0 if the string is empty or bogus
28066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see getBuffer(int32_t minCapacity)
28086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see getTerminatedBuffer()
28096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
28106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
28116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline const UChar *getBuffer() const;
28126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
28146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Get a read-only pointer to the internal buffer,
28156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * making sure that it is NUL-terminated.
28166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This can be called at any time on a valid UnicodeString.
28176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It returns 0 if the string is bogus, or
28196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * during an "open" getBuffer(minCapacity), or if the buffer cannot
28206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * be NUL-terminated (because memory allocation failed).
28216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It can be called as many times as desired.
28236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The pointer that it returns will remain valid until the UnicodeString object is modified,
28246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * at which time the pointer is semantically invalidated and must not be used any more.
28256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The capacity of the buffer can be determined with getCapacity().
28276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The part after length()+1 may or may not be initialized and valid,
28286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * depending on the history of the UnicodeString object.
28296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The buffer contents is guaranteed to be NUL-terminated.
28316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * getTerminatedBuffer() may reallocate the buffer if a terminating NUL
28326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * is written.
28336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * For this reason, this function is not const, unlike getBuffer().
28346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Note that a UnicodeString may also contain NUL characters as part of its contents.
28356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The buffer may reside in read-only memory. Its contents must not
28376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * be modified.
28386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a read-only pointer to the internal string buffer,
28406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *         or 0 if the string is empty or bogus
28416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see getBuffer(int32_t minCapacity)
28436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see getBuffer()
28446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.2
28456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
28466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  const UChar *getTerminatedBuffer();
28476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //========================================
28496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Constructors
28506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //========================================
28516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /** Construct an empty UnicodeString.
28536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
28546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
28556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UnicodeString();
28566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
28586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Construct a UnicodeString with capacity to hold <TT>capacity</TT> UChars
28596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param capacity the number of UChars this UnicodeString should hold
28606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * before a resize is necessary; if count is greater than 0 and count
28616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * code points c take up more space than capacity, then capacity is adjusted
28626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * accordingly.
28636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param c is used to initially fill the string
28646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param count specifies how many code points c are to be written in the
28656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *              string
28666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
28676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
28686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(int32_t capacity, UChar32 c, int32_t count);
28696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
28716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Single UChar (code unit) constructor.
28726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It is recommended to mark this constructor "explicit" by
28746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <code>-DUNISTR_FROM_CHAR_EXPLICIT=explicit</code>
28756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * on the compiler command line or similar.
28766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param ch the character to place in the UnicodeString
28776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
28786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
28796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UNISTR_FROM_CHAR_EXPLICIT UnicodeString(UChar ch);
28806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
28826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Single UChar32 (code point) constructor.
28836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It is recommended to mark this constructor "explicit" by
28856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <code>-DUNISTR_FROM_CHAR_EXPLICIT=explicit</code>
28866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * on the compiler command line or similar.
28876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param ch the character to place in the UnicodeString
28886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
28896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
28906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UNISTR_FROM_CHAR_EXPLICIT UnicodeString(UChar32 ch);
28916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
28926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
28936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * UChar* constructor.
28946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
28956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It is recommended to mark this constructor "explicit" by
28966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <code>-DUNISTR_FROM_STRING_EXPLICIT=explicit</code>
28976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * on the compiler command line or similar.
28986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The characters to place in the UnicodeString.  <TT>text</TT>
28996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * must be NULL (U+0000) terminated.
29006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
29016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
29026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const UChar *text);
29036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
29056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * UChar* constructor.
29066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The characters to place in the UnicodeString.
29076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param textLength The number of Unicode characters in <TT>text</TT>
29086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to copy.
29096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
29106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
29116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(const UChar *text,
29126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        int32_t textLength);
29136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
29156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Readonly-aliasing UChar* constructor.
29166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The text will be used for the UnicodeString object, but
29176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * it will not be released when the UnicodeString is destroyed.
29186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This has copy-on-write semantics:
29196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * When the string is modified, then the buffer is first copied into
29206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * newly allocated memory.
29216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The aliased buffer is never modified.
29226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
29236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In an assignment to another UnicodeString, when using the copy constructor
29246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or the assignment operator, the text will be copied.
29256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * When using fastCopyFrom(), the text will be aliased again,
29266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * so that both strings then alias the same readonly-text.
29276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
29286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param isTerminated specifies if <code>text</code> is <code>NUL</code>-terminated.
29296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                     This must be true if <code>textLength==-1</code>.
29306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param text The characters to alias for the UnicodeString.
29316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param textLength The number of Unicode characters in <code>text</code> to alias.
29326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                   If -1, then this constructor will determine the length
29336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                   by calling <code>u_strlen()</code>.
29346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
29356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
29366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(UBool isTerminated,
29376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UChar *text,
29386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t textLength);
29396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
29416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Writable-aliasing UChar* constructor.
29426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The text will be used for the UnicodeString object, but
29436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * it will not be released when the UnicodeString is destroyed.
29446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This has write-through semantics:
29456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * For as long as the capacity of the buffer is sufficient, write operations
29466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * will directly affect the buffer. When more capacity is necessary, then
29476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * a new buffer will be allocated and the contents copied as with regularly
29486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * constructed strings.
29496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In an assignment to another UnicodeString, the buffer will be copied.
29506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The extract(UChar *dst) function detects whether the dst pointer is the same
29516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * as the string buffer itself and will in this case not copy the contents.
29526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
29536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param buffer The characters to alias for the UnicodeString.
29546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param buffLength The number of Unicode characters in <code>buffer</code> to alias.
29556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param buffCapacity The size of <code>buffer</code> in UChars.
29566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
29576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
29586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(UChar *buffer, int32_t buffLength, int32_t buffCapacity);
29596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if U_CHARSET_IS_UTF8 || !UCONFIG_NO_CONVERSION
29616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
29636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * char* constructor.
29646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Uses the default converter (and thus depends on the ICU conversion code)
29656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * unless U_CHARSET_IS_UTF8 is set to 1.
29666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
29676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * For ASCII (really "invariant character") strings it is more efficient to use
29686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the constructor that takes a US_INV (for its enum EInvariant).
29696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * For ASCII (invariant-character) string literals, see UNICODE_STRING and
29706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * UNICODE_STRING_SIMPLE.
29716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
29726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It is recommended to mark this constructor "explicit" by
29736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * <code>-DUNISTR_FROM_STRING_EXPLICIT=explicit</code>
29746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * on the compiler command line or similar.
29756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param codepageData an array of bytes, null-terminated,
29766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *                     in the platform's default codepage.
29776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
29786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see UNICODE_STRING
29796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see UNICODE_STRING_SIMPLE
29806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
29816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UNISTR_FROM_STRING_EXPLICIT UnicodeString(const char *codepageData);
29826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
29846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * char* constructor.
29856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Uses the default converter (and thus depends on the ICU conversion code)
29866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * unless U_CHARSET_IS_UTF8 is set to 1.
29876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param codepageData an array of bytes in the platform's default codepage.
29886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param dataLength The number of bytes in <TT>codepageData</TT>.
29896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
29906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
29916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(const char *codepageData, int32_t dataLength);
29926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
29946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_CONVERSION
29966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
29976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
29986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * char* constructor.
29996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param codepageData an array of bytes, null-terminated
30006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param codepage the encoding of <TT>codepageData</TT>.  The special
30016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * value 0 for <TT>codepage</TT> indicates that the text is in the
30026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * platform's default codepage.
30036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
30046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If <code>codepage</code> is an empty string (<code>""</code>),
30056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * then a simple conversion is performed on the codepage-invariant
30066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * subset ("invariant characters") of the platform encoding. See utypes.h.
30076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Recommendation: For invariant-character strings use the constructor
30086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * UnicodeString(const char *src, int32_t length, enum EInvariant inv)
30096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * because it avoids object code dependencies of UnicodeString on
30106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the conversion code.
30116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
30126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
30136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
30146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(const char *codepageData, const char *codepage);
30156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
30176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * char* constructor.
30186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param codepageData an array of bytes.
30196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param dataLength The number of bytes in <TT>codepageData</TT>.
30206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param codepage the encoding of <TT>codepageData</TT>.  The special
30216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * value 0 for <TT>codepage</TT> indicates that the text is in the
30226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * platform's default codepage.
30236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If <code>codepage</code> is an empty string (<code>""</code>),
30246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * then a simple conversion is performed on the codepage-invariant
30256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * subset ("invariant characters") of the platform encoding. See utypes.h.
30266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Recommendation: For invariant-character strings use the constructor
30276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * UnicodeString(const char *src, int32_t length, enum EInvariant inv)
30286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * because it avoids object code dependencies of UnicodeString on
30296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the conversion code.
30306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
30316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
30326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
30336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(const char *codepageData, int32_t dataLength, const char *codepage);
30346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
30366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * char * / UConverter constructor.
30376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This constructor uses an existing UConverter object to
30386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * convert the codepage string to Unicode and construct a UnicodeString
30396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * from that.
30406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
30416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The converter is reset at first.
30426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If the error code indicates a failure before this constructor is called,
30436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * or if an error occurs during conversion or construction,
30446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * then the string will be bogus.
30456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
30466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function avoids the overhead of opening and closing a converter if
30476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * multiple strings are constructed.
30486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
30496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param src input codepage string
30506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength length of the input string, can be -1 for NUL-terminated strings
30516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param cnv converter object (ucnv_resetToUnicode() will be called),
30526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *        can be NULL for the default converter
30536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param errorCode normal ICU error code
30546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
30556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
30566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(
30576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        const char *src, int32_t srcLength,
30586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UConverter *cnv,
30596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        UErrorCode &errorCode);
30606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
30626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
30646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Constructs a Unicode string from an invariant-character char * string.
30656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * About invariant characters see utypes.h.
30666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This constructor has no runtime dependency on conversion code and is
30676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * therefore recommended over ones taking a charset name string
30686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * (where the empty string "" indicates invariant-character conversion).
30696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
30706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Use the macro US_INV as the third, signature-distinguishing parameter.
30716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
30726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * For example:
30736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \code
30746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * void fn(const char *s) {
30756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   UnicodeString ustr(s, -1, US_INV);
30766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *   // use ustr ...
30776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * }
30786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \endcode
30796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
30806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param src String using only invariant characters.
30816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length Length of src, or -1 if NUL-terminated.
30826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param inv Signature-distinguishing paramater, use US_INV.
30836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
30846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see US_INV
30856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 3.2
30866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
30876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(const char *src, int32_t length, enum EInvariant inv);
30886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
30916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Copy constructor.
30926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param that The UnicodeString object to copy.
30936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
30946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
30956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(const UnicodeString& that);
30966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
30976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
30986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * 'Substring' constructor from tail of source string.
30996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param src The UnicodeString object to copy.
31006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart The offset into <tt>src</tt> at which to start copying.
31016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.2
31026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
31036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(const UnicodeString& src, int32_t srcStart);
31046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
31066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * 'Substring' constructor from subrange of source string.
31076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param src The UnicodeString object to copy.
31086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcStart The offset into <tt>src</tt> at which to start copying.
31096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param srcLength The number of characters from <tt>src</tt> to copy.
31106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.2
31116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
31126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString(const UnicodeString& src, int32_t srcStart, int32_t srcLength);
31136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
31156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Clone this object, an instance of a subclass of Replaceable.
31166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Clones can be used concurrently in multiple threads.
31176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If a subclass does not implement clone(), or if an error occurs,
31186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * then NULL is returned.
31196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The clone functions in all subclasses return a pointer to a Replaceable
31206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * because some compilers do not support covariant (same-as-this)
31216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * return types; cast to the appropriate subclass if necessary.
31226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The caller must delete the clone.
31236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a clone of this object
31256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see Replaceable::clone
31276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see getDynamicClassID
31286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.6
31296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
31306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual Replaceable *clone() const;
31316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /** Destructor.
31336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
31346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
31356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual ~UnicodeString();
31366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
31386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Create a UnicodeString from a UTF-8 string.
31396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Illegal input is replaced with U+FFFD. Otherwise, errors result in a bogus string.
31406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Calls u_strFromUTF8WithSub().
31416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param utf8 UTF-8 input string.
31436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *             Note that a StringPiece can be implicitly constructed
31446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *             from a std::string or a NUL-terminated const char * string.
31456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A UnicodeString with equivalent UTF-16 contents.
31466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see toUTF8
31476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see toUTF8String
31486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
31496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
31506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static UnicodeString fromUTF8(const StringPiece &utf8);
31516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
31536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Create a UnicodeString from a UTF-32 string.
31546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Illegal input is replaced with U+FFFD. Otherwise, errors result in a bogus string.
31556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Calls u_strFromUTF32WithSub().
31566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param utf32 UTF-32 input string. Must not be NULL.
31586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param length Length of the input string, or -1 if NUL-terminated.
31596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return A UnicodeString with equivalent UTF-16 contents.
31606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see toUTF32
31616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 4.2
31626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
31636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static UnicodeString fromUTF32(const UChar32 *utf32, int32_t length);
31646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Miscellaneous operations */
31666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
31676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
31686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Unescape a string of characters and return a string containing
31696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the result.  The following escape sequences are recognized:
31706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \\uhhhh       4 hex digits; h in [0-9A-Fa-f]
31726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \\Uhhhhhhhh   8 hex digits
31736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \\xhh         1-2 hex digits
31746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \\ooo         1-3 octal digits; o in [0-7]
31756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \\cX          control-X; X is masked with 0x1F
31766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * as well as the standard ANSI C escapes:
31786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \\a => U+0007, \\b => U+0008, \\t => U+0009, \\n => U+000A,
31806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \\v => U+000B, \\f => U+000C, \\r => U+000D, \\e => U+001B,
31816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * \\&quot; => U+0022, \\' => U+0027, \\? => U+003F, \\\\ => U+005C
31826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Anything else following a backslash is generically escaped.  For
31846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * example, "[a\\-z]" returns "[a-z]".
31856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If an escape sequence is ill-formed, this method returns an empty
31876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * string.  An example of an ill-formed sequence is "\\u" followed by
31886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * fewer than 4 hex digits.
31896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function is similar to u_unescape() but not identical to it.
31916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The latter takes a source char*, so it does escape recognition
31926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * and also invariant conversion.
31936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
31946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return a string with backslash escapes interpreted, or an
31956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * empty string on error.
31966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see UnicodeString#unescapeAt()
31976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see u_unescape()
31986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see u_unescapeAt()
31996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
32006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
32016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString unescape() const;
32026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
32046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Unescape a single escape sequence and return the represented
32056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * character.  See unescape() for a listing of the recognized escape
32066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * sequences.  The character at offset-1 is assumed (without
32076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * checking) to be a backslash.  If the escape sequence is
32086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * ill-formed, or the offset is out of range, U_SENTINEL=-1 is
32096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * returned.
32106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
32116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @param offset an input output parameter.  On input, it is the
32126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * offset into this string where the escape sequence is located,
32136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * after the initial backslash.  On output, it is advanced after the
32146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * last character parsed.  On error, it is not advanced at all.
32156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @return the character represented by the escape sequence at
32166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * offset, or U_SENTINEL=-1 on error.
32176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see UnicodeString#unescape()
32186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see u_unescape()
32196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @see u_unescapeAt()
32206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.0
32216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
32226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UChar32 unescapeAt(int32_t &offset) const;
32236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
32256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * ICU "poor man's RTTI", returns a UClassID for this class.
32266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
32276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.2
32286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
32296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  static UClassID U_EXPORT2 getStaticClassID();
32306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
32326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * ICU "poor man's RTTI", returns a UClassID for the actual class.
32336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
32346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.2
32356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
32366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual UClassID getDynamicClassID() const;
32376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //========================================
32396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Implementation methods
32406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  //========================================
32416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprotected:
32436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
32446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Implement Replaceable::getLength() (see jitterbug 1027).
32456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.4
32466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
32476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual int32_t getLength() const;
32486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
32506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The change in Replaceable to use virtual getCharAt() allows
32516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * UnicodeString::charAt() to be inline again (see jitterbug 709).
32526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.4
32536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
32546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual UChar getCharAt(int32_t offset) const;
32556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
32576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The change in Replaceable to use virtual getChar32At() allows
32586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * UnicodeString::char32At() to be inline again (see jitterbug 709).
32596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * @stable ICU 2.4
32606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
32616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  virtual UChar32 getChar32At(int32_t offset) const;
32626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
32646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // For char* constructors. Could be made public.
32656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &setToUTF8(const StringPiece &utf8);
32666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // For extract(char*).
32676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // We could make a toUTF8(target, capacity, errorCode) public but not
32686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // this version: New API will be cleaner if we make callers create substrings
32696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // rather than having start+length on every method,
32706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // and it should take a UErrorCode&.
32716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t
32726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  toUTF8(int32_t start, int32_t len,
32736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         char *target, int32_t capacity) const;
32746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
32766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Internal string contents comparison, called by operator==.
32776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Requires: this & text not bogus and have same lengths.
32786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
32796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool doEquals(const UnicodeString &text, int32_t len) const;
32806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t
32826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  doCompare(int32_t start,
32836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t length,
32846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           const UnicodeString& srcText,
32856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t srcStart,
32866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t srcLength) const;
32876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int8_t doCompare(int32_t start,
32896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t length,
32906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           const UChar *srcChars,
32916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t srcStart,
32926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           int32_t srcLength) const;
32936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
32946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t
32956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  doCompareCodePointOrder(int32_t start,
32966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          int32_t length,
32976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          const UnicodeString& srcText,
32986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          int32_t srcStart,
32996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          int32_t srcLength) const;
33006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int8_t doCompareCodePointOrder(int32_t start,
33026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 int32_t length,
33036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 const UChar *srcChars,
33046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 int32_t srcStart,
33056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 int32_t srcLength) const;
33066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline int8_t
33086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  doCaseCompare(int32_t start,
33096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t length,
33106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UnicodeString &srcText,
33116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t srcStart,
33126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t srcLength,
33136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uint32_t options) const;
33146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int8_t
33166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  doCaseCompare(int32_t start,
33176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t length,
33186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                const UChar *srcChars,
33196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t srcStart,
33206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t srcLength,
33216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                uint32_t options) const;
33226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t doIndexOf(UChar c,
33246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t start,
33256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t length) const;
33266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t doIndexOf(UChar32 c,
33286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        int32_t start,
33296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        int32_t length) const;
33306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t doLastIndexOf(UChar c,
33326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t start,
33336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t length) const;
33346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t doLastIndexOf(UChar32 c,
33366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            int32_t start,
33376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            int32_t length) const;
33386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void doExtract(int32_t start,
33406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t length,
33416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         UChar *dst,
33426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t dstStart) const;
33436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline void doExtract(int32_t start,
33456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         int32_t length,
33466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         UnicodeString& target) const;
33476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UChar doCharAt(int32_t offset)  const;
33496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& doReplace(int32_t start,
33516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t length,
33526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const UnicodeString& srcText,
33536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcStart,
33546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength);
33556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& doReplace(int32_t start,
33576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t length,
33586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const UChar *srcChars,
33596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcStart,
33606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength);
33616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString& doReverse(int32_t start,
33636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t length);
33646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // calculate hash code
33666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t doHashCode(void) const;
33676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // get pointer to start of array
33696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // these do not check for kOpenGetBuffer, unlike the public getBuffer() function
33706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UChar* getArrayStart(void);
33716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline const UChar* getArrayStart(void) const;
33726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // A UnicodeString object (not necessarily its current buffer)
33746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // is writable unless it isBogus() or it has an "open" getBuffer(minCapacity).
33756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool isWritable() const;
33766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Is the current buffer writable?
33786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline UBool isBufferWritable() const;
33796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // None of the following does releaseArray().
33816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline void setLength(int32_t len);        // sets only fShortLength and fLength
33826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline void setToEmpty();                  // sets fFlags=kShortString
33836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline void setArray(UChar *array, int32_t len, int32_t capacity); // does not set fFlags
33846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // allocate the array; result may be fStackBuffer
33866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // sets refCount to 1 if appropriate
33876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // sets fArray, fCapacity, and fFlags
33886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // returns boolean for success or failure
33896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool allocate(int32_t capacity);
33906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // release the array if owned
33926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void releaseArray(void);
33936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // turn a bogus string into an empty one
33956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void unBogus();
33966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
33976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // implements assigment operator, copy constructor, and fastCopyFrom()
33986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &copyFrom(const UnicodeString &src, UBool fastCopy=FALSE);
33996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // Pin start and limit to acceptable values.
34016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline void pinIndex(int32_t& start) const;
34026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  inline void pinIndices(int32_t& start,
34036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         int32_t& length) const;
34046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_CONVERSION
34066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /* Internal extract() using UConverter. */
34086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t doExtract(int32_t start, int32_t length,
34096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    char *dest, int32_t destCapacity,
34106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    UConverter *cnv,
34116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                    UErrorCode &errorCode) const;
34126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*
34146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Real constructor for converting from codepage data.
34156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * It assumes that it is called with !fRefCounted.
34166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
34176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If <code>codepage==0</code>, then the default converter
34186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * is used for the platform encoding.
34196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * If <code>codepage</code> is an empty string (<code>""</code>),
34206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * then a simple conversion is performed on the codepage-invariant
34216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * subset ("invariant characters") of the platform encoding. See utypes.h.
34226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
34236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void doCodepageCreate(const char *codepageData,
34246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        int32_t dataLength,
34256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        const char *codepage);
34266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*
34286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Worker function for creating a UnicodeString from
34296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * a codepage string using a UConverter.
34306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
34316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void
34326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  doCodepageCreate(const char *codepageData,
34336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   int32_t dataLength,
34346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   UConverter *converter,
34356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   UErrorCode &status);
34366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
34386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*
34406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * This function is called when write access to the array
34416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * is necessary.
34426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
34436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * We need to make a copy of the array if
34446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the buffer is read-only, or
34456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the buffer is refCounted (shared), and refCount>1, or
34466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * the buffer is too small.
34476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
34486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Return FALSE if memory could not be allocated.
34496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
34506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UBool cloneArrayIfNeeded(int32_t newCapacity = -1,
34516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            int32_t growCapacity = -1,
34526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            UBool doCopyArray = TRUE,
34536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            int32_t **pBufferToDelete = 0,
34546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                            UBool forceClone = FALSE);
34556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /**
34576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Common function for UnicodeString case mappings.
34586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The stringCaseMapper has the same type UStringCaseMapper
34596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * as in ustr_imp.h for ustrcase_map().
34606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
34616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UnicodeString &
34626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  caseMap(const UCaseMap *csm, UStringCaseMapper *stringCaseMapper);
34636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // ref counting
34656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  void addRef(void);
34666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t removeRef(void);
34676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t refCount(void) const;
34686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // constants
34706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  enum {
34716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Set the stack buffer size so that sizeof(UnicodeString) is,
34726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // naturally (without padding), a multiple of sizeof(pointer).
34736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    US_STACKBUF_SIZE= sizeof(void *)==4 ? 13 : 15, // Size of stack buffer for short strings
34746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kInvalidUChar=0xffff, // invalid UChar index
34756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kGrowSize=128, // grow size for this buffer
34766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kInvalidHashCode=0, // invalid hash code
34776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kEmptyHashCode=1, // hash code for empty string
34786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // bit flag values for fFlags
34806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kIsBogus=1,         // this string is bogus, i.e., not valid or NULL
34816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kUsingStackBuffer=2,// using fUnion.fStackBuffer instead of fUnion.fFields
34826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kRefCounted=4,      // there is a refCount field before the characters in fArray
34836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kBufferIsReadonly=8,// do not write to this buffer
34846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kOpenGetBuffer=16,  // getBuffer(minCapacity) was called (is "open"),
34856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                        // and releaseBuffer(newLength) must be called
34866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // combined values for convenience
34886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kShortString=kUsingStackBuffer,
34896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kLongString=kRefCounted,
34906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kReadonlyAlias=kBufferIsReadonly,
34916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    kWritableAlias=0
34926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  };
34936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  friend class StringThreadTest;
34956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  friend class UnicodeStringAppendable;
34966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
34976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  union StackBufferOrFields;        // forward declaration necessary before friend declaration
34986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  friend union StackBufferOrFields; // make US_STACKBUF_SIZE visible inside fUnion
34996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  /*
35016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The following are all the class fields that are stored
35026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * in each UnicodeString object.
35036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * Note that UnicodeString has virtual functions,
35046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * therefore there is an implicit vtable pointer
35056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * as the first real field.
35066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * The fields should be aligned such that no padding is necessary.
35076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * On 32-bit machines, the size should be 32 bytes,
35086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * on 64-bit machines (8-byte pointers), it should be 40 bytes.
35096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
35106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * We use a hack to achieve this.
35116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
35126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * With at least some compilers, each of the following is forced to
35136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * a multiple of sizeof(pointer) [the largest field base unit here is a data pointer],
35146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * rounded up with additional padding if the fields do not already fit that requirement:
35156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - sizeof(class UnicodeString)
35166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - offsetof(UnicodeString, fUnion)
35176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - sizeof(fUnion)
35186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * - sizeof(fFields)
35196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
35206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * In order to avoid padding, we make sizeof(fStackBuffer)=16 (=8 UChars)
35216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * which is at least as large as sizeof(fFields) on 32-bit and 64-bit machines.
35226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * (Padding at the end of fFields is ok:
35236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * As long as there is no padding after fStackBuffer, it is not wasted space.)
35246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
35256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * We further assume that the compiler does not reorder the fields,
35266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * so that fRestOfStackBuffer (which holds a few more UChars) immediately follows after fUnion,
35276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * with at most some padding (but no other field) in between.
35286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * (Padding there would be wasted space, but functionally harmless.)
35296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   *
35306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * We use a few more sizeof(pointer)'s chunks of space with
35316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * fRestOfStackBuffer, fShortLength and fFlags,
35326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   * to get up exactly to the intended sizeof(UnicodeString).
35336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org   */
35346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // (implicit) *vtable;
35356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  union StackBufferOrFields {
35366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // fStackBuffer is used iff (fFlags&kUsingStackBuffer)
35376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // else fFields is used
35386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar fStackBuffer[8];  // buffer for short strings, together with fRestOfStackBuffer
35396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    struct {
35406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      UChar   *fArray;    // the Unicode data
35416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      int32_t fCapacity;  // capacity of fArray (in UChars)
35426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      int32_t fLength;    // number of characters in fArray if >127; else undefined
35436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } fFields;
35446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } fUnion;
35456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  UChar fRestOfStackBuffer[US_STACKBUF_SIZE-8];
35466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int8_t fShortLength;  // 0..127: length  <0: real length is in fUnion.fFields.fLength
35476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  uint8_t fFlags;       // bit flags: see constants above
35486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
35496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
35516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Create a new UnicodeString with the concatenation of two others.
35526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
35536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param s1 The first string to be copied to the new one.
35546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @param s2 The second string to be copied to the new one, after s1.
35556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @return UnicodeString(s1).append(s2)
35566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.8
35576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
35586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_COMMON_API UnicodeString U_EXPORT2
35596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgoperator+ (const UnicodeString &s1, const UnicodeString &s2);
35606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
35626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Inline members
35636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
35646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
35666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Privates
35676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
35686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void
35706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::pinIndex(int32_t& start) const
35716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
35726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // pin index
35736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(start < 0) {
35746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    start = 0;
35756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(start > length()) {
35766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    start = length();
35776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
35786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
35796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void
35816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::pinIndices(int32_t& start,
35826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                          int32_t& _length) const
35836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
35846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // pin indices
35856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  int32_t len = length();
35866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(start < 0) {
35876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    start = 0;
35886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(start > len) {
35896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    start = len;
35906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
35916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(_length < 0) {
35926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    _length = 0;
35936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(_length > (len - start)) {
35946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    _length = (len - start);
35956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
35966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
35976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
35986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UChar*
35996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::getArrayStart()
36006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return (fFlags&kUsingStackBuffer) ? fUnion.fStackBuffer : fUnion.fFields.fArray; }
36016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline const UChar*
36036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::getArrayStart() const
36046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return (fFlags&kUsingStackBuffer) ? fUnion.fStackBuffer : fUnion.fFields.fArray; }
36056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
36076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Default constructor
36086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
36096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline
36116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::UnicodeString()
36126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  : fShortLength(0),
36136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fFlags(kShortString)
36146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{}
36156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
36176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Read-only implementation methods
36186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
36196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
36206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::length() const
36216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return fShortLength>=0 ? fShortLength : fUnion.fFields.fLength; }
36226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
36246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::getCapacity() const
36256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return (fFlags&kUsingStackBuffer) ? US_STACKBUF_SIZE : fUnion.fFields.fCapacity; }
36266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
36286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::hashCode() const
36296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doHashCode(); }
36306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
36326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::isBogus() const
36336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return (UBool)(fFlags & kIsBogus); }
36346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
36366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::isWritable() const
36376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return (UBool)!(fFlags&(kOpenGetBuffer|kIsBogus)); }
36386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
36406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::isBufferWritable() const
36416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
36426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return (UBool)(
36436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      !(fFlags&(kOpenGetBuffer|kIsBogus|kBufferIsReadonly)) &&
36446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      (!(fFlags&kRefCounted) || refCount()==1));
36456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
36466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline const UChar *
36486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::getBuffer() const {
36496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(fFlags&(kIsBogus|kOpenGetBuffer)) {
36506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return 0;
36516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if(fFlags&kUsingStackBuffer) {
36526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return fUnion.fStackBuffer;
36536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
36546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return fUnion.fFields.fArray;
36556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
36566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
36576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
36596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Read-only alias methods
36606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
36616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
36626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::doCompare(int32_t start,
36636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t thisLength,
36646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              const UnicodeString& srcText,
36656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcStart,
36666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength) const
36676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
36686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(srcText.isBogus()) {
36696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (int8_t)!isBogus(); // 0 if both are bogus, 1 otherwise
36706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
36716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcText.pinIndices(srcStart, srcLength);
36726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return doCompare(start, thisLength, srcText.getArrayStart(), srcStart, srcLength);
36736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
36746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
36756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
36776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator== (const UnicodeString& text) const
36786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
36796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(isBogus()) {
36806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return text.isBogus();
36816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
36826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t len = length(), textLength = text.length();
36836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return !text.isBogus() && len == textLength && doEquals(text, len);
36846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
36856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
36866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
36886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator!= (const UnicodeString& text) const
36896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return (! operator==(text)); }
36906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
36926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator> (const UnicodeString& text) const
36936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(0, length(), text, 0, text.length()) == 1; }
36946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
36966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator< (const UnicodeString& text) const
36976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(0, length(), text, 0, text.length()) == -1; }
36986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
36996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
37006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator>= (const UnicodeString& text) const
37016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(0, length(), text, 0, text.length()) != -1; }
37026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
37046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator<= (const UnicodeString& text) const
37056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(0, length(), text, 0, text.length()) != 1; }
37066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compare(const UnicodeString& text) const
37096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(0, length(), text, 0, text.length()); }
37106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compare(int32_t start,
37136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
37146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const UnicodeString& srcText) const
37156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(start, _length, srcText, 0, srcText.length()); }
37166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compare(const UChar *srcChars,
37196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength) const
37206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(0, length(), srcChars, 0, srcLength); }
37216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compare(int32_t start,
37246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
37256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const UnicodeString& srcText,
37266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcStart,
37276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength) const
37286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(start, _length, srcText, srcStart, srcLength); }
37296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compare(int32_t start,
37326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
37336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const UChar *srcChars) const
37346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(start, _length, srcChars, 0, _length); }
37356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compare(int32_t start,
37386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
37396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const UChar *srcChars,
37406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcStart,
37416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength) const
37426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(start, _length, srcChars, srcStart, srcLength); }
37436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compareBetween(int32_t start,
37466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t limit,
37476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  const UnicodeString& srcText,
37486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t srcStart,
37496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t srcLimit) const
37506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(start, limit - start,
37516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           srcText, srcStart, srcLimit - srcStart); }
37526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::doCompareCodePointOrder(int32_t start,
37556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       int32_t thisLength,
37566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       const UnicodeString& srcText,
37576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       int32_t srcStart,
37586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                       int32_t srcLength) const
37596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
37606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(srcText.isBogus()) {
37616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (int8_t)!isBogus(); // 0 if both are bogus, 1 otherwise
37626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
37636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcText.pinIndices(srcStart, srcLength);
37646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return doCompareCodePointOrder(start, thisLength, srcText.getArrayStart(), srcStart, srcLength);
37656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
37666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
37676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compareCodePointOrder(const UnicodeString& text) const
37706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompareCodePointOrder(0, length(), text, 0, text.length()); }
37716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compareCodePointOrder(int32_t start,
37746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     int32_t _length,
37756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     const UnicodeString& srcText) const
37766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompareCodePointOrder(start, _length, srcText, 0, srcText.length()); }
37776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compareCodePointOrder(const UChar *srcChars,
37806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     int32_t srcLength) const
37816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompareCodePointOrder(0, length(), srcChars, 0, srcLength); }
37826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compareCodePointOrder(int32_t start,
37856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     int32_t _length,
37866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     const UnicodeString& srcText,
37876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     int32_t srcStart,
37886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     int32_t srcLength) const
37896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompareCodePointOrder(start, _length, srcText, srcStart, srcLength); }
37906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compareCodePointOrder(int32_t start,
37936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     int32_t _length,
37946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     const UChar *srcChars) const
37956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompareCodePointOrder(start, _length, srcChars, 0, _length); }
37966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
37976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
37986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compareCodePointOrder(int32_t start,
37996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     int32_t _length,
38006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     const UChar *srcChars,
38016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     int32_t srcStart,
38026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     int32_t srcLength) const
38036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompareCodePointOrder(start, _length, srcChars, srcStart, srcLength); }
38046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
38066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::compareCodePointOrderBetween(int32_t start,
38076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            int32_t limit,
38086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            const UnicodeString& srcText,
38096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            int32_t srcStart,
38106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                            int32_t srcLimit) const
38116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompareCodePointOrder(start, limit - start,
38126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           srcText, srcStart, srcLimit - srcStart); }
38136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
38156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::doCaseCompare(int32_t start,
38166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             int32_t thisLength,
38176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             const UnicodeString &srcText,
38186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             int32_t srcStart,
38196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             int32_t srcLength,
38206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             uint32_t options) const
38216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
38226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(srcText.isBogus()) {
38236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (int8_t)!isBogus(); // 0 if both are bogus, 1 otherwise
38246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
38256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcText.pinIndices(srcStart, srcLength);
38266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return doCaseCompare(start, thisLength, srcText.getArrayStart(), srcStart, srcLength, options);
38276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
38286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
38296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
38316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::caseCompare(const UnicodeString &text, uint32_t options) const {
38326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCaseCompare(0, length(), text, 0, text.length(), options);
38336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
38346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
38366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::caseCompare(int32_t start,
38376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t _length,
38386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           const UnicodeString &srcText,
38396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           uint32_t options) const {
38406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCaseCompare(start, _length, srcText, 0, srcText.length(), options);
38416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
38426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
38446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::caseCompare(const UChar *srcChars,
38456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t srcLength,
38466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           uint32_t options) const {
38476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCaseCompare(0, length(), srcChars, 0, srcLength, options);
38486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
38496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
38516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::caseCompare(int32_t start,
38526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t _length,
38536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           const UnicodeString &srcText,
38546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t srcStart,
38556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t srcLength,
38566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           uint32_t options) const {
38576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCaseCompare(start, _length, srcText, srcStart, srcLength, options);
38586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
38596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
38616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::caseCompare(int32_t start,
38626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t _length,
38636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           const UChar *srcChars,
38646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           uint32_t options) const {
38656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCaseCompare(start, _length, srcChars, 0, _length, options);
38666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
38676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
38696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::caseCompare(int32_t start,
38706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t _length,
38716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           const UChar *srcChars,
38726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t srcStart,
38736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           int32_t srcLength,
38746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                           uint32_t options) const {
38756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCaseCompare(start, _length, srcChars, srcStart, srcLength, options);
38766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
38776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int8_t
38796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::caseCompareBetween(int32_t start,
38806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  int32_t limit,
38816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  const UnicodeString &srcText,
38826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  int32_t srcStart,
38836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  int32_t srcLimit,
38846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  uint32_t options) const {
38856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCaseCompare(start, limit - start, srcText, srcStart, srcLimit - srcStart, options);
38866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
38876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
38886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
38896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(const UnicodeString& srcText,
38906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcStart,
38916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength,
38926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start,
38936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length) const
38946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
38956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!srcText.isBogus()) {
38966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcText.pinIndices(srcStart, srcLength);
38976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(srcLength > 0) {
38986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return indexOf(srcText.getArrayStart(), srcStart, srcLength, start, _length);
38996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
39006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
39016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return -1;
39026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
39036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(const UnicodeString& text) const
39066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return indexOf(text, 0, text.length(), 0, length()); }
39076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(const UnicodeString& text,
39106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start) const {
39116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  pinIndex(start);
39126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return indexOf(text, 0, text.length(), start, length() - start);
39136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
39146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(const UnicodeString& text,
39176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start,
39186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length) const
39196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return indexOf(text, 0, text.length(), start, _length); }
39206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(const UChar *srcChars,
39236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength,
39246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start) const {
39256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  pinIndex(start);
39266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return indexOf(srcChars, 0, srcLength, start, length() - start);
39276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
39286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(const UChar *srcChars,
39316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength,
39326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start,
39336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length) const
39346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return indexOf(srcChars, 0, srcLength, start, _length); }
39356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(UChar c,
39386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start,
39396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length) const
39406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doIndexOf(c, start, _length); }
39416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(UChar32 c,
39446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start,
39456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length) const
39466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doIndexOf(c, start, _length); }
39476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(UChar c) const
39506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doIndexOf(c, 0, length()); }
39516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(UChar32 c) const
39546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return indexOf(c, 0, length()); }
39556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(UChar c,
39586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start) const {
39596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  pinIndex(start);
39606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doIndexOf(c, start, length() - start);
39616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
39626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::indexOf(UChar32 c,
39656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start) const {
39666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  pinIndex(start);
39676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return indexOf(c, start, length() - start);
39686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
39696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(const UChar *srcChars,
39726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength,
39736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start,
39746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length) const
39756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return lastIndexOf(srcChars, 0, srcLength, start, _length); }
39766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(const UChar *srcChars,
39796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength,
39806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start) const {
39816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  pinIndex(start);
39826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return lastIndexOf(srcChars, 0, srcLength, start, length() - start);
39836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
39846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
39856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
39866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(const UnicodeString& srcText,
39876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcStart,
39886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength,
39896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start,
39906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length) const
39916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
39926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(!srcText.isBogus()) {
39936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcText.pinIndices(srcStart, srcLength);
39946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(srcLength > 0) {
39956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org      return lastIndexOf(srcText.getArrayStart(), srcStart, srcLength, start, _length);
39966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
39976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
39986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return -1;
39996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
40006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
40026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(const UnicodeString& text,
40036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start,
40046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length) const
40056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return lastIndexOf(text, 0, text.length(), start, _length); }
40066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
40086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(const UnicodeString& text,
40096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start) const {
40106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  pinIndex(start);
40116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return lastIndexOf(text, 0, text.length(), start, length() - start);
40126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
40136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
40156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(const UnicodeString& text) const
40166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return lastIndexOf(text, 0, text.length(), 0, length()); }
40176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
40196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(UChar c,
40206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start,
40216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length) const
40226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doLastIndexOf(c, start, _length); }
40236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
40256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(UChar32 c,
40266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start,
40276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length) const {
40286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doLastIndexOf(c, start, _length);
40296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
40306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
40326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(UChar c) const
40336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doLastIndexOf(c, 0, length()); }
40346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
40366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(UChar32 c) const {
40376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return lastIndexOf(c, 0, length());
40386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
40396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
40416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(UChar c,
40426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start) const {
40436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  pinIndex(start);
40446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doLastIndexOf(c, start, length() - start);
40456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
40466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
40486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::lastIndexOf(UChar32 c,
40496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t start) const {
40506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  pinIndex(start);
40516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return lastIndexOf(c, start, length() - start);
40526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
40536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
40556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::startsWith(const UnicodeString& text) const
40566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return compare(0, text.length(), text, 0, text.length()) == 0; }
40576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
40596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::startsWith(const UnicodeString& srcText,
40606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcStart,
40616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength) const
40626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(0, srcLength, srcText, srcStart, srcLength) == 0; }
40636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
40656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::startsWith(const UChar *srcChars, int32_t srcLength) const {
40666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(srcLength < 0) {
40676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLength = u_strlen(srcChars);
40686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
40696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCompare(0, srcLength, srcChars, 0, srcLength) == 0;
40706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
40716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
40736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::startsWith(const UChar *srcChars, int32_t srcStart, int32_t srcLength) const {
40746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(srcLength < 0) {
40756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLength = u_strlen(srcChars);
40766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
40776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCompare(0, srcLength, srcChars, srcStart, srcLength) == 0;
40786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
40796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
40816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::endsWith(const UnicodeString& text) const
40826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCompare(length() - text.length(), text.length(),
40836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org           text, 0, text.length()) == 0; }
40846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
40866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::endsWith(const UnicodeString& srcText,
40876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcStart,
40886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength) const {
40896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  srcText.pinIndices(srcStart, srcLength);
40906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCompare(length() - srcLength, srcLength,
40916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   srcText, srcStart, srcLength) == 0;
40926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
40936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
40946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
40956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::endsWith(const UChar *srcChars,
40966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength) const {
40976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(srcLength < 0) {
40986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLength = u_strlen(srcChars);
40996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
41006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCompare(length() - srcLength, srcLength,
41016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   srcChars, 0, srcLength) == 0;
41026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
41036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
41056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::endsWith(const UChar *srcChars,
41066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcStart,
41076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            int32_t srcLength) const {
41086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(srcLength < 0) {
41096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    srcLength = u_strlen(srcChars + srcStart);
41106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
41116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doCompare(length() - srcLength, srcLength,
41126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                   srcChars, srcStart, srcLength) == 0;
41136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
41146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
41166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// replace
41176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
41186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
41196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::replace(int32_t start,
41206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
41216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const UnicodeString& srcText)
41226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, _length, srcText, 0, srcText.length()); }
41236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
41256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::replace(int32_t start,
41266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
41276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const UnicodeString& srcText,
41286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcStart,
41296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength)
41306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, _length, srcText, srcStart, srcLength); }
41316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
41336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::replace(int32_t start,
41346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
41356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const UChar *srcChars,
41366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength)
41376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, _length, srcChars, 0, srcLength); }
41386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
41406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::replace(int32_t start,
41416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
41426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const UChar *srcChars,
41436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcStart,
41446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t srcLength)
41456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, _length, srcChars, srcStart, srcLength); }
41466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
41486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::replace(int32_t start,
41496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
41506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               UChar srcChar)
41516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, _length, &srcChar, 0, 1); }
41526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
41546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::replaceBetween(int32_t start,
41556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t limit,
41566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  const UnicodeString& srcText)
41576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, limit - start, srcText, 0, srcText.length()); }
41586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
41606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::replaceBetween(int32_t start,
41616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t limit,
41626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  const UnicodeString& srcText,
41636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t srcStart,
41646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t srcLimit)
41656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, limit - start, srcText, srcStart, srcLimit - srcStart); }
41666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
41686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::findAndReplace(const UnicodeString& oldText,
41696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  const UnicodeString& newText)
41706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return findAndReplace(0, length(), oldText, 0, oldText.length(),
41716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            newText, 0, newText.length()); }
41726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
41746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::findAndReplace(int32_t start,
41756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t _length,
41766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  const UnicodeString& oldText,
41776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  const UnicodeString& newText)
41786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return findAndReplace(start, _length, oldText, 0, oldText.length(),
41796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org            newText, 0, newText.length()); }
41806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ============================
41826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// extract
41836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// ============================
41846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void
41856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::doExtract(int32_t start,
41866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t _length,
41876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             UnicodeString& target) const
41886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ target.replace(0, target.length(), *this, start, _length); }
41896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void
41916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::extract(int32_t start,
41926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
41936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               UChar *target,
41946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t targetStart) const
41956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ doExtract(start, _length, target, targetStart); }
41966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
41976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void
41986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::extract(int32_t start,
41996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
42006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               UnicodeString& target) const
42016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ doExtract(start, _length, target); }
42026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#if !UCONFIG_NO_CONVERSION
42046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t
42066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::extract(int32_t start,
42076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length,
42086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               char *dst,
42096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const char *codepage) const
42106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
42126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // This dstSize value will be checked explicitly
42136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return extract(start, _length, dst, dst!=0 ? 0xffffffff : 0, codepage);
42146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
42176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void
42196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::extractBetween(int32_t start,
42206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t limit,
42216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  UChar *dst,
42226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                  int32_t dstStart) const {
42236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  pinIndex(start);
42246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  pinIndex(limit);
42256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  doExtract(start, limit - start, dst, dstStart);
42266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString
42296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::tempSubStringBetween(int32_t start, int32_t limit) const {
42306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return tempSubString(start, limit - start);
42316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UChar
42346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::doCharAt(int32_t offset) const
42356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
42366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if((uint32_t)offset < (uint32_t)length()) {
42376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return getArrayStart()[offset];
42386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
42396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return kInvalidUChar;
42406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
42416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UChar
42446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::charAt(int32_t offset) const
42456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCharAt(offset); }
42466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UChar
42486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator[] (int32_t offset) const
42496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doCharAt(offset); }
42506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
42526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::isEmpty() const {
42536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return fShortLength == 0;
42546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
42576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Write implementation methods
42586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org//========================================
42596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void
42606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::setLength(int32_t len) {
42616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(len <= 127) {
42626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fShortLength = (int8_t)len;
42636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
42646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fShortLength = (int8_t)-1;
42656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fUnion.fFields.fLength = len;
42666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
42676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void
42706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::setToEmpty() {
42716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  fShortLength = 0;
42726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  fFlags = kShortString;
42736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline void
42766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::setArray(UChar *array, int32_t len, int32_t capacity) {
42776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  setLength(len);
42786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  fUnion.fFields.fArray = array;
42796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  fUnion.fFields.fCapacity = capacity;
42806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
42836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator= (UChar ch)
42846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(0, length(), &ch, 0, 1); }
42856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
42876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator= (UChar32 ch)
42886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return replace(0, length(), ch); }
42896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
42916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::setTo(const UnicodeString& srcText,
42926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t srcStart,
42936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t srcLength)
42946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
42956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  unBogus();
42966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doReplace(0, length(), srcText, srcStart, srcLength);
42976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
42986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
42996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::setTo(const UnicodeString& srcText,
43016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t srcStart)
43026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
43036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  unBogus();
43046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  srcText.pinIndex(srcStart);
43056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doReplace(0, length(), srcText, srcStart, srcText.length() - srcStart);
43066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
43076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::setTo(const UnicodeString& srcText)
43106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
43116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return copyFrom(srcText);
43126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
43136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::setTo(const UChar *srcChars,
43166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t srcLength)
43176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
43186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  unBogus();
43196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doReplace(0, length(), srcChars, 0, srcLength);
43206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
43216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::setTo(UChar srcChar)
43246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
43256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  unBogus();
43266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doReplace(0, length(), &srcChar, 0, 1);
43276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
43286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::setTo(UChar32 srcChar)
43316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
43326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  unBogus();
43336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return replace(0, length(), srcChar);
43346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
43356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::append(const UnicodeString& srcText,
43386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcStart,
43396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength)
43406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(length(), 0, srcText, srcStart, srcLength); }
43416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::append(const UnicodeString& srcText)
43446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(length(), 0, srcText, 0, srcText.length()); }
43456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::append(const UChar *srcChars,
43486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcStart,
43496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength)
43506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(length(), 0, srcChars, srcStart, srcLength); }
43516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::append(const UChar *srcChars,
43546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength)
43556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(length(), 0, srcChars, 0, srcLength); }
43566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::append(UChar srcChar)
43596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(length(), 0, &srcChar, 0, 1); }
43606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator+= (UChar ch)
43636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(length(), 0, &ch, 0, 1); }
43646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator+= (UChar32 ch) {
43676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return append(ch);
43686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
43696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::operator+= (const UnicodeString& srcText)
43726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(length(), 0, srcText, 0, srcText.length()); }
43736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::insert(int32_t start,
43766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              const UnicodeString& srcText,
43776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcStart,
43786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength)
43796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, 0, srcText, srcStart, srcLength); }
43806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::insert(int32_t start,
43836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              const UnicodeString& srcText)
43846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, 0, srcText, 0, srcText.length()); }
43856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::insert(int32_t start,
43886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              const UChar *srcChars,
43896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcStart,
43906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength)
43916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, 0, srcChars, srcStart, srcLength); }
43926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
43946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::insert(int32_t start,
43956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              const UChar *srcChars,
43966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              int32_t srcLength)
43976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, 0, srcChars, 0, srcLength); }
43986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
43996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
44006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::insert(int32_t start,
44016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UChar srcChar)
44026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, 0, &srcChar, 0, 1); }
44036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
44056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::insert(int32_t start,
44066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org              UChar32 srcChar)
44076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return replace(start, 0, srcChar); }
44086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
44116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::remove()
44126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
44136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  // remove() of a bogus string makes the string empty and non-bogus
44146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(isBogus()) {
44156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    setToEmpty();
44166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
44176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    fShortLength = 0;
44186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
44196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return *this;
44206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
44216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
44236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::remove(int32_t start,
44246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org             int32_t _length)
44256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
44266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(start <= 0 && _length == INT32_MAX) {
44276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        // remove(guaranteed everything) of a bogus string makes the string empty and non-bogus
44286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        return remove();
44296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
44306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return doReplace(start, _length, NULL, 0, 0);
44316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
44326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
44346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::removeBetween(int32_t start,
44356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                int32_t limit)
44366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReplace(start, limit - start, NULL, 0, 0); }
44376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString &
44396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::retainBetween(int32_t start, int32_t limit) {
44406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  truncate(limit);
44416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  return doReplace(0, start, NULL, 0, 0);
44426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
44436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool
44456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::truncate(int32_t targetLength)
44466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{
44476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  if(isBogus() && targetLength == 0) {
44486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // truncate(0) of a bogus string makes the string empty and non-bogus
44496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    unBogus();
44506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
44516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else if((uint32_t)targetLength < (uint32_t)length()) {
44526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    setLength(targetLength);
44536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return TRUE;
44546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  } else {
44556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return FALSE;
44566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org  }
44576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
44586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
44606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::reverse()
44616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReverse(0, length()); }
44626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeString&
44646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgUnicodeString::reverse(int32_t start,
44656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               int32_t _length)
44666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org{ return doReverse(start, _length); }
44676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
44696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
44706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
4471