/* ******************************************************************** * * Copyright (C) 1997-1999, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************** */ #ifndef CHARITER_H #define CHARITER_H #include "utypes.h" #include "unistr.h" /** * Abstract class defining a protcol for accessing characters in a text-storage object.
Examples:
Function processing characters, in this example simple output
. void processChar( UChar c ) . { . cout << " " << c; . }Traverse the text from start to finish
. void traverseForward(CharacterIterator& iter) . { . for(UChar c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) { . processChar(c); . } . }Traverse the text backwards, from end to start
. void traverseBackward(CharacterIterator& iter) . { . for(UChar c = iter.last(); c != CharacterIterator.DONE; c = iter.previous()) { . processChar(c); . } . }Traverse both forward and backward from a given position in the text. Calls to notBoundary() in this example represents some additional stopping criteria.
. void traverseOut(CharacterIterator& iter, UTextOffset pos) . { . UChar c; . for (c = iter.setIndex(pos); . c != CharacterIterator.DONE && (Unicode::isLetter(c) || Unicode::isDigit(c)); . c = iter.next()) {} . UTextOffset end = iter.getIndex(); . for (c = iter.setIndex(pos); . c != CharacterIterator.DONE && (Unicode::isLetter(c) || Unicode::isDigit(c)); . c = iter.previous()) {} . UTextOffset start = iter.getIndex() + 1; . . cout << "start: " << start << " end: " << end << endl; . for (c = iter.setIndex(start); iter.getIndex() < end; c = iter.next() ) { . processChar(c); . } . }Creating a StringCharacterIteratorand calling the test functions
. void CharacterIterator_Example( void ) . { . cout << endl << "===== CharacterIterator_Example: =====" << endl; . UnicodeString text("Ein kleiner Satz."); . StringCharacterIterator iterator(text); . cout << "----- traverseForward: -----------" << endl; . traverseForward( iterator ); . cout << endl << endl << "----- traverseBackward: ----------" << endl; . traverseBackward( iterator ); . cout << endl << endl << "----- traverseOut: ---------------" << endl; . traverseOut( iterator, 7 ); . cout << endl << endl << "-----" << endl; . }*/ class U_COMMON_API CharacterIterator { public: /** * Value returned by most of CharacterIterator's functions * when the iterator has reached the limits of its iteration. */ static const UChar DONE; /** * Destructor. */ virtual ~CharacterIterator(); /** * Returns true when both iterators refer to the same * character in the same character-storage object. */ virtual bool_t operator==(const CharacterIterator& that) const = 0; /** * Returns true when the iterators refer to different * text-storage objects, or to different characters in the * same text-storage object. */ bool_t operator!=(const CharacterIterator& that) const { return !operator==(that); } /** * Returns a pointer to a new CharacterIterator of the same * concrete class as this one, and referring to the same * character in the same text-storage object as this one. The * caller is responsible for deleting the new clone. */ virtual CharacterIterator* clone(void) const = 0; /** * Generates a hash code for this iterator. */ virtual int32_t hashCode(void) const = 0; /** * Sets the iterator to refer to the first character in its * iteration range, and returns that character, */ virtual UChar first(void) = 0; /** * Sets the iterator to refer to the last character in its * iteration range, and returns that character. */ virtual UChar last(void) = 0; /** * Sets the iterator to refer to the "position"-th character * in the text-storage object the iterator refers to, and * returns that character. */ virtual UChar setIndex(UTextOffset position) = 0; /** * Returns the character the iterator currently refers to. */ virtual UChar current(void) const = 0; /** * Advances to the next character in the iteration range * (toward last()), and returns that character. If there are * no more characters to return, returns DONE. */ virtual UChar next(void) = 0; /** * Advances to the previous character in the iteration rance * (toward first()), and returns that character. If there are * no more characters to return, returns DONE. */ virtual UChar previous(void) = 0; /** * Returns the numeric index in the underlying text-storage * object of the character returned by first(). Since it's * possible to create an iterator that iterates across only * part of a text-storage object, this number isn't * necessarily 0. */ virtual UTextOffset startIndex(void) const = 0; /** * Returns the numeric index in the underlying text-storage * object of the position immediately BEYOND the character * returned by last(). */ virtual UTextOffset endIndex(void) const = 0; /** * Returns the numeric index in the underlying text-storage * object of the character the iterator currently refers to * (i.e., the character returned by current()). */ virtual UTextOffset getIndex(void) const = 0; /** * Copies the text under iteration into the UnicodeString * referred to by "result". @param result Receives a copy of * the text under iteration. */ virtual void getText(UnicodeString& result) = 0; /** * Returns a UClassID for this CharacterIterator ("poor man's * RTTI").
Despite the fact that this function is public, * DO NOT CONSIDER IT PART OF CHARACTERITERATOR'S API! */ virtual UClassID getDynamicClassID(void) const = 0; protected: CharacterIterator() {} CharacterIterator(const CharacterIterator&) {} CharacterIterator& operator=(const CharacterIterator&) { return *this; } }; #endif