/* ********************************************************************** * Copyright (c) 2002, International Business Machines * Corporation and others. All Rights Reserved. ********************************************************************** * $Source: /xsrl/Nsvn/icu/icu/source/common/unicode/usetiter.h,v $ ********************************************************************** */ #ifndef USETITER_H #define USETITER_H #include "unicode/utypes.h" #include "unicode/uobject.h" #include "unicode/unistr.h" U_NAMESPACE_BEGIN class UnicodeSet; class UnicodeString; /** * UnicodeSetIterator iterates over the contents of a UnicodeSet. It * iterates over either code points or code point ranges. After all * code points or ranges have been returned, it returns the * multicharacter strings of the UnicodSet, if any. * *
To iterate over code points, use a loop like this: *
* UnicodeSetIterator it(set); * while (set.next()) { * if (set.isString()) { * processString(set.getString()); * } else { * processCodepoint(set.getCodepoint()); * } * } ** *
To iterate over code point ranges, use a loop like this: *
* UnicodeSetIterator it(set); * while (set.nextRange()) { * if (set.isString()) { * processString(set.getString()); * } else { * processCodepointRange(set.getCodepoint(), set.getCodepointEnd()); * } * } ** @author M. Davis * @draft ICU 2.2 */ class U_COMMON_API UnicodeSetIterator : public UObject { protected: /** * Value of codepoint if the iterator points to a string. * If codepoint == IS_STRING, then examine * string for the current iteration result. */ enum { IS_STRING = -1 }; /** * Current code point, or the special value IS_STRING, if * the iterator points to a string. */ UChar32 codepoint; /** * When iterating over ranges using nextRange(), * codepointEnd contains the inclusive end of the * iteration range, if codepoint != IS_STRING. If * iterating over code points using next(), or if * codepoint == IS_STRING, then the value of * codepointEnd is undefined. */ UChar32 codepointEnd; /** * If codepoint == IS_STRING, then string points * to the current string. If codepoint != IS_STRING, the * value of string is undefined. */ const UnicodeString* string; public: /** * Create an iterator over the given set. The iterator is valid * only so long as set is valid. * @param set set to iterate over */ UnicodeSetIterator(const UnicodeSet& set); /** * Create an iterator over nothing. next() and * nextRange() return false. This is a convenience * constructor allowing the target to be set later. */ UnicodeSetIterator(); /** * Destructor. */ virtual ~UnicodeSetIterator(); /** * Returns true if the current element is a string. If so, the * caller can retrieve it with getString(). If this * method returns false, the current element is a code point or * code point range, depending on whether next() or * nextRange() was called, and the caller can retrieve it * with getCodepoint() and, for a range, * getCodepointEnd(). */ inline UBool isString() const; /** * Returns the current code point, if isString() returned * false. Otherwise returns an undefined result. */ inline UChar32 getCodepoint() const; /** * Returns the end of the current code point range, if * isString() returned false and nextRange() was * called. Otherwise returns an undefined result. */ inline UChar32 getCodepointEnd() const; /** * Returns the current string, if isString() returned * true. Otherwise returns an undefined result. */ inline const UnicodeString& getString() const; /** * Returns the next element in the set, either a single code point * or a string. If there are no more elements in the set, return * false. If codepoint == IS_STRING, the value is a * string in the string field. Otherwise the value is a * single code point in the codepoint field. * *
The order of iteration is all code points in sorted order, * followed by all strings sorted order. codepointEnd is * undefined after calling this method. string is * undefined unless codepoint == IS_STRING. Do not mix * calls to next() and nextRange() without * calling reset() between them. The results of doing so * are undefined. * * @return true if there was another element in the set and this * object contains the element. */ UBool next(); /** * Returns the next element in the set, either a code point range * or a string. If there are no more elements in the set, return * false. If codepoint == IS_STRING, the value is a * string in the string field. Otherwise the value is a * range of one or more code points from codepoint to * codepointeEnd inclusive. * *
The order of iteration is all code points ranges in sorted * order, followed by all strings sorted order. Ranges are * disjoint and non-contiguous. string is undefined * unless codepoint == IS_STRING. Do not mix calls to * next() and nextRange() without calling * reset() between them. The results of doing so are * undefined. * * @return true if there was another element in the set and this * object contains the element. */ UBool nextRange(); /** * Sets this iterator to visit the elements of the given set and * resets it to the start of that set. The iterator is valid only * so long as set is valid. * @param set the set to iterate over. */ void reset(const UnicodeSet& set); /** * Resets this iterator to the start of the set. */ void reset(); /** * ICU "poor man's RTTI", returns a UClassID for the actual class. * * @draft ICU 2.2 */ virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); } /** * ICU "poor man's RTTI", returns a UClassID for this class. * * @draft ICU 2.2 */ static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; } // ======================= PRIVATES =========================== protected: // endElement and nextElements are really UChar32's, but we keep // them as signed int32_t's so we can do comparisons with // endElement set to -1. Leave them as int32_t's. const UnicodeSet* set; int32_t endRange; int32_t range; int32_t endElement; int32_t nextElement; //UBool abbreviated; int32_t nextString; int32_t stringCount; UnicodeSetIterator(const UnicodeSetIterator&); // disallow UnicodeSetIterator& operator=(const UnicodeSetIterator&); // disallow virtual void loadRange(int32_t range); private: /** * The address of this static class variable serves as this class's ID * for ICU "poor man's RTTI". */ static const char fgClassID; }; inline UBool UnicodeSetIterator::isString() const { return codepoint == (UChar32)IS_STRING; } inline UChar32 UnicodeSetIterator::getCodepoint() const { return codepoint; } inline UChar32 UnicodeSetIterator::getCodepointEnd() const { return codepointEnd; } inline const UnicodeString& UnicodeSetIterator::getString() const { return *string; } U_NAMESPACE_END #endif