LCOV - code coverage report
Current view: top level - intl/icu/source/common/unicode - chariter.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 13 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 7 0.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // © 2016 and later: Unicode, Inc. and others.
       2             : // License & terms of use: http://www.unicode.org/copyright.html
       3             : /*
       4             : ********************************************************************
       5             : *
       6             : *   Copyright (C) 1997-2011, International Business Machines
       7             : *   Corporation and others.  All Rights Reserved.
       8             : *
       9             : ********************************************************************
      10             : */
      11             : 
      12             : #ifndef CHARITER_H
      13             : #define CHARITER_H
      14             : 
      15             : #include "unicode/utypes.h"
      16             : #include "unicode/uobject.h"
      17             : #include "unicode/unistr.h"
      18             : /**
      19             :  * \file
      20             :  * \brief C++ API: Character Iterator
      21             :  */
      22             :  
      23             : U_NAMESPACE_BEGIN
      24             : /**
      25             :  * Abstract class that defines an API for forward-only iteration
      26             :  * on text objects.
      27             :  * This is a minimal interface for iteration without random access
      28             :  * or backwards iteration. It is especially useful for wrapping
      29             :  * streams with converters into an object for collation or
      30             :  * normalization.
      31             :  *
      32             :  * <p>Characters can be accessed in two ways: as code units or as
      33             :  * code points.
      34             :  * Unicode code points are 21-bit integers and are the scalar values
      35             :  * of Unicode characters. ICU uses the type UChar32 for them.
      36             :  * Unicode code units are the storage units of a given
      37             :  * Unicode/UCS Transformation Format (a character encoding scheme).
      38             :  * With UTF-16, all code points can be represented with either one
      39             :  * or two code units ("surrogates").
      40             :  * String storage is typically based on code units, while properties
      41             :  * of characters are typically determined using code point values.
      42             :  * Some processes may be designed to work with sequences of code units,
      43             :  * or it may be known that all characters that are important to an
      44             :  * algorithm can be represented with single code units.
      45             :  * Other processes will need to use the code point access functions.</p>
      46             :  *
      47             :  * <p>ForwardCharacterIterator provides nextPostInc() to access
      48             :  * a code unit and advance an internal position into the text object,
      49             :  * similar to a <code>return text[position++]</code>.<br>
      50             :  * It provides next32PostInc() to access a code point and advance an internal
      51             :  * position.</p>
      52             :  *
      53             :  * <p>next32PostInc() assumes that the current position is that of
      54             :  * the beginning of a code point, i.e., of its first code unit.
      55             :  * After next32PostInc(), this will be true again.
      56             :  * In general, access to code units and code points in the same
      57             :  * iteration loop should not be mixed. In UTF-16, if the current position
      58             :  * is on a second code unit (Low Surrogate), then only that code unit
      59             :  * is returned even by next32PostInc().</p>
      60             :  *
      61             :  * <p>For iteration with either function, there are two ways to
      62             :  * check for the end of the iteration. When there are no more
      63             :  * characters in the text object:
      64             :  * <ul>
      65             :  * <li>The hasNext() function returns FALSE.</li>
      66             :  * <li>nextPostInc() and next32PostInc() return DONE
      67             :  *     when one attempts to read beyond the end of the text object.</li>
      68             :  * </ul>
      69             :  *
      70             :  * Example:
      71             :  * \code 
      72             :  * void function1(ForwardCharacterIterator &it) {
      73             :  *     UChar32 c;
      74             :  *     while(it.hasNext()) {
      75             :  *         c=it.next32PostInc();
      76             :  *         // use c
      77             :  *     }
      78             :  * }
      79             :  *
      80             :  * void function1(ForwardCharacterIterator &it) {
      81             :  *     char16_t c;
      82             :  *     while((c=it.nextPostInc())!=ForwardCharacterIterator::DONE) {
      83             :  *         // use c
      84             :  *      }
      85             :  *  }
      86             :  * \endcode
      87             :  * </p>
      88             :  *
      89             :  * @stable ICU 2.0
      90             :  */
      91             : class U_COMMON_API ForwardCharacterIterator : public UObject {
      92             : public:
      93             :     /**
      94             :      * Value returned by most of ForwardCharacterIterator's functions
      95             :      * when the iterator has reached the limits of its iteration.
      96             :      * @stable ICU 2.0
      97             :      */
      98             :     enum { DONE = 0xffff };
      99             :     
     100             :     /**
     101             :      * Destructor.  
     102             :      * @stable ICU 2.0
     103             :      */
     104             :     virtual ~ForwardCharacterIterator();
     105             :     
     106             :     /**
     107             :      * Returns true when both iterators refer to the same
     108             :      * character in the same character-storage object.  
     109             :      * @param that The ForwardCharacterIterator to be compared for equality
     110             :      * @return true when both iterators refer to the same
     111             :      * character in the same character-storage object
     112             :      * @stable ICU 2.0
     113             :      */
     114             :     virtual UBool operator==(const ForwardCharacterIterator& that) const = 0;
     115             :     
     116             :     /**
     117             :      * Returns true when the iterators refer to different
     118             :      * text-storage objects, or to different characters in the
     119             :      * same text-storage object.  
     120             :      * @param that The ForwardCharacterIterator to be compared for inequality
     121             :      * @return true when the iterators refer to different
     122             :      * text-storage objects, or to different characters in the
     123             :      * same text-storage object
     124             :      * @stable ICU 2.0
     125             :      */
     126             :     inline UBool operator!=(const ForwardCharacterIterator& that) const;
     127             :     
     128             :     /**
     129             :      * Generates a hash code for this iterator.  
     130             :      * @return the hash code.
     131             :      * @stable ICU 2.0
     132             :      */
     133             :     virtual int32_t hashCode(void) const = 0;
     134             :     
     135             :     /**
     136             :      * Returns a UClassID for this ForwardCharacterIterator ("poor man's
     137             :      * RTTI").<P> Despite the fact that this function is public,
     138             :      * DO NOT CONSIDER IT PART OF CHARACTERITERATOR'S API! 
     139             :      * @return a UClassID for this ForwardCharacterIterator 
     140             :      * @stable ICU 2.0
     141             :      */
     142             :     virtual UClassID getDynamicClassID(void) const = 0;
     143             :     
     144             :     /**
     145             :      * Gets the current code unit for returning and advances to the next code unit
     146             :      * in the iteration range
     147             :      * (toward endIndex()).  If there are
     148             :      * no more code units to return, returns DONE.
     149             :      * @return the current code unit.
     150             :      * @stable ICU 2.0
     151             :      */
     152             :     virtual char16_t         nextPostInc(void) = 0;
     153             :     
     154             :     /**
     155             :      * Gets the current code point for returning and advances to the next code point
     156             :      * in the iteration range
     157             :      * (toward endIndex()).  If there are
     158             :      * no more code points to return, returns DONE.
     159             :      * @return the current code point.
     160             :      * @stable ICU 2.0
     161             :      */
     162             :     virtual UChar32       next32PostInc(void) = 0;
     163             :     
     164             :     /**
     165             :      * Returns FALSE if there are no more code units or code points
     166             :      * at or after the current position in the iteration range.
     167             :      * This is used with nextPostInc() or next32PostInc() in forward
     168             :      * iteration.
     169             :      * @returns FALSE if there are no more code units or code points
     170             :      * at or after the current position in the iteration range.
     171             :      * @stable ICU 2.0
     172             :      */
     173             :     virtual UBool        hasNext() = 0;
     174             :     
     175             : protected:
     176             :     /** Default constructor to be overridden in the implementing class. @stable ICU 2.0*/
     177             :     ForwardCharacterIterator();
     178             :     
     179             :     /** Copy constructor to be overridden in the implementing class. @stable ICU 2.0*/
     180             :     ForwardCharacterIterator(const ForwardCharacterIterator &other);
     181             :     
     182             :     /**
     183             :      * Assignment operator to be overridden in the implementing class.
     184             :      * @stable ICU 2.0
     185             :      */
     186           0 :     ForwardCharacterIterator &operator=(const ForwardCharacterIterator&) { return *this; }
     187             : };
     188             : 
     189             : /**
     190             :  * Abstract class that defines an API for iteration
     191             :  * on text objects.
     192             :  * This is an interface for forward and backward iteration
     193             :  * and random access into a text object.
     194             :  *
     195             :  * <p>The API provides backward compatibility to the Java and older ICU
     196             :  * CharacterIterator classes but extends them significantly:
     197             :  * <ol>
     198             :  * <li>CharacterIterator is now a subclass of ForwardCharacterIterator.</li>
     199             :  * <li>While the old API functions provided forward iteration with
     200             :  *     "pre-increment" semantics, the new one also provides functions
     201             :  *     with "post-increment" semantics. They are more efficient and should
     202             :  *     be the preferred iterator functions for new implementations.
     203             :  *     The backward iteration always had "pre-decrement" semantics, which
     204             :  *     are efficient.</li>
     205             :  * <li>Just like ForwardCharacterIterator, it provides access to
     206             :  *     both code units and code points. Code point access versions are available
     207             :  *     for the old and the new iteration semantics.</li>
     208             :  * <li>There are new functions for setting and moving the current position
     209             :  *     without returning a character, for efficiency.</li>
     210             :  * </ol>
     211             :  *
     212             :  * See ForwardCharacterIterator for examples for using the new forward iteration
     213             :  * functions. For backward iteration, there is also a hasPrevious() function
     214             :  * that can be used analogously to hasNext().
     215             :  * The old functions work as before and are shown below.</p>
     216             :  *
     217             :  * <p>Examples for some of the new functions:</p>
     218             :  *
     219             :  * Forward iteration with hasNext():
     220             :  * \code
     221             :  * void forward1(CharacterIterator &it) {
     222             :  *     UChar32 c;
     223             :  *     for(it.setToStart(); it.hasNext();) {
     224             :  *         c=it.next32PostInc();
     225             :  *         // use c
     226             :  *     }
     227             :  *  }
     228             :  * \endcode
     229             :  * Forward iteration more similar to loops with the old forward iteration,
     230             :  * showing a way to convert simple for() loops:
     231             :  * \code
     232             :  * void forward2(CharacterIterator &it) {
     233             :  *     char16_t c;
     234             :  *     for(c=it.firstPostInc(); c!=CharacterIterator::DONE; c=it.nextPostInc()) {
     235             :  *          // use c
     236             :  *      }
     237             :  * }
     238             :  * \endcode
     239             :  * Backward iteration with setToEnd() and hasPrevious():
     240             :  * \code
     241             :  *  void backward1(CharacterIterator &it) {
     242             :  *      UChar32 c;
     243             :  *      for(it.setToEnd(); it.hasPrevious();) {
     244             :  *         c=it.previous32();
     245             :  *          // use c
     246             :  *      }
     247             :  *  }
     248             :  * \endcode
     249             :  * Backward iteration with a more traditional for() loop:
     250             :  * \code
     251             :  * void backward2(CharacterIterator &it) {
     252             :  *     char16_t c;
     253             :  *     for(c=it.last(); c!=CharacterIterator::DONE; c=it.previous()) {
     254             :  *         // use c
     255             :  *      }
     256             :  *  }
     257             :  * \endcode
     258             :  *
     259             :  * Example for random access:
     260             :  * \code
     261             :  *  void random(CharacterIterator &it) {
     262             :  *      // set to the third code point from the beginning
     263             :  *      it.move32(3, CharacterIterator::kStart);
     264             :  *      // get a code point from here without moving the position
     265             :  *      UChar32 c=it.current32();
     266             :  *      // get the position
     267             :  *      int32_t pos=it.getIndex();
     268             :  *      // get the previous code unit
     269             :  *      char16_t u=it.previous();
     270             :  *      // move back one more code unit
     271             :  *      it.move(-1, CharacterIterator::kCurrent);
     272             :  *      // set the position back to where it was
     273             :  *      // and read the same code point c and move beyond it
     274             :  *      it.setIndex(pos);
     275             :  *      if(c!=it.next32PostInc()) {
     276             :  *          exit(1); // CharacterIterator inconsistent
     277             :  *      }
     278             :  *  }
     279             :  * \endcode
     280             :  *
     281             :  * <p>Examples, especially for the old API:</p>
     282             :  *
     283             :  * Function processing characters, in this example simple output
     284             :  * <pre>
     285             :  * \code
     286             :  *  void processChar( char16_t c )
     287             :  *  {
     288             :  *      cout << " " << c;
     289             :  *  }
     290             :  * \endcode
     291             :  * </pre>
     292             :  * Traverse the text from start to finish
     293             :  * <pre> 
     294             :  * \code
     295             :  *  void traverseForward(CharacterIterator& iter)
     296             :  *  {
     297             :  *      for(char16_t c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
     298             :  *          processChar(c);
     299             :  *      }
     300             :  *  }
     301             :  * \endcode
     302             :  * </pre>
     303             :  * Traverse the text backwards, from end to start
     304             :  * <pre>
     305             :  * \code
     306             :  *  void traverseBackward(CharacterIterator& iter)
     307             :  *  {
     308             :  *      for(char16_t c = iter.last(); c != CharacterIterator.DONE; c = iter.previous()) {
     309             :  *          processChar(c);
     310             :  *      }
     311             :  *  }
     312             :  * \endcode
     313             :  * </pre>
     314             :  * Traverse both forward and backward from a given position in the text. 
     315             :  * Calls to notBoundary() in this example represents some additional stopping criteria.
     316             :  * <pre>
     317             :  * \code
     318             :  * void traverseOut(CharacterIterator& iter, int32_t pos)
     319             :  * {
     320             :  *      char16_t c;
     321             :  *      for (c = iter.setIndex(pos);
     322             :  *      c != CharacterIterator.DONE && (Unicode::isLetter(c) || Unicode::isDigit(c));
     323             :  *          c = iter.next()) {}
     324             :  *      int32_t end = iter.getIndex();
     325             :  *      for (c = iter.setIndex(pos);
     326             :  *          c != CharacterIterator.DONE && (Unicode::isLetter(c) || Unicode::isDigit(c));
     327             :  *          c = iter.previous()) {}
     328             :  *      int32_t start = iter.getIndex() + 1;
     329             :  *  
     330             :  *      cout << "start: " << start << " end: " << end << endl;
     331             :  *      for (c = iter.setIndex(start); iter.getIndex() < end; c = iter.next() ) {
     332             :  *          processChar(c);
     333             :  *     }
     334             :  *  }
     335             :  * \endcode
     336             :  * </pre>
     337             :  * Creating a StringCharacterIterator and calling the test functions
     338             :  * <pre>
     339             :  * \code
     340             :  *  void CharacterIterator_Example( void )
     341             :  *   {
     342             :  *       cout << endl << "===== CharacterIterator_Example: =====" << endl;
     343             :  *       UnicodeString text("Ein kleiner Satz.");
     344             :  *       StringCharacterIterator iterator(text);
     345             :  *       cout << "----- traverseForward: -----------" << endl;
     346             :  *       traverseForward( iterator );
     347             :  *       cout << endl << endl << "----- traverseBackward: ----------" << endl;
     348             :  *       traverseBackward( iterator );
     349             :  *       cout << endl << endl << "----- traverseOut: ---------------" << endl;
     350             :  *       traverseOut( iterator, 7 );
     351             :  *       cout << endl << endl << "-----" << endl;
     352             :  *   }
     353             :  * \endcode
     354             :  * </pre>
     355             :  *
     356             :  * @stable ICU 2.0
     357             :  */
     358             : class U_COMMON_API CharacterIterator : public ForwardCharacterIterator {
     359             : public:
     360             :     /**
     361             :      * Origin enumeration for the move() and move32() functions.
     362             :      * @stable ICU 2.0
     363             :      */
     364             :     enum EOrigin { kStart, kCurrent, kEnd };
     365             : 
     366             :     /**
     367             :      * Destructor.
     368             :      * @stable ICU 2.0
     369             :      */
     370             :     virtual ~CharacterIterator();
     371             : 
     372             :     /**
     373             :      * Returns a pointer to a new CharacterIterator of the same
     374             :      * concrete class as this one, and referring to the same
     375             :      * character in the same text-storage object as this one.  The
     376             :      * caller is responsible for deleting the new clone.  
     377             :      * @return a pointer to a new CharacterIterator
     378             :      * @stable ICU 2.0
     379             :      */
     380             :     virtual CharacterIterator* clone(void) const = 0;
     381             : 
     382             :     /**
     383             :      * Sets the iterator to refer to the first code unit in its
     384             :      * iteration range, and returns that code unit.
     385             :      * This can be used to begin an iteration with next().
     386             :      * @return the first code unit in its iteration range.
     387             :      * @stable ICU 2.0
     388             :      */
     389             :     virtual char16_t         first(void) = 0;
     390             : 
     391             :     /**
     392             :      * Sets the iterator to refer to the first code unit in its
     393             :      * iteration range, returns that code unit, and moves the position
     394             :      * to the second code unit. This is an alternative to setToStart()
     395             :      * for forward iteration with nextPostInc().
     396             :      * @return the first code unit in its iteration range.
     397             :      * @stable ICU 2.0
     398             :      */
     399             :     virtual char16_t         firstPostInc(void);
     400             : 
     401             :     /**
     402             :      * Sets the iterator to refer to the first code point in its
     403             :      * iteration range, and returns that code unit,
     404             :      * This can be used to begin an iteration with next32().
     405             :      * Note that an iteration with next32PostInc(), beginning with,
     406             :      * e.g., setToStart() or firstPostInc(), is more efficient.
     407             :      * @return the first code point in its iteration range.
     408             :      * @stable ICU 2.0
     409             :      */
     410             :     virtual UChar32       first32(void) = 0;
     411             : 
     412             :     /**
     413             :      * Sets the iterator to refer to the first code point in its
     414             :      * iteration range, returns that code point, and moves the position
     415             :      * to the second code point. This is an alternative to setToStart()
     416             :      * for forward iteration with next32PostInc().
     417             :      * @return the first code point in its iteration range.
     418             :      * @stable ICU 2.0
     419             :      */
     420             :     virtual UChar32       first32PostInc(void);
     421             : 
     422             :     /**
     423             :      * Sets the iterator to refer to the first code unit or code point in its
     424             :      * iteration range. This can be used to begin a forward
     425             :      * iteration with nextPostInc() or next32PostInc().
     426             :      * @return the start position of the iteration range
     427             :      * @stable ICU 2.0
     428             :      */
     429             :     inline int32_t    setToStart();
     430             : 
     431             :     /**
     432             :      * Sets the iterator to refer to the last code unit in its
     433             :      * iteration range, and returns that code unit.
     434             :      * This can be used to begin an iteration with previous().
     435             :      * @return the last code unit.
     436             :      * @stable ICU 2.0
     437             :      */
     438             :     virtual char16_t         last(void) = 0;
     439             :         
     440             :     /**
     441             :      * Sets the iterator to refer to the last code point in its
     442             :      * iteration range, and returns that code unit.
     443             :      * This can be used to begin an iteration with previous32().
     444             :      * @return the last code point.
     445             :      * @stable ICU 2.0
     446             :      */
     447             :     virtual UChar32       last32(void) = 0;
     448             : 
     449             :     /**
     450             :      * Sets the iterator to the end of its iteration range, just behind
     451             :      * the last code unit or code point. This can be used to begin a backward
     452             :      * iteration with previous() or previous32().
     453             :      * @return the end position of the iteration range
     454             :      * @stable ICU 2.0
     455             :      */
     456             :     inline int32_t    setToEnd();
     457             : 
     458             :     /**
     459             :      * Sets the iterator to refer to the "position"-th code unit
     460             :      * in the text-storage object the iterator refers to, and
     461             :      * returns that code unit.  
     462             :      * @param position the "position"-th code unit in the text-storage object
     463             :      * @return the "position"-th code unit.
     464             :      * @stable ICU 2.0
     465             :      */
     466             :     virtual char16_t         setIndex(int32_t position) = 0;
     467             : 
     468             :     /**
     469             :      * Sets the iterator to refer to the beginning of the code point
     470             :      * that contains the "position"-th code unit
     471             :      * in the text-storage object the iterator refers to, and
     472             :      * returns that code point.
     473             :      * The current position is adjusted to the beginning of the code point
     474             :      * (its first code unit).
     475             :      * @param position the "position"-th code unit in the text-storage object
     476             :      * @return the "position"-th code point.
     477             :      * @stable ICU 2.0
     478             :      */
     479             :     virtual UChar32       setIndex32(int32_t position) = 0;
     480             : 
     481             :     /**
     482             :      * Returns the code unit the iterator currently refers to. 
     483             :      * @return the current code unit. 
     484             :      * @stable ICU 2.0
     485             :      */
     486             :     virtual char16_t         current(void) const = 0;
     487             :         
     488             :     /**
     489             :      * Returns the code point the iterator currently refers to.  
     490             :      * @return the current code point.
     491             :      * @stable ICU 2.0
     492             :      */
     493             :     virtual UChar32       current32(void) const = 0;
     494             :         
     495             :     /**
     496             :      * Advances to the next code unit in the iteration range
     497             :      * (toward endIndex()), and returns that code unit.  If there are
     498             :      * no more code units to return, returns DONE.
     499             :      * @return the next code unit.
     500             :      * @stable ICU 2.0
     501             :      */
     502             :     virtual char16_t         next(void) = 0;
     503             :         
     504             :     /**
     505             :      * Advances to the next code point in the iteration range
     506             :      * (toward endIndex()), and returns that code point.  If there are
     507             :      * no more code points to return, returns DONE.
     508             :      * Note that iteration with "pre-increment" semantics is less
     509             :      * efficient than iteration with "post-increment" semantics
     510             :      * that is provided by next32PostInc().
     511             :      * @return the next code point.
     512             :      * @stable ICU 2.0
     513             :      */
     514             :     virtual UChar32       next32(void) = 0;
     515             :         
     516             :     /**
     517             :      * Advances to the previous code unit in the iteration range
     518             :      * (toward startIndex()), and returns that code unit.  If there are
     519             :      * no more code units to return, returns DONE.  
     520             :      * @return the previous code unit.
     521             :      * @stable ICU 2.0
     522             :      */
     523             :     virtual char16_t         previous(void) = 0;
     524             : 
     525             :     /**
     526             :      * Advances to the previous code point in the iteration range
     527             :      * (toward startIndex()), and returns that code point.  If there are
     528             :      * no more code points to return, returns DONE. 
     529             :      * @return the previous code point. 
     530             :      * @stable ICU 2.0
     531             :      */
     532             :     virtual UChar32       previous32(void) = 0;
     533             : 
     534             :     /**
     535             :      * Returns FALSE if there are no more code units or code points
     536             :      * before the current position in the iteration range.
     537             :      * This is used with previous() or previous32() in backward
     538             :      * iteration.
     539             :      * @return FALSE if there are no more code units or code points
     540             :      * before the current position in the iteration range, return TRUE otherwise.
     541             :      * @stable ICU 2.0
     542             :      */
     543             :     virtual UBool        hasPrevious() = 0;
     544             : 
     545             :     /**
     546             :      * Returns the numeric index in the underlying text-storage
     547             :      * object of the character returned by first().  Since it's
     548             :      * possible to create an iterator that iterates across only
     549             :      * part of a text-storage object, this number isn't
     550             :      * necessarily 0.  
     551             :      * @returns the numeric index in the underlying text-storage
     552             :      * object of the character returned by first().
     553             :      * @stable ICU 2.0
     554             :      */
     555             :     inline int32_t       startIndex(void) const;
     556             :         
     557             :     /**
     558             :      * Returns the numeric index in the underlying text-storage
     559             :      * object of the position immediately BEYOND the character
     560             :      * returned by last().  
     561             :      * @return the numeric index in the underlying text-storage
     562             :      * object of the position immediately BEYOND the character
     563             :      * returned by last().
     564             :      * @stable ICU 2.0
     565             :      */
     566             :     inline int32_t       endIndex(void) const;
     567             :         
     568             :     /**
     569             :      * Returns the numeric index in the underlying text-storage
     570             :      * object of the character the iterator currently refers to
     571             :      * (i.e., the character returned by current()).  
     572             :      * @return the numberic index in the text-storage object of 
     573             :      * the character the iterator currently refers to
     574             :      * @stable ICU 2.0
     575             :      */
     576             :     inline int32_t       getIndex(void) const;
     577             : 
     578             :     /**
     579             :      * Returns the length of the entire text in the underlying
     580             :      * text-storage object.
     581             :      * @return the length of the entire text in the text-storage object
     582             :      * @stable ICU 2.0
     583             :      */
     584             :     inline int32_t           getLength() const;
     585             : 
     586             :     /**
     587             :      * Moves the current position relative to the start or end of the
     588             :      * iteration range, or relative to the current position itself.
     589             :      * The movement is expressed in numbers of code units forward
     590             :      * or backward by specifying a positive or negative delta.
     591             :      * @param delta the position relative to origin. A positive delta means forward;
     592             :      * a negative delta means backward.
     593             :      * @param origin Origin enumeration {kStart, kCurrent, kEnd}
     594             :      * @return the new position
     595             :      * @stable ICU 2.0
     596             :      */
     597             :     virtual int32_t      move(int32_t delta, EOrigin origin) = 0;
     598             : 
     599             :     /**
     600             :      * Moves the current position relative to the start or end of the
     601             :      * iteration range, or relative to the current position itself.
     602             :      * The movement is expressed in numbers of code points forward
     603             :      * or backward by specifying a positive or negative delta.
     604             :      * @param delta the position relative to origin. A positive delta means forward;
     605             :      * a negative delta means backward.
     606             :      * @param origin Origin enumeration {kStart, kCurrent, kEnd}
     607             :      * @return the new position
     608             :      * @stable ICU 2.0
     609             :      */
     610             : #ifdef move32
     611             :      // One of the system headers right now is sometimes defining a conflicting macro we don't use
     612             : #undef move32
     613             : #endif
     614             :     virtual int32_t      move32(int32_t delta, EOrigin origin) = 0;
     615             : 
     616             :     /**
     617             :      * Copies the text under iteration into the UnicodeString
     618             :      * referred to by "result".  
     619             :      * @param result Receives a copy of the text under iteration.  
     620             :      * @stable ICU 2.0
     621             :      */
     622             :     virtual void            getText(UnicodeString&  result) = 0;
     623             : 
     624             : protected:
     625             :     /**
     626             :      * Empty constructor.
     627             :      * @stable ICU 2.0
     628             :      */
     629             :     CharacterIterator();
     630             : 
     631             :     /**
     632             :      * Constructor, just setting the length field in this base class.
     633             :      * @stable ICU 2.0
     634             :      */
     635             :     CharacterIterator(int32_t length);
     636             : 
     637             :     /**
     638             :      * Constructor, just setting the length and position fields in this base class.
     639             :      * @stable ICU 2.0
     640             :      */
     641             :     CharacterIterator(int32_t length, int32_t position);
     642             : 
     643             :     /**
     644             :      * Constructor, just setting the length, start, end, and position fields in this base class.
     645             :      * @stable ICU 2.0
     646             :      */
     647             :     CharacterIterator(int32_t length, int32_t textBegin, int32_t textEnd, int32_t position);
     648             :   
     649             :     /**
     650             :      * Copy constructor.
     651             :      *
     652             :      * @param that The CharacterIterator to be copied
     653             :      * @stable ICU 2.0
     654             :      */
     655             :     CharacterIterator(const CharacterIterator &that);
     656             : 
     657             :     /**
     658             :      * Assignment operator.  Sets this CharacterIterator to have the same behavior,
     659             :      * as the one passed in.
     660             :      * @param that The CharacterIterator passed in.
     661             :      * @return the newly set CharacterIterator.
     662             :      * @stable ICU 2.0
     663             :      */
     664             :     CharacterIterator &operator=(const CharacterIterator &that);
     665             : 
     666             :     /**
     667             :      * Base class text length field.
     668             :      * Necessary this for correct getText() and hashCode().
     669             :      * @stable ICU 2.0
     670             :      */
     671             :     int32_t textLength;
     672             : 
     673             :     /**
     674             :      * Base class field for the current position.
     675             :      * @stable ICU 2.0
     676             :      */
     677             :     int32_t  pos;
     678             : 
     679             :     /**
     680             :      * Base class field for the start of the iteration range.
     681             :      * @stable ICU 2.0
     682             :      */
     683             :     int32_t  begin;
     684             : 
     685             :     /**
     686             :      * Base class field for the end of the iteration range.
     687             :      * @stable ICU 2.0
     688             :      */
     689             :     int32_t  end;
     690             : };
     691             : 
     692             : inline UBool
     693             : ForwardCharacterIterator::operator!=(const ForwardCharacterIterator& that) const {
     694             :     return !operator==(that);
     695             : }
     696             : 
     697             : inline int32_t
     698           0 : CharacterIterator::setToStart() {
     699           0 :     return move(0, kStart);
     700             : }
     701             : 
     702             : inline int32_t
     703           0 : CharacterIterator::setToEnd() {
     704           0 :     return move(0, kEnd);
     705             : }
     706             : 
     707             : inline int32_t
     708           0 : CharacterIterator::startIndex(void) const {
     709           0 :     return begin;
     710             : }
     711             : 
     712             : inline int32_t
     713           0 : CharacterIterator::endIndex(void) const {
     714           0 :     return end;
     715             : }
     716             : 
     717             : inline int32_t
     718           0 : CharacterIterator::getIndex(void) const {
     719           0 :     return pos;
     720             : }
     721             : 
     722             : inline int32_t
     723           0 : CharacterIterator::getLength(void) const {
     724           0 :     return textLength;
     725             : }
     726             : 
     727             : U_NAMESPACE_END
     728             : #endif

Generated by: LCOV version 1.13