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