16f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/*
26f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org***************************************************************************
36f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* Copyright (C) 1999-2013, International Business Machines Corporation
46f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org* and others. All Rights Reserved.
56f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org***************************************************************************
66f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   Date        Name        Description
76f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*   10/20/99    alan        Creation.
86f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org***************************************************************************
96f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org*/
106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef UNICODESET_H
126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#define UNICODESET_H
136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unifilt.h"
156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/unistr.h"
166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#include "unicode/uset.h"
176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \file
206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \brief C++ API: Unicode Set
216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_BEGIN
246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org// Forward Declarations.
266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgvoid UnicodeSet_initInclusion(int32_t src, UErrorCode &status); /**< @internal */
276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass BMPSet;
296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass ParsePosition;
306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass RBBIRuleScanner;
316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass SymbolTable;
326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass UnicodeSetStringSpan;
336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass UVector;
346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass RuleCharacterIterator;
356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org/**
376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A mutable set of Unicode characters and multicharacter strings.  Objects of this class
386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * represent <em>character classes</em> used in regular expressions.
396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * A character specifies a subset of Unicode code points.  Legal
406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * code points are U+0000 to U+10FFFF, inclusive.
416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The UnicodeSet class is not designed to be subclassed.
436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><code>UnicodeSet</code> supports two APIs. The first is the
456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <em>operand</em> API that allows the caller to modify the value of
466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * a <code>UnicodeSet</code> object. It conforms to Java 2's
476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>java.util.Set</code> interface, although
486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>UnicodeSet</code> does not actually implement that
496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * interface. All methods of <code>Set</code> are supported, with the
506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * modification that they take a character range or single character
516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * instead of an <code>Object</code>, and they take a
526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>UnicodeSet</code> instead of a <code>Collection</code>.  The
536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * operand API may be thought of in terms of boolean logic: a boolean
546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * OR is implemented by <code>add</code>, a boolean AND is implemented
556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * by <code>retain</code>, a boolean XOR is implemented by
566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>complement</code> taking an argument, and a boolean NOT is
576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * implemented by <code>complement</code> with no argument.  In terms
586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of traditional set theory function names, <code>add</code> is a
596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * union, <code>retain</code> is an intersection, <code>remove</code>
606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * is an asymmetric difference, and <code>complement</code> with no
616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * argument is a set complement with respect to the superset range
626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>MIN_VALUE-MAX_VALUE</code>
636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>The second API is the
656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>applyPattern()</code>/<code>toPattern()</code> API from the
666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>java.text.Format</code>-derived classes.  Unlike the
676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * methods that add characters, add categories, and control the logic
686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * of the set, the method <code>applyPattern()</code> sets all
696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * attributes of a <code>UnicodeSet</code> at once, based on a
706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * string pattern.
716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>Pattern syntax</b></p>
736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Patterns are accepted by the constructors and the
756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>applyPattern()</code> methods and returned by the
766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <code>toPattern()</code> method.  These patterns follow a syntax
776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * similar to that employed by version 8 regular expression character
786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * classes.  Here are some simple examples:
796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \htmlonly<blockquote>\endhtmlonly
816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   <table>
826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr align="top">
836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="left"><code>[]</code></td>
846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top">No characters</td>
856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr><tr align="top">
866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="left"><code>[a]</code></td>
876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top">The character 'a'</td>
886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr><tr align="top">
896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="left"><code>[ae]</code></td>
906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top">The characters 'a' and 'e'</td>
916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr>
936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="left"><code>[a-e]</code></td>
946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top">The characters 'a' through 'e' inclusive, in Unicode code
956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       point order</td>
966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr>
986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="left"><code>[\\u4E01]</code></td>
996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top">The character U+4E01</td>
1006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
1016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr>
1026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="left"><code>[a{ab}{ac}]</code></td>
1036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top">The character 'a' and the multicharacter strings &quot;ab&quot; and
1046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       &quot;ac&quot;</td>
1056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
1066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr>
1076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="left"><code>[\\p{Lu}]</code></td>
1086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top">All characters in the general category Uppercase Letter</td>
1096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
1106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   </table>
1116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \htmlonly</blockquote>\endhtmlonly
1126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Any character may be preceded by a backslash in order to remove any special
1146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * meaning.  White space characters, as defined by UCharacter.isWhitespace(), are
1156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * ignored, unless they are escaped.
1166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Property patterns specify a set of characters having a certain
1186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * property as defined by the Unicode standard.  Both the POSIX-like
1196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "[:Lu:]" and the Perl-like syntax "\\p{Lu}" are recognized.  For a
1206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * complete list of supported property patterns, see the User's Guide
1216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * for UnicodeSet at
1226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <a href="http://icu-project.org/userguide/unicodeSet.html">
1236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * http://icu-project.org/userguide/unicodeSet.html</a>.
1246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Actual determination of property data is defined by the underlying
1256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Unicode database as implemented by UCharacter.
1266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Patterns specify individual characters, ranges of characters, and
1286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Unicode property sets.  When elements are concatenated, they
1296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * specify their union.  To complement a set, place a '^' immediately
1306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * after the opening '['.  Property patterns are inverted by modifying
1316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * their delimiters; "[:^foo]" and "\\P{foo}".  In any other location,
1326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * '^' has no special meaning.
1336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Ranges are indicated by placing two a '-' between two
1356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * characters, as in "a-z".  This specifies the range of all
1366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * characters from the left to the right, in Unicode order.  If the
1376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * left character is greater than or equal to the
1386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * right character it is a syntax error.  If a '-' occurs as the first
1396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * character after the opening '[' or '[^', or if it occurs as the
1406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * last character before the closing ']', then it is taken as a
1416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * literal.  Thus "[a\-b]", "[-ab]", and "[ab-]" all indicate the same
1426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * set of three characters, 'a', 'b', and '-'.
1436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Sets may be intersected using the '&' operator or the asymmetric
1456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * set difference may be taken using the '-' operator, for example,
1466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "[[:L:]&[\\u0000-\\u0FFF]]" indicates the set of all Unicode letters
1476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * with values less than 4096.  Operators ('&' and '|') have equal
1486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * precedence and bind left-to-right.  Thus
1496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "[[:L:]-[a-z]-[\\u0100-\\u01FF]]" is equivalent to
1506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * "[[[:L:]-[a-z]]-[\\u0100-\\u01FF]]".  This only really matters for
1516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * difference; intersection is commutative.
1526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <table>
1546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr valign=top><td nowrap><code>[a]</code><td>The set containing 'a'
1556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr valign=top><td nowrap><code>[a-z]</code><td>The set containing 'a'
1566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * through 'z' and all letters in between, in Unicode order
1576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr valign=top><td nowrap><code>[^a-z]</code><td>The set containing
1586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * all characters but 'a' through 'z',
1596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * that is, U+0000 through 'a'-1 and 'z'+1 through U+10FFFF
1606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr valign=top><td nowrap><code>[[<em>pat1</em>][<em>pat2</em>]]</code>
1616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>The union of sets specified by <em>pat1</em> and <em>pat2</em>
1626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr valign=top><td nowrap><code>[[<em>pat1</em>]&[<em>pat2</em>]]</code>
1636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>The intersection of sets specified by <em>pat1</em> and <em>pat2</em>
1646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr valign=top><td nowrap><code>[[<em>pat1</em>]-[<em>pat2</em>]]</code>
1656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>The asymmetric difference of sets specified by <em>pat1</em> and
1666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <em>pat2</em>
1676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr valign=top><td nowrap><code>[:Lu:] or \\p{Lu}</code>
1686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>The set of characters having the specified
1696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Unicode property; in
1706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * this case, Unicode uppercase letters
1716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <tr valign=top><td nowrap><code>[:^Lu:] or \\P{Lu}</code>
1726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <td>The set of characters <em>not</em> having the given
1736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * Unicode property
1746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * </table>
1756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>Warning</b>: you cannot add an empty string ("") to a UnicodeSet.</p>
1776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p><b>Formal syntax</b></p>
1796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
1806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \htmlonly<blockquote>\endhtmlonly
1816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   <table>
1826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr align="top">
1836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="right"><code>pattern :=&nbsp; </code></td>
1846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top"><code>('[' '^'? item* ']') |
1856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       property</code></td>
1866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
1876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr align="top">
1886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="right"><code>item :=&nbsp; </code></td>
1896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top"><code>char | (char '-' char) | pattern-expr<br>
1906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       </code></td>
1916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
1926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr align="top">
1936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="right"><code>pattern-expr :=&nbsp; </code></td>
1946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top"><code>pattern | pattern-expr pattern |
1956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       pattern-expr op pattern<br>
1966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       </code></td>
1976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
1986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr align="top">
1996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="right"><code>op :=&nbsp; </code></td>
2006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top"><code>'&amp;' | '-'<br>
2016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       </code></td>
2026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
2036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr align="top">
2046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="right"><code>special :=&nbsp; </code></td>
2056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top"><code>'[' | ']' | '-'<br>
2066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       </code></td>
2076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
2086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr align="top">
2096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="right"><code>char :=&nbsp; </code></td>
2106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top"><em>any character that is not</em><code> special<br>
2116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       | ('\' </code><em>any character</em><code>)<br>
2126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       | ('\\u' hex hex hex hex)<br>
2136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       </code></td>
2146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
2156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr align="top">
2166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="right"><code>hex :=&nbsp; </code></td>
2176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top"><em>any character for which
2186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       </em><code>Character.digit(c, 16)</code><em>
2196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       returns a non-negative result</em></td>
2206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
2216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr>
2226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td nowrap valign="top" align="right"><code>property :=&nbsp; </code></td>
2236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td valign="top"><em>a Unicode property set pattern</em></td>
2246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
2256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   </table>
2266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   <br>
2276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   <table border="1">
2286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     <tr>
2296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       <td>Legend: <table>
2306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         <tr>
2316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td nowrap valign="top"><code>a := b</code></td>
2326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td width="20" valign="top">&nbsp; </td>
2336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td valign="top"><code>a</code> may be replaced by <code>b</code> </td>
2346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         </tr>
2356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         <tr>
2366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td nowrap valign="top"><code>a?</code></td>
2376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td valign="top"></td>
2386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td valign="top">zero or one instance of <code>a</code><br>
2396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           </td>
2406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         </tr>
2416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         <tr>
2426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td nowrap valign="top"><code>a*</code></td>
2436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td valign="top"></td>
2446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td valign="top">one or more instances of <code>a</code><br>
2456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           </td>
2466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         </tr>
2476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         <tr>
2486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td nowrap valign="top"><code>a | b</code></td>
2496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td valign="top"></td>
2506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td valign="top">either <code>a</code> or <code>b</code><br>
2516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           </td>
2526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         </tr>
2536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         <tr>
2546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td nowrap valign="top"><code>'a'</code></td>
2556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td valign="top"></td>
2566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *           <td valign="top">the literal string between the quotes </td>
2576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *         </tr>
2586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       </table>
2596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *       </td>
2606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *     </tr>
2616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   </table>
2626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * \htmlonly</blockquote>\endhtmlonly
2636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * <p>Note:
2656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *  - Most UnicodeSet methods do not take a UErrorCode parameter because
2666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   there are usually very few opportunities for failure other than a shortage
2676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   of memory, error codes in low-level C++ string methods would be inconvenient,
2686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   and the error code as the last parameter (ICU convention) would prevent
2696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   the use of default parameter values.
2706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   Instead, such methods set the UnicodeSet into a "bogus" state
2716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *   (see isBogus()) if an error occurs.
2726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org *
2736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @author Alan Liu
2746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org * @stable ICU 2.0
2756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org */
2766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgclass U_COMMON_API UnicodeSet : public UnicodeFilter {
2776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t len; // length of list used; 0 <= len <= capacity
2796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t capacity; // capacity of list
2806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32* list; // MUST be terminated with HIGH
2816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    BMPSet *bmpSet; // The set is frozen iff either bmpSet or stringSpan is not NULL.
2826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32* buffer; // internal buffer, may be NULL
2836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t bufferCapacity; // capacity of buffer
2846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t patLen;
2856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
2876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The pattern representation of this set.  This may not be the
2886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * most economical pattern.  It is the pattern supplied to
2896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * applyPattern(), with variables substituted and whitespace
2906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * removed.  For sets constructed without applyPattern(), or
2916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * modified using the non-pattern API, this string will be empty,
2926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * indicating that toPattern() must generate a pattern
2936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * representation from the inversion list.
2946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
2956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar *pat;
2966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UVector* strings; // maintained in sorted order
2976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSetStringSpan *stringSpan;
2986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
2996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
3006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    enum { // constants
3016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        kIsBogus = 1       // This set is bogus (i.e. not valid)
3026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
3036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    uint8_t fFlags;         // Bit flag (see constants above)
3046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
3056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Determine if this object contains a valid set.
3076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A bogus set has no value. It is different from an empty set.
3086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * It can be used to indicate that no set value is available.
3096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return TRUE if the set is valid, FALSE otherwise
3116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see setToBogus()
3126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.0
3136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline UBool isBogus(void) const;
3156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Make this UnicodeSet object invalid.
3186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The string will test TRUE with isBogus().
3196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A bogus set has no value. It is different from an empty set.
3216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * It can be used to indicate that no set value is available.
3226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This utility function is used throughout the UnicodeSet
3246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * implementation to indicate that a UnicodeSet operation failed,
3256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and may be used in other functions,
3266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * especially but not exclusively when such functions do not
3276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * take a UErrorCode for simplicity.
3286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see isBogus()
3306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.0
3316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void setToBogus();
3336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
3356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    enum {
3376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
3386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Minimum value that can be stored in a UnicodeSet.
3396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 2.4
3406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
3416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        MIN_VALUE = 0,
3426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        /**
3446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * Maximum value that can be stored in a UnicodeSet.
3456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         * @stable ICU 2.4
3466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org         */
3476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        MAX_VALUE = 0x10ffff
3486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    };
3496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
3516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Constructors &c
3526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
3536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
3556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs an empty set.
3586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet();
3616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a set containing the given range. If <code>end >
3646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * start</code> then an empty set is created.
3656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
3666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start first character, inclusive, of range
3676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param end last character, inclusive, of range
3686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
3696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet(UChar32 start, UChar32 end);
3716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a set from the given pattern.  See the class
3746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * description for the syntax of the pattern language.
3756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pattern a string specifying what characters are in the set
3766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status returns <code>U_ILLEGAL_ARGUMENT_ERROR</code> if the pattern
3776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contains a syntax error.
3786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
3796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet(const UnicodeString& pattern,
3816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               UErrorCode& status);
3826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
3836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_INTERNAL_API
3846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
3856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a set from the given pattern.  See the class
3866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * description for the syntax of the pattern language.
3876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pattern a string specifying what characters are in the set
3886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param options bitmask for options to apply to the pattern.
3896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE.
3906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param symbols a symbol table mapping variable names to values
3916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and stand-in characters to UnicodeSets; may be NULL
3926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status returns <code>U_ILLEGAL_ARGUMENT_ERROR</code> if the pattern
3936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contains a syntax error.
3946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
3956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
3966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet(const UnicodeString& pattern,
3976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               uint32_t options,
3986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const SymbolTable* symbols,
3996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               UErrorCode& status);
4006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_INTERNAL_API */
4016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a set from the given pattern.  See the class description
4046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * for the syntax of the pattern language.
4056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pattern a string specifying what characters are in the set
4066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pos on input, the position in pattern at which to start parsing.
4076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * On output, the position after the last character parsed.
4086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param options bitmask for options to apply to the pattern.
4096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE.
4106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param symbols a symbol table mapping variable names to values
4116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and stand-in characters to UnicodeSets; may be NULL
4126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status input-output error code
4136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.8
4146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet(const UnicodeString& pattern, ParsePosition& pos,
4166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               uint32_t options,
4176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               const SymbolTable* symbols,
4186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org               UErrorCode& status);
4196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Constructs a set that is identical to the given UnicodeSet.
4226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet(const UnicodeSet& o);
4256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Destructs the set.
4286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual ~UnicodeSet();
4316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Assigns this object to be a copy of another.
4346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
4356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& operator=(const UnicodeSet& o);
4386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Compares the specified object with this set for equality.  Returns
4416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <tt>true</tt> if the two sets
4426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * have the same size, and every member of the specified set is
4436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contained in this set (or equivalently, every member of this set is
4446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contained in the specified set).
4456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param o set to be compared for equality with this set.
4476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return <tt>true</tt> if the specified set is equal to this set.
4486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool operator==(const UnicodeSet& o) const;
4516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Compares the specified object with this set for equality.  Returns
4546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <tt>true</tt> if the specified set is not equal to this set.
4556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool operator!=(const UnicodeSet& o) const;
4586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a copy of this object.  All UnicodeFunctor objects have
4616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to support cloning in order to allow classes using
4626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UnicodeFunctors, such as Transliterator, to implement cloning.
4636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If this set is frozen, then the clone will be frozen as well.
4646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Use cloneAsThawed() for a mutable clone of a frozen set.
4656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see cloneAsThawed
4666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeFunctor* clone() const;
4696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the hash code value for this set.
4726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the hash code value for this set.
4746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see Object#hashCode()
4756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
4766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t hashCode(void) const;
4786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Get a UnicodeSet pointer from a USet
4816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param uset a USet (the ICU plain C type for UnicodeSet)
4836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the corresponding UnicodeSet pointer.
4846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.2
4866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline static UnicodeSet *fromUSet(USet *uset);
4886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
4906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Get a UnicodeSet pointer from a const USet
4916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param uset a const USet (the ICU plain C type for UnicodeSet)
4936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the corresponding UnicodeSet pointer.
4946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
4956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.2
4966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
4976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline static const UnicodeSet *fromUSet(const USet *uset);
4986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
4996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Produce a USet * pointer for this UnicodeSet.
5016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * USet is the plain C type for UnicodeSet
5026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a USet pointer for this UnicodeSet
5046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.2
5056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline USet *toUSet();
5076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Produce a const USet * pointer for this UnicodeSet.
5116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * USet is the plain C type for UnicodeSet
5126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a const USet pointer for this UnicodeSet
5146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.2
5156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline const USet * toUSet() const;
5176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
5206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Freezable API
5216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
5226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Determines whether the set has been frozen (made immutable) or not.
5256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See the ICU4J Freezable interface for details.
5266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return TRUE/FALSE for whether the set has been frozen
5276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see freeze
5286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see cloneAsThawed
5296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.8
5306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline UBool isFrozen() const;
5326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Freeze the set (make it immutable).
5356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Once frozen, it cannot be unfrozen and is therefore thread-safe
5366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * until it is deleted.
5376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See the ICU4J Freezable interface for details.
5386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Freezing the set may also make some operations faster, for example
5396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contains() and span().
5406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified. (It remains frozen.)
5416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return this set.
5426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see isFrozen
5436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see cloneAsThawed
5446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.8
5456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeFunctor *freeze();
5476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Clone the set and make the clone mutable.
5506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See the ICU4J Freezable interface for details.
5516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the mutable clone
5526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see freeze
5536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see isFrozen
5546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.8
5556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeFunctor *cloneAsThawed() const;
5576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
5596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Public API
5606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
5616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Make this object represent the range <code>start - end</code>.
5646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If <code>end > start</code> then this object is set to an
5656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * an empty range.
5666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
5676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
5686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start first character in the set, inclusive
5696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param end last character in the set, inclusive
5706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
5716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& set(UChar32 start, UChar32 end);
5736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return true if the given position, in the given pattern, appears
5766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to be the start of a UnicodeSet pattern.
5776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
5786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UBool resemblesPattern(const UnicodeString& pattern,
5806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                  int32_t pos);
5816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Modifies this set to represent the set specified by the given
5846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * pattern, ignoring Unicode Pattern_White_Space characters.
5856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See the class description for the syntax of the pattern language.
5866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
5876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pattern a string specifying what characters are in the set
5886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status returns <code>U_ILLEGAL_ARGUMENT_ERROR</code> if the pattern
5896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contains a syntax error.
5906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <em> Empties the set passed before applying the pattern.</em>
5916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a reference to this
5926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
5936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
5946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& applyPattern(const UnicodeString& pattern,
5956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             UErrorCode& status);
5966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
5976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#ifndef U_HIDE_INTERNAL_API
5986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
5996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Modifies this set to represent the set specified by the given
6006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * pattern, optionally ignoring Unicode Pattern_White_Space characters.
6016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See the class description for the syntax of the pattern language.
6026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
6036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pattern a string specifying what characters are in the set
6046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param options bitmask for options to apply to the pattern.
6056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE.
6066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param symbols a symbol table mapping variable names to
6076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * values and stand-ins to UnicodeSets; may be NULL
6086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status returns <code>U_ILLEGAL_ARGUMENT_ERROR</code> if the pattern
6096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contains a syntax error.
6106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *<em> Empties the set passed before applying the pattern.</em>
6116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a reference to this
6126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @internal
6136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& applyPattern(const UnicodeString& pattern,
6156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             uint32_t options,
6166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             const SymbolTable* symbols,
6176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             UErrorCode& status);
6186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif  /* U_HIDE_INTERNAL_API */
6196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Parses the given pattern, starting at the given position.  The
6226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * character at pattern.charAt(pos.getIndex()) must be '[', or the
6236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * parse fails.  Parsing continues until the corresponding closing
6246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * ']'.  If a syntax error is encountered between the opening and
6256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * closing brace, the parse fails.  Upon return from a successful
6266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * parse, the ParsePosition is updated to point to the character
6276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * following the closing ']', and a StringBuffer containing a
6286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * pairs list for the parsed pattern is returned.  This method calls
6296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * itself recursively to parse embedded subpatterns.
6306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *<em> Empties the set passed before applying the pattern.</em>
6316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
6326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pattern the string containing the pattern to be parsed.
6346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The portion of the string from pos.getIndex(), which must be a
6356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * '[', to the corresponding closing ']', is parsed.
6366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pos upon entry, the position at which to being parsing.
6376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The character at pattern.charAt(pos.getIndex()) must be a '['.
6386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Upon return from a successful parse, pos.getIndex() is either
6396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the character after the closing ']' of the parsed pattern, or
6406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * pattern.length() if the closing ']' is the last character of
6416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the pattern string.
6426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param options bitmask for options to apply to the pattern.
6436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Valid options are USET_IGNORE_SPACE and USET_CASE_INSENSITIVE.
6446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param symbols a symbol table mapping variable names to
6456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * values and stand-ins to UnicodeSets; may be NULL
6466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param status returns <code>U_ILLEGAL_ARGUMENT_ERROR</code> if the pattern
6476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contains a syntax error.
6486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a reference to this
6496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.8
6506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& applyPattern(const UnicodeString& pattern,
6526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             ParsePosition& pos,
6536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             uint32_t options,
6546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             const SymbolTable* symbols,
6556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             UErrorCode& status);
6566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns a string representation of this set.  If the result of
6596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * calling this function is passed to a UnicodeSet constructor, it
6606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * will produce another set that is equal to this one.
6616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
6626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param result the string to receive the rules.  Previous
6636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contents will be deleted.
6646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param escapeUnprintable if TRUE then convert unprintable
6656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * character to their hex escape representations, \\uxxxx or
6666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * \\Uxxxxxxxx.  Unprintable characters are those other than
6676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * U+000A, U+0020..U+007E.
6686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
6696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeString& toPattern(UnicodeString& result,
6716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             UBool escapeUnprintable = FALSE) const;
6726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
6746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Modifies this set to contain those code points which have the given value
6756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * for the given binary or enumerated property, as returned by
6766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * u_getIntPropertyValue.  Prior contents of this set are lost.
6776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
6786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param prop a property in the range UCHAR_BIN_START..UCHAR_BIN_LIMIT-1
6806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * or UCHAR_INT_START..UCHAR_INT_LIMIT-1
6816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * or UCHAR_MASK_START..UCHAR_MASK_LIMIT-1.
6826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param value a value in the range u_getIntPropertyMinValue(prop)..
6846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * u_getIntPropertyMaxValue(prop), with one exception.  If prop is
6856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * UCHAR_GENERAL_CATEGORY_MASK, then value should not be a UCharCategory, but
6866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * rather a mask value produced by U_GET_GC_MASK().  This allows grouped
6876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * categories such as [:L:] to be represented.
6886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ec error code input/output parameter
6906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a reference to this set
6926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
6936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
6946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
6956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& applyIntPropertyValue(UProperty prop,
6966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      int32_t value,
6976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                      UErrorCode& ec);
6986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
6996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Modifies this set to contain those code points which have the
7016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * given value for the given property.  Prior contents of this
7026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * set are lost.
7036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
7046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param prop a property alias, either short or long.  The name is matched
7066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * loosely.  See PropertyAliases.txt for names and a description of loose
7076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * matching.  If the value string is empty, then this string is interpreted
7086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * as either a General_Category value alias, a Script value alias, a binary
7096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * property alias, or a special ID.  Special IDs are matched loosely and
7106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * correspond to the following sets:
7116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * "ANY" = [\\u0000-\\U0010FFFF],
7136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * "ASCII" = [\\u0000-\\u007F],
7146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * "Assigned" = [:^Cn:].
7156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param value a value alias, either short or long.  The name is matched
7176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * loosely.  See PropertyValueAliases.txt for names and a description of
7186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * loose matching.  In addition to aliases listed, numeric values and
7196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * canonical combining classes may be expressed numerically, e.g., ("nv",
7206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * "0.5") or ("ccc", "220").  The value string may also be empty.
7216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ec error code input/output parameter
7236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a reference to this set
7256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
7276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& applyPropertyAlias(const UnicodeString& prop,
7296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                   const UnicodeString& value,
7306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                   UErrorCode& ec);
7316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the number of elements in this set (its cardinality).
7346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Note than the elements of a set may include both individual
7356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * codepoints and strings.
7366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the number of elements in this set (its cardinality).
7386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
7396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t size(void) const;
7416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns <tt>true</tt> if this set contains no elements.
7446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
7456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return <tt>true</tt> if this set contains no elements.
7466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
7476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool isEmpty(void) const;
7496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns true if this set contains the given character.
7526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This function works faster with a frozen set.
7536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param c character to be checked for containment
7546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the test condition is met
7556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
7566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool contains(UChar32 c) const;
7586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns true if this set contains every character
7616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of the given range.
7626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start first character, inclusive, of the range
7636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param end last character, inclusive, of the range
7646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the test condition is met
7656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
7666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool contains(UChar32 start, UChar32 end) const;
7686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns <tt>true</tt> if this set contains the given
7716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * multicharacter string.
7726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s string to be checked for containment
7736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return <tt>true</tt> if this set contains the specified string
7746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
7756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool contains(const UnicodeString& s) const;
7776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns true if this set contains all the characters and strings
7806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of the given set.
7816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param c set to be checked for containment
7826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the test condition is met
7836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
7846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool containsAll(const UnicodeSet& c) const;
7866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns true if this set contains all the characters
7896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of the given string.
7906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s string containing characters to be checked for containment
7916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the test condition is met
7926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
7936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
7946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool containsAll(const UnicodeString& s) const;
7956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
7966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
7976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns true if this set contains none of the characters
7986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of the given range.
7996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start first character, inclusive, of the range
8006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param end last character, inclusive, of the range
8016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the test condition is met
8026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
8036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool containsNone(UChar32 start, UChar32 end) const;
8056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns true if this set contains none of the characters and strings
8086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of the given set.
8096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param c set to be checked for containment
8106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the test condition is met
8116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
8126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool containsNone(const UnicodeSet& c) const;
8146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns true if this set contains none of the characters
8176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of the given string.
8186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s string containing characters to be checked for containment
8196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the test condition is met
8206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
8216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool containsNone(const UnicodeString& s) const;
8236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns true if this set contains one or more of the characters
8266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * in the given range.
8276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start first character, inclusive, of the range
8286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param end last character, inclusive, of the range
8296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the condition is met
8306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
8316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline UBool containsSome(UChar32 start, UChar32 end) const;
8336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns true if this set contains one or more of the characters
8366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and strings of the given set.
8376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s The set to be checked for containment
8386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the condition is met
8396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
8406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline UBool containsSome(const UnicodeSet& s) const;
8426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns true if this set contains one or more of the characters
8456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * of the given string.
8466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s string containing characters to be checked for containment
8476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return true if the condition is met
8486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
8496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline UBool containsSome(const UnicodeString& s) const;
8516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the length of the initial substring of the input string which
8546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * consists only of characters and strings that are contained in this set
8556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (USET_SPAN_CONTAINED, USET_SPAN_SIMPLE),
8566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * or only of characters and strings that are not contained
8576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * in this set (USET_SPAN_NOT_CONTAINED).
8586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See USetSpanCondition for details.
8596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Similar to the strspn() C library function.
8606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Unpaired surrogates are treated according to contains() of their surrogate code points.
8616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This function works faster with a frozen set and with a non-negative string length argument.
8626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s start of the string
8636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param length of the string; can be -1 for NUL-terminated
8646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param spanCondition specifies the containment condition
8656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the length of the initial substring according to the spanCondition;
8666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *         0 if the start of the string does not fit the spanCondition
8676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.8
8686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see USetSpanCondition
8696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t span(const UChar *s, int32_t length, USetSpanCondition spanCondition) const;
8716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the end of the substring of the input string according to the USetSpanCondition.
8746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Same as <code>start+span(s.getBuffer()+start, s.length()-start, spanCondition)</code>
8756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * after pinning start to 0<=start<=s.length().
8766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the string
8776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start the start index in the string for the span operation
8786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param spanCondition specifies the containment condition
8796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the exclusive end of the substring according to the spanCondition;
8806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *         the substring s.tempSubStringBetween(start, end) fulfills the spanCondition
8816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.4
8826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see USetSpanCondition
8836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
8846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline int32_t span(const UnicodeString &s, int32_t start, USetSpanCondition spanCondition) const;
8856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
8866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
8876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the start of the trailing substring of the input string which
8886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * consists only of characters and strings that are contained in this set
8896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (USET_SPAN_CONTAINED, USET_SPAN_SIMPLE),
8906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * or only of characters and strings that are not contained
8916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * in this set (USET_SPAN_NOT_CONTAINED).
8926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See USetSpanCondition for details.
8936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Unpaired surrogates are treated according to contains() of their surrogate code points.
8946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This function works faster with a frozen set and with a non-negative string length argument.
8956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s start of the string
8966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param length of the string; can be -1 for NUL-terminated
8976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param spanCondition specifies the containment condition
8986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the start of the trailing substring according to the spanCondition;
8996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *         the string length if the end of the string does not fit the spanCondition
9006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.8
9016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see USetSpanCondition
9026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t spanBack(const UChar *s, int32_t length, USetSpanCondition spanCondition) const;
9046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the start of the substring of the input string according to the USetSpanCondition.
9076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Same as <code>spanBack(s.getBuffer(), limit, spanCondition)</code>
9086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * after pinning limit to 0<=end<=s.length().
9096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the string
9106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param limit the exclusive-end index in the string for the span operation
9116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *              (use s.length() or INT32_MAX for spanning back from the end of the string)
9126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param spanCondition specifies the containment condition
9136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the start of the substring according to the spanCondition;
9146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *         the substring s.tempSubStringBetween(start, limit) fulfills the spanCondition
9156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.4
9166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see USetSpanCondition
9176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    inline int32_t spanBack(const UnicodeString &s, int32_t limit, USetSpanCondition spanCondition) const;
9196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the length of the initial substring of the input string which
9226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * consists only of characters and strings that are contained in this set
9236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (USET_SPAN_CONTAINED, USET_SPAN_SIMPLE),
9246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * or only of characters and strings that are not contained
9256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * in this set (USET_SPAN_NOT_CONTAINED).
9266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See USetSpanCondition for details.
9276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Similar to the strspn() C library function.
9286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Malformed byte sequences are treated according to contains(0xfffd).
9296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This function works faster with a frozen set and with a non-negative string length argument.
9306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s start of the string (UTF-8)
9316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param length of the string; can be -1 for NUL-terminated
9326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param spanCondition specifies the containment condition
9336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the length of the initial substring according to the spanCondition;
9346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *         0 if the start of the string does not fit the spanCondition
9356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.8
9366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see USetSpanCondition
9376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t spanUTF8(const char *s, int32_t length, USetSpanCondition spanCondition) const;
9396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the start of the trailing substring of the input string which
9426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * consists only of characters and strings that are contained in this set
9436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (USET_SPAN_CONTAINED, USET_SPAN_SIMPLE),
9446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * or only of characters and strings that are not contained
9456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * in this set (USET_SPAN_NOT_CONTAINED).
9466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * See USetSpanCondition for details.
9476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Malformed byte sequences are treated according to contains(0xfffd).
9486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This function works faster with a frozen set and with a non-negative string length argument.
9496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s start of the string (UTF-8)
9506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param length of the string; can be -1 for NUL-terminated
9516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param spanCondition specifies the containment condition
9526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the start of the trailing substring according to the spanCondition;
9536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *         the string length if the end of the string does not fit the spanCondition
9546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 3.8
9556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see USetSpanCondition
9566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t spanBackUTF8(const char *s, int32_t length, USetSpanCondition spanCondition) const;
9586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Implement UnicodeMatcher::matches()
9616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
9626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UMatchDegree matches(const Replaceable& text,
9646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         int32_t& offset,
9656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         int32_t limit,
9666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                         UBool incremental);
9676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
9696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the longest match for s in text at the given position.
9716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If limit > start then match forward from start+1 to limit
9726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * matching all characters except s.charAt(0).  If limit < start,
9736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * go backward starting from start-1 matching all characters
9746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * except s.charAt(s.length()-1).  This method assumes that the
9756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * first character, text.charAt(start), matches s, so it does not
9766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * check it.
9776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param text the text to match
9786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start the first character to match.  In the forward
9796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * direction, text.charAt(start) is matched against s.charAt(0).
9806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * In the reverse direction, it is matched against
9816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * s.charAt(s.length()-1).
9826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param limit the limit offset for matching, either last+1 in
9836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the forward direction, or last-1 in the reverse direction,
9846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * where last is the index of the last character to match.
9856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s
9866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return If part of s matches up to the limit, return |limit -
9876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * start|.  If all of s matches before reaching the limit, return
9886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * s.length().  If there is a mismatch between s and text, return
9896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 0
9906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
9916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static int32_t matchRest(const Replaceable& text,
9926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             int32_t start, int32_t limit,
9936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                             const UnicodeString& s);
9946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
9956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
9966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the smallest value i such that c < list[i].  Caller
9976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * must ensure that c is a legal value or this method will enter
9986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * an infinite loop.  This method performs a binary search.
9996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param c a character in the range MIN_VALUE..MAX_VALUE
10006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * inclusive
10016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the smallest integer i in the range 0..len-1,
10026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * inclusive, such that c < list[i]
10036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t findCodePoint(UChar32 c) const;
10056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgpublic:
10076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Implementation of UnicodeMatcher API.  Union the set of all
10106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * characters that may be matched by this object into the given
10116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * set.
10126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param toUnionTo the set into which to union the source characters
10136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
10146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual void addMatchSetTo(UnicodeSet& toUnionTo) const;
10166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the index of the given character within this set, where
10196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the set is ordered by ascending code point.  If the character
10206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is not in this set, return -1.  The inverse of this method is
10216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>charAt()</code>.
10226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return an index from 0..size()-1, or -1
10236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
10246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t indexOf(UChar32 c) const;
10266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns the character at the given index within this set, where
10296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the set is ordered by ascending code point.  If the index is
10306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * out of range, return (UChar32)-1.  The inverse of this method is
10316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>indexOf()</code>.
10326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param index an index from 0..size()-1
10336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the character at the given index, or (UChar32)-1.
10346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
10356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UChar32 charAt(int32_t index) const;
10376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Adds the specified range to this set if it is not already
10406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * present.  If this set already contains the specified range,
10416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the call leaves this set unchanged.  If <code>end > start</code>
10426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * then an empty range is added, leaving the set unchanged.
10436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This is equivalent to a boolean logic OR, or a set UNION.
10446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
10456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
10466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start first character, inclusive, of range to be added
10476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to this set.
10486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param end last character, inclusive, of range to be added
10496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to this set.
10506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
10516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& add(UChar32 start, UChar32 end);
10536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Adds the specified character to this set if it is not already
10566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * present.  If this set already contains the specified character,
10576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the call leaves this set unchanged.
10586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
10596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
10606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& add(UChar32 c);
10626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Adds the specified multicharacter to this set if it is not already
10656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * present.  If this set already contains the multicharacter,
10666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the call leaves this set unchanged.
10676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Thus "ch" => {"ch"}
10686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <br><b>Warning: you cannot add an empty string ("") to a UnicodeSet.</b>
10696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
10706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the source string
10716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return this object, for chaining
10726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
10736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& add(const UnicodeString& s);
10756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org private:
10776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a code point IF the string consists of a single one.
10796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * otherwise returns -1.
10806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s string to test
10816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static int32_t getSingleCP(const UnicodeString& s);
10836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void _add(const UnicodeString& s);
10856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org public:
10876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Adds each of the characters in this string to the set. Thus "ch" => {"c", "h"}
10896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If this set already any particular character, it has no effect on that character.
10906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
10916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the source string
10926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return this object, for chaining
10936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
10946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
10956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& addAll(const UnicodeString& s);
10966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
10976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
10986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Retains EACH of the characters in this string. Note: "ch" == {"c", "h"}
10996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If this set already any particular character, it has no effect on that character.
11006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
11016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the source string
11026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return this object, for chaining
11036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
11046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& retainAll(const UnicodeString& s);
11066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Complement EACH of the characters in this string. Note: "ch" == {"c", "h"}
11096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If this set already any particular character, it has no effect on that character.
11106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
11116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the source string
11126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return this object, for chaining
11136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
11146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& complementAll(const UnicodeString& s);
11166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Remove EACH of the characters in this string. Note: "ch" == {"c", "h"}
11196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If this set already any particular character, it has no effect on that character.
11206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
11216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the source string
11226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return this object, for chaining
11236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
11246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& removeAll(const UnicodeString& s);
11266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Makes a set from a multicharacter string. Thus "ch" => {"ch"}
11296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <br><b>Warning: you cannot add an empty string ("") to a UnicodeSet.</b>
11306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the source string
11316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a newly created set containing the given string.
11326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The caller owns the return object and is responsible for deleting it.
11336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
11346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UnicodeSet* U_EXPORT2 createFrom(const UnicodeString& s);
11366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Makes a set from each of the characters in the string. Thus "ch" => {"c", "h"}
11406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the source string
11416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a newly created set containing the given characters
11426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The caller owns the return object and is responsible for deleting it.
11436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
11446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UnicodeSet* U_EXPORT2 createFromAll(const UnicodeString& s);
11466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Retain only the elements in this set that are contained in the
11496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * specified range.  If <code>end > start</code> then an empty range is
11506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * retained, leaving the set empty.  This is equivalent to
11516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * a boolean logic AND, or a set INTERSECTION.
11526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
11536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
11546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start first character, inclusive, of range to be retained
11556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to this set.
11566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param end last character, inclusive, of range to be retained
11576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to this set.
11586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
11596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& retain(UChar32 start, UChar32 end);
11616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Retain the specified character from this set if it is present.
11656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
11666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
11676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& retain(UChar32 c);
11696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Removes the specified range from this set if it is present.
11726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The set will not contain the specified range once the call
11736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * returns.  If <code>end > start</code> then an empty range is
11746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * removed, leaving the set unchanged.
11756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
11766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
11776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start first character, inclusive, of range to be removed
11786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * from this set.
11796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param end last character, inclusive, of range to be removed
11806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * from this set.
11816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
11826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& remove(UChar32 start, UChar32 end);
11846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Removes the specified character from this set if it is present.
11876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The set will not contain the specified range once the call
11886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * returns.
11896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
11906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
11916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
11926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& remove(UChar32 c);
11936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
11946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
11956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Removes the specified string from this set if it is present.
11966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The set will not contain the specified character once the call
11976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * returns.
11986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
11996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the source string
12006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return this object, for chaining
12016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
12026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& remove(const UnicodeString& s);
12046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Inverts this set.  This operation modifies this set so that
12076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * its value is its complement.  This is equivalent to
12086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <code>complement(MIN_VALUE, MAX_VALUE)</code>.
12096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
12106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
12116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& complement(void);
12136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Complements the specified range in this set.  Any character in
12166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the range will be removed if it is in this set, or will be
12176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * added if it is not in this set.  If <code>end > start</code>
12186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * then an empty range is complemented, leaving the set unchanged.
12196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This is equivalent to a boolean logic XOR.
12206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
12216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param start first character, inclusive, of range to be removed
12236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * from this set.
12246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param end last character, inclusive, of range to be removed
12256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * from this set.
12266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
12276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& complement(UChar32 start, UChar32 end);
12296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Complements the specified character in this set.  The character
12326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * will be removed if it is in this set, or will be added if it is
12336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * not in this set.
12346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
12356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
12366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& complement(UChar32 c);
12386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Complement the specified string in this set.
12416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The set will not contain the specified string once the call
12426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * returns.
12436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <br><b>Warning: you cannot add an empty string ("") to a UnicodeSet.</b>
12446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
12456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param s the string to complement
12466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return this object, for chaining
12476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
12486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& complement(const UnicodeString& s);
12506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Adds all of the elements in the specified set to this set if
12536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * they're not already present.  This operation effectively
12546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * modifies this set so that its value is the <i>union</i> of the two
12556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * sets.  The behavior of this operation is unspecified if the specified
12566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * collection is modified while the operation is in progress.
12576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
12586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param c set whose elements are to be added to this set.
12606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #add(UChar32, UChar32)
12616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
12626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& addAll(const UnicodeSet& c);
12646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Retains only the elements in this set that are contained in the
12676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * specified set.  In other words, removes from this set all of
12686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * its elements that are not contained in the specified set.  This
12696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * operation effectively modifies this set so that its value is
12706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the <i>intersection</i> of the two sets.
12716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
12726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param c set that defines which elements this set will retain.
12746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
12756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& retainAll(const UnicodeSet& c);
12776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Removes from this set all of its elements that are contained in the
12806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * specified set.  This operation effectively modifies this
12816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * set so that its value is the <i>asymmetric set difference</i> of
12826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the two sets.
12836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
12846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param c set that defines which elements will be removed from
12866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *          this set.
12876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
12886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
12896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& removeAll(const UnicodeSet& c);
12906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
12916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
12926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Complements in this set all elements contained in the specified
12936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * set.  Any character in the other set will be removed if it is
12946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * in this set, or will be added if it is not in this set.
12956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
12966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
12976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param c set that defines which elements will be xor'ed from
12986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *          this set.
12996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
13006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
13016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& complementAll(const UnicodeSet& c);
13026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
13046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Removes all of the elements from this set.  This set will be
13056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * empty after this call returns.
13066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
13076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
13086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
13096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& clear(void);
13106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
13126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Close this set over the given attribute.  For the attribute
13136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * USET_CASE, the result is to modify this set so that:
13146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 1. For each character or string 'a' in this set, all strings or
13166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * characters 'b' such that foldCase(a) == foldCase(b) are added
13176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to this set.
13186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * 2. For each string 'e' in the resulting set, if e !=
13206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * foldCase(e), 'e' will be removed.
13216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Example: [aq\\u00DF{Bc}{bC}{Fi}] => [aAqQ\\u00DF\\uFB01{ss}{bc}{fi}]
13236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (Here foldCase(x) refers to the operation u_strFoldCase, and a
13256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * == b denotes that the contents are the same, not pointer
13266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * comparison.)
13276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
13296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param attribute bitmask for attributes to close over.
13316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Currently only the USET_CASE bit is supported.  Any undefined bits
13326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * are ignored.
13336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a reference to this set.
13346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.2
13356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
13366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& closeOver(int32_t attribute);
13376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
13396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Remove all strings from this set.
13406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a reference to this set.
13426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 4.2
13436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
13446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet &removeAllStrings();
13456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
13476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Iteration method that returns the number of ranges contained in
13486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * this set.
13496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getRangeStart
13506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getRangeEnd
13516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
13526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
13536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual int32_t getRangeCount(void) const;
13546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
13566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Iteration method that returns the first character in the
13576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * specified range of this set.
13586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getRangeCount
13596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getRangeEnd
13606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
13616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
13626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UChar32 getRangeStart(int32_t index) const;
13636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
13656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Iteration method that returns the last character in the
13666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * specified range of this set.
13676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getRangeStart
13686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @see #getRangeEnd
13696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
13706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
13716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UChar32 getRangeEnd(int32_t index) const;
13726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
13736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
13746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Serializes this set into an array of 16-bit integers.  Serialization
13756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (currently) only records the characters in the set; multicharacter
13766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * strings are ignored.
13776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The array has following format (each line is one 16-bit
13796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * integer):
13806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  length     = (n+2*m) | (m!=0?0x8000:0)
13826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  bmpLength  = n; present if m!=0
13836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  bmp[0]
13846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  bmp[1]
13856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  ...
13866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  bmp[n-1]
13876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  supp-high[0]
13886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  supp-low[0]
13896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  supp-high[1]
13906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  supp-low[1]
13916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  ...
13926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  supp-high[m-1]
13936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  supp-low[m-1]
13946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The array starts with a header.  After the header are n bmp
13966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * code points, then m supplementary code points.  Either n or m
13976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * or both may be zero.  n+2*m is always <= 0x7FFF.
13986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
13996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If there are no supplementary characters (if m==0) then the
14006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * header is one 16-bit integer, 'length', with value n.
14016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
14026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * If there are supplementary characters (if m!=0) then the header
14036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is two 16-bit integers.  The first, 'length', has value
14046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * (n+2*m)|0x8000.  The second, 'bmpLength', has value n.
14056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
14066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * After the header the code points are stored in ascending order.
14076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Supplementary code points are stored as most significant 16
14086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * bits followed by least significant 16 bits.
14096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
14106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param dest pointer to buffer of destCapacity 16-bit integers.
14116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * May be NULL only if destCapacity is zero.
14126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param destCapacity size of dest, or zero.  Must not be negative.
14136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ec error code.  Will be set to U_INDEX_OUTOFBOUNDS_ERROR
14146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * if n+2*m > 0x7FFF.  Will be set to U_BUFFER_OVERFLOW_ERROR if
14156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * n+2*m+(m!=0?2:1) > destCapacity.
14166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return the total length of the serialized format, including
14176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the header, that is, n+2*m+(m!=0?2:1), or 0 on error other
14186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * than U_BUFFER_OVERFLOW_ERROR.
14196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
14206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
14216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t serialize(uint16_t *dest, int32_t destCapacity, UErrorCode& ec) const;
14226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
14246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Reallocate this objects internal structures to take up the least
14256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * possible space, without changing this object's value.
14266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A frozen set will not be modified.
14276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
14286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
14296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UnicodeSet& compact();
14306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
14326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return the class ID for this class.  This is useful only for
14336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * comparing to a return value from getDynamicClassID().  For example:
14346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * <pre>
14356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * .      Base* polymorphic_pointer = createPolymorphicObject();
14366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * .      if (polymorphic_pointer->getDynamicClassID() ==
14376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * .          Derived::getStaticClassID()) ...
14386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * </pre>
14396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return          The class ID for all objects of this class.
14406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.0
14416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
14426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UClassID U_EXPORT2 getStaticClassID(void);
14436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
14456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Implement UnicodeFunctor API.
14466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
14476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return The class ID for this object. All objects of a given
14486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * class have the same class ID.  Objects of other classes have
14496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * different class IDs.
14506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @stable ICU 2.4
14516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
14526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UClassID getDynamicClassID(void) const;
14536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
14556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Private API for the USet API
14576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    friend class USetAccess;
14596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t getStringCount() const;
14616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    const UnicodeString* getString(int32_t index) const;
14636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
14656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // RuleBasedTransliterator support
14666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
14676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
14696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
14716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Returns <tt>true</tt> if this set contains any character whose low byte
14726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * is the given value.  This is used by <tt>RuleBasedTransliterator</tt> for
14736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * indexing.
14746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
14756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    virtual UBool matchesIndexValue(uint8_t v) const;
14766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgprivate:
14786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    friend class RBBIRuleScanner;
14796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
14816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Implementation: Clone as thawed (see ICU4J Freezable)
14826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
14836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet(const UnicodeSet& o, UBool /* asThawed */);
14856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
14876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Implementation: Pattern parsing
14886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
14896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void applyPatternIgnoreSpace(const UnicodeString& pattern,
14916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 ParsePosition& pos,
14926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 const SymbolTable* symbols,
14936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                 UErrorCode& status);
14946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
14956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void applyPattern(RuleCharacterIterator& chars,
14966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      const SymbolTable* symbols,
14976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      UnicodeString& rebuiltPat,
14986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      uint32_t options,
14996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      UnicodeSet& (UnicodeSet::*caseClosure)(int32_t attribute),
15006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                      UErrorCode& ec);
15016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
15036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Implementation: Utility methods
15046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
15056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void ensureCapacity(int32_t newLen, UErrorCode& ec);
15076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void ensureBufferCapacity(int32_t newLen, UErrorCode& ec);
15096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void swapBuffers(void);
15116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UBool allocateStrings(UErrorCode &status);
15136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString& _toPattern(UnicodeString& result,
15156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              UBool escapeUnprintable) const;
15166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeString& _generatePattern(UnicodeString& result,
15186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                    UBool escapeUnprintable) const;
15196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void _appendToPat(UnicodeString& buf, const UnicodeString& s, UBool escapeUnprintable);
15216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static void _appendToPat(UnicodeString& buf, UChar32 c, UBool escapeUnprintable);
15236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
15256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    // Implementation: Fundamental operators
15266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    //----------------------------------------------------------------
15276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void exclusiveOr(const UChar32* other, int32_t otherLen, int8_t polarity);
15296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void add(const UChar32* other, int32_t otherLen, int8_t polarity);
15316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void retain(const UChar32* other, int32_t otherLen, int8_t polarity);
15336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
15356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Return true if the given position, in the given pattern, appears
15366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * to be the start of a property set pattern [:foo:], \\p{foo}, or
15376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * \\P{foo}, or \\N{name}.
15386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
15396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UBool resemblesPropertyPattern(const UnicodeString& pattern,
15406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          int32_t pos);
15416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static UBool resemblesPropertyPattern(RuleCharacterIterator& chars,
15436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                          int32_t iterOpts);
15446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
15466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Parse the given property pattern at the given parse position
15476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and set this UnicodeSet to the result.
15486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
15496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * The original design document is out of date, but still useful.
15506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Ignore the property and value names:
15516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * http://source.icu-project.org/repos/icu/icuhtml/trunk/design/unicodeset_properties.html
15526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
15536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Recognized syntax:
15546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
15556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * [:foo:] [:^foo:] - white space not allowed within "[:" or ":]"
15566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * \\p{foo} \\P{foo}  - white space not allowed within "\\p" or "\\P"
15576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * \\N{name}         - white space not allowed within "\\N"
15586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
15596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Other than the above restrictions, Unicode Pattern_White_Space characters are ignored.
15606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Case is ignored except in "\\p" and "\\P" and "\\N".  In 'name' leading
15616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * and trailing space is deleted, and internal runs of whitespace
15626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * are collapsed to a single space.
15636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
15646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * We support binary properties, enumerated properties, and the
15656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * following non-enumerated properties:
15666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
15676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  Numeric_Value
15686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  Name
15696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *  Unicode_1_Name
15706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
15716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param pattern the pattern string
15726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ppos on entry, the position at which to begin parsing.
15736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * This should be one of the locations marked '^':
15746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
15756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *   [:blah:]     \\p{blah}     \\P{blah}     \\N{name}
15766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *   ^       %    ^       %    ^       %    ^       %
15776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     *
15786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * On return, the position after the last character parsed, that is,
15796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * the locations marked '%'.  If the parse fails, ppos is returned
15806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * unchanged.
15816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @param ec status
15826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * @return a reference to this.
15836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
15846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    UnicodeSet& applyPropertyPattern(const UnicodeString& pattern,
15856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     ParsePosition& ppos,
15866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                                     UErrorCode &ec);
15876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void applyPropertyPattern(RuleCharacterIterator& chars,
15896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              UnicodeString& rebuiltPat,
15906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                              UErrorCode& ec);
15916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15926f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    friend void UnicodeSet_initInclusion(int32_t src, UErrorCode &status);
15936f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    static const UnicodeSet* getInclusions(int32_t src, UErrorCode &status);
15946f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
15956f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
15966f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * A filter that returns TRUE if the given code point should be
15976f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * included in the UnicodeSet being constructed.
15986f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
15996f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    typedef UBool (*Filter)(UChar32 codePoint, void* context);
16006f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16016f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
16026f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Given a filter, set this UnicodeSet to the code points
16036f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * contained by that filter.  The filter MUST be
16046f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * property-conformant.  That is, if it returns value v for one
16056f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * code point, then it must return v for all affiliated code
16066f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * points, as defined by the inclusions list.  See
16076f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * getInclusions().
16086f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * src is a UPropertySource value.
16096f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
16106f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void applyFilter(Filter filter,
16116f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     void* context,
16126f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     int32_t src,
16136f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org                     UErrorCode &status);
16146f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16156f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
16166f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Set the new pattern to cache.
16176f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
16186f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void setPattern(const UnicodeString& newPat);
16196f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    /**
16206f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     * Release existing cached pattern.
16216f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org     */
16226f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    void releasePattern();
16236f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16246f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    friend class UnicodeSetIterator;
16256f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org};
16266f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16276f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16286f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16296f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UnicodeSet::operator!=(const UnicodeSet& o) const {
16306f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return !operator==(o);
16316f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16326f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16336f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UnicodeSet::isFrozen() const {
16346f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(bmpSet!=NULL || stringSpan!=NULL);
16356f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16366f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16376f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UnicodeSet::containsSome(UChar32 start, UChar32 end) const {
16386f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return !containsNone(start, end);
16396f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16406f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16416f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UnicodeSet::containsSome(const UnicodeSet& s) const {
16426f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return !containsNone(s);
16436f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16446f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16456f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UnicodeSet::containsSome(const UnicodeString& s) const {
16466f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return !containsNone(s);
16476f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16486f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16496f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UBool UnicodeSet::isBogus() const {
16506f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return (UBool)(fFlags & kIsBogus);
16516f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16526f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16536f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline UnicodeSet *UnicodeSet::fromUSet(USet *uset) {
16546f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return reinterpret_cast<UnicodeSet *>(uset);
16556f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16566f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16576f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline const UnicodeSet *UnicodeSet::fromUSet(const USet *uset) {
16586f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return reinterpret_cast<const UnicodeSet *>(uset);
16596f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16606f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16616f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline USet *UnicodeSet::toUSet() {
16626f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return reinterpret_cast<USet *>(this);
16636f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16646f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16656f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline const USet *UnicodeSet::toUSet() const {
16666f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return reinterpret_cast<const USet *>(this);
16676f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16686f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16696f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t UnicodeSet::span(const UnicodeString &s, int32_t start, USetSpanCondition spanCondition) const {
16706f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t sLength=s.length();
16716f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(start<0) {
16726f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        start=0;
16736f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(start>sLength) {
16746f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        start=sLength;
16756f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16766f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return start+span(s.getBuffer()+start, sLength-start, spanCondition);
16776f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16786f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16796f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orginline int32_t UnicodeSet::spanBack(const UnicodeString &s, int32_t limit, USetSpanCondition spanCondition) const {
16806f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    int32_t sLength=s.length();
16816f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    if(limit<0) {
16826f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        limit=0;
16836f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    } else if(limit>sLength) {
16846f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org        limit=sLength;
16856f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    }
16866f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org    return spanBack(s.getBuffer(), limit, spanCondition);
16876f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org}
16886f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16896f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.orgU_NAMESPACE_END
16906f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org
16916f31ac30b9092fd02a8c97e5216cf53f3e4fae4jshin@chromium.org#endif
1692