Home | History | Annotate | Download | only in unicode
      1 /*
      2 **********************************************************************
      3 *   Copyright (C) 1998-2005, International Business Machines
      4 *   Corporation and others.  All Rights Reserved.
      5 **********************************************************************
      6 */
      7 
      8 #ifndef UCHRITER_H
      9 #define UCHRITER_H
     10 
     11 #include "unicode/utypes.h"
     12 #include "unicode/chariter.h"
     13 
     14 /**
     15  * \file
     16  * \brief C++ API: UChar Character Iterator
     17  */
     18 
     19 U_NAMESPACE_BEGIN
     20 
     21 /**
     22  * A concrete subclass of CharacterIterator that iterates over the
     23  * characters (code units or code points) in a UChar array.
     24  * It's possible not only to create an
     25  * iterator that iterates over an entire UChar array, but also to
     26  * create one that iterates over only a subrange of a UChar array
     27  * (iterators over different subranges of the same UChar array don't
     28  * compare equal).
     29  * @see CharacterIterator
     30  * @see ForwardCharacterIterator
     31  * @stable ICU 2.0
     32  */
     33 class U_COMMON_API UCharCharacterIterator : public CharacterIterator {
     34 public:
     35   /**
     36    * Create an iterator over the UChar array referred to by "textPtr".
     37    * The iteration range is 0 to <code>length-1</code>.
     38    * text is only aliased, not adopted (the
     39    * destructor will not delete it).
     40    * @param textPtr The UChar array to be iterated over
     41    * @param length The length of the UChar array
     42    * @stable ICU 2.0
     43    */
     44   UCharCharacterIterator(const UChar* textPtr, int32_t length);
     45 
     46   /**
     47    * Create an iterator over the UChar array referred to by "textPtr".
     48    * The iteration range is 0 to <code>length-1</code>.
     49    * text is only aliased, not adopted (the
     50    * destructor will not delete it).
     51    * The starting
     52    * position is specified by "position". If "position" is outside the valid
     53    * iteration range, the behavior of this object is undefined.
     54    * @param textPtr The UChar array to be iteratd over
     55    * @param length The length of the UChar array
     56    * @param position The starting position of the iteration
     57    * @stable ICU 2.0
     58    */
     59   UCharCharacterIterator(const UChar* textPtr, int32_t length,
     60                          int32_t position);
     61 
     62   /**
     63    * Create an iterator over the UChar array referred to by "textPtr".
     64    * The iteration range is 0 to <code>end-1</code>.
     65    * text is only aliased, not adopted (the
     66    * destructor will not delete it).
     67    * The starting
     68    * position is specified by "position". If begin and end do not
     69    * form a valid iteration range or "position" is outside the valid
     70    * iteration range, the behavior of this object is undefined.
     71    * @param textPtr The UChar array to be iterated over
     72    * @param length The length of the UChar array
     73    * @param textBegin  The begin position of the iteration range
     74    * @param textEnd    The end position of the iteration range
     75    * @param position    The starting position of the iteration
     76    * @stable ICU 2.0
     77    */
     78   UCharCharacterIterator(const UChar* textPtr, int32_t length,
     79                          int32_t textBegin,
     80                          int32_t textEnd,
     81                          int32_t position);
     82 
     83   /**
     84    * Copy constructor.  The new iterator iterates over the same range
     85    * of the same string as "that", and its initial position is the
     86    * same as "that"'s current position.
     87    * @param that The UCharCharacterIterator to be copied
     88    * @stable ICU 2.0
     89    */
     90   UCharCharacterIterator(const UCharCharacterIterator&  that);
     91 
     92   /**
     93    * Destructor.
     94    * @stable ICU 2.0
     95    */
     96   virtual ~UCharCharacterIterator();
     97 
     98   /**
     99    * Assignment operator.  *this is altered to iterate over the sane
    100    * range of the same string as "that", and refers to the same
    101    * character within that string as "that" does.
    102    * @param that The object to be copied
    103    * @return the newly created object
    104    * @stable ICU 2.0
    105    */
    106   UCharCharacterIterator&
    107   operator=(const UCharCharacterIterator&    that);
    108 
    109   /**
    110    * Returns true if the iterators iterate over the same range of the
    111    * same string and are pointing at the same character.
    112    * @param that The ForwardCharacterIterator used to be compared for equality
    113    * @return true if the iterators iterate over the same range of the
    114    * same string and are pointing at the same character.
    115    * @stable ICU 2.0
    116    */
    117   virtual UBool          operator==(const ForwardCharacterIterator& that) const;
    118 
    119   /**
    120    * Generates a hash code for this iterator.
    121    * @return the hash code.
    122    * @stable ICU 2.0
    123    */
    124   virtual int32_t         hashCode(void) const;
    125 
    126   /**
    127    * Returns a new UCharCharacterIterator referring to the same
    128    * character in the same range of the same string as this one.  The
    129    * caller must delete the new iterator.
    130    * @return the CharacterIterator newly created
    131    * @stable ICU 2.0
    132    */
    133   virtual CharacterIterator* clone(void) const;
    134 
    135   /**
    136    * Sets the iterator to refer to the first code unit in its
    137    * iteration range, and returns that code unit.
    138    * This can be used to begin an iteration with next().
    139    * @return the first code unit in its iteration range.
    140    * @stable ICU 2.0
    141    */
    142   virtual UChar         first(void);
    143 
    144   /**
    145    * Sets the iterator to refer to the first code unit in its
    146    * iteration range, returns that code unit, and moves the position
    147    * to the second code unit. This is an alternative to setToStart()
    148    * for forward iteration with nextPostInc().
    149    * @return the first code unit in its iteration range
    150    * @stable ICU 2.0
    151    */
    152   virtual UChar         firstPostInc(void);
    153 
    154   /**
    155    * Sets the iterator to refer to the first code point in its
    156    * iteration range, and returns that code unit,
    157    * This can be used to begin an iteration with next32().
    158    * Note that an iteration with next32PostInc(), beginning with,
    159    * e.g., setToStart() or firstPostInc(), is more efficient.
    160    * @return the first code point in its iteration range
    161    * @stable ICU 2.0
    162    */
    163   virtual UChar32       first32(void);
    164 
    165   /**
    166    * Sets the iterator to refer to the first code point in its
    167    * iteration range, returns that code point, and moves the position
    168    * to the second code point. This is an alternative to setToStart()
    169    * for forward iteration with next32PostInc().
    170    * @return the first code point in its iteration range.
    171    * @stable ICU 2.0
    172    */
    173   virtual UChar32       first32PostInc(void);
    174 
    175   /**
    176    * Sets the iterator to refer to the last code unit in its
    177    * iteration range, and returns that code unit.
    178    * This can be used to begin an iteration with previous().
    179    * @return the last code unit in its iteration range.
    180    * @stable ICU 2.0
    181    */
    182   virtual UChar         last(void);
    183 
    184   /**
    185    * Sets the iterator to refer to the last code point in its
    186    * iteration range, and returns that code unit.
    187    * This can be used to begin an iteration with previous32().
    188    * @return the last code point in its iteration range.
    189    * @stable ICU 2.0
    190    */
    191   virtual UChar32       last32(void);
    192 
    193   /**
    194    * Sets the iterator to refer to the "position"-th code unit
    195    * in the text-storage object the iterator refers to, and
    196    * returns that code unit.
    197    * @param position the position within the text-storage object
    198    * @return the code unit
    199    * @stable ICU 2.0
    200    */
    201   virtual UChar         setIndex(int32_t position);
    202 
    203   /**
    204    * Sets the iterator to refer to the beginning of the code point
    205    * that contains the "position"-th code unit
    206    * in the text-storage object the iterator refers to, and
    207    * returns that code point.
    208    * The current position is adjusted to the beginning of the code point
    209    * (its first code unit).
    210    * @param position the position within the text-storage object
    211    * @return the code unit
    212    * @stable ICU 2.0
    213    */
    214   virtual UChar32       setIndex32(int32_t position);
    215 
    216   /**
    217    * Returns the code unit the iterator currently refers to.
    218    * @return the code unit the iterator currently refers to.
    219    * @stable ICU 2.0
    220    */
    221   virtual UChar         current(void) const;
    222 
    223   /**
    224    * Returns the code point the iterator currently refers to.
    225    * @return the code point the iterator currently refers to.
    226    * @stable ICU 2.0
    227    */
    228   virtual UChar32       current32(void) const;
    229 
    230   /**
    231    * Advances to the next code unit in the iteration range (toward
    232    * endIndex()), and returns that code unit.  If there are no more
    233    * code units to return, returns DONE.
    234    * @return the next code unit in the iteration range.
    235    * @stable ICU 2.0
    236    */
    237   virtual UChar         next(void);
    238 
    239   /**
    240    * Gets the current code unit for returning and advances to the next code unit
    241    * in the iteration range
    242    * (toward endIndex()).  If there are
    243    * no more code units to return, returns DONE.
    244    * @return the current code unit.
    245    * @stable ICU 2.0
    246    */
    247   virtual UChar         nextPostInc(void);
    248 
    249   /**
    250    * Advances to the next code point in the iteration range (toward
    251    * endIndex()), and returns that code point.  If there are no more
    252    * code points to return, returns DONE.
    253    * Note that iteration with "pre-increment" semantics is less
    254    * efficient than iteration with "post-increment" semantics
    255    * that is provided by next32PostInc().
    256    * @return the next code point in the iteration range.
    257    * @stable ICU 2.0
    258    */
    259   virtual UChar32       next32(void);
    260 
    261   /**
    262    * Gets the current code point for returning and advances to the next code point
    263    * in the iteration range
    264    * (toward endIndex()).  If there are
    265    * no more code points to return, returns DONE.
    266    * @return the current point.
    267    * @stable ICU 2.0
    268    */
    269   virtual UChar32       next32PostInc(void);
    270 
    271   /**
    272    * Returns FALSE if there are no more code units or code points
    273    * at or after the current position in the iteration range.
    274    * This is used with nextPostInc() or next32PostInc() in forward
    275    * iteration.
    276    * @return FALSE if there are no more code units or code points
    277    * at or after the current position in the iteration range.
    278    * @stable ICU 2.0
    279    */
    280   virtual UBool        hasNext();
    281 
    282   /**
    283    * Advances to the previous code unit in the iteration range (toward
    284    * startIndex()), and returns that code unit.  If there are no more
    285    * code units to return, returns DONE.
    286    * @return the previous code unit in the iteration range.
    287    * @stable ICU 2.0
    288    */
    289   virtual UChar         previous(void);
    290 
    291   /**
    292    * Advances to the previous code point in the iteration range (toward
    293    * startIndex()), and returns that code point.  If there are no more
    294    * code points to return, returns DONE.
    295    * @return the previous code point in the iteration range.
    296    * @stable ICU 2.0
    297    */
    298   virtual UChar32       previous32(void);
    299 
    300   /**
    301    * Returns FALSE if there are no more code units or code points
    302    * before the current position in the iteration range.
    303    * This is used with previous() or previous32() in backward
    304    * iteration.
    305    * @return FALSE if there are no more code units or code points
    306    * before the current position in the iteration range.
    307    * @stable ICU 2.0
    308    */
    309   virtual UBool        hasPrevious();
    310 
    311   /**
    312    * Moves the current position relative to the start or end of the
    313    * iteration range, or relative to the current position itself.
    314    * The movement is expressed in numbers of code units forward
    315    * or backward by specifying a positive or negative delta.
    316    * @param delta the position relative to origin. A positive delta means forward;
    317    * a negative delta means backward.
    318    * @param origin Origin enumeration {kStart, kCurrent, kEnd}
    319    * @return the new position
    320    * @stable ICU 2.0
    321    */
    322   virtual int32_t      move(int32_t delta, EOrigin origin);
    323 
    324   /**
    325    * Moves the current position relative to the start or end of the
    326    * iteration range, or relative to the current position itself.
    327    * The movement is expressed in numbers of code points forward
    328    * or backward by specifying a positive or negative delta.
    329    * @param delta the position relative to origin. A positive delta means forward;
    330    * a negative delta means backward.
    331    * @param origin Origin enumeration {kStart, kCurrent, kEnd}
    332    * @return the new position
    333    * @stable ICU 2.0
    334    */
    335   virtual int32_t      move32(int32_t delta, EOrigin origin);
    336 
    337   /**
    338    * Sets the iterator to iterate over a new range of text
    339    * @stable ICU 2.0
    340    */
    341   void setText(const UChar* newText, int32_t newTextLength);
    342 
    343   /**
    344    * Copies the UChar array under iteration into the UnicodeString
    345    * referred to by "result".  Even if this iterator iterates across
    346    * only a part of this string, the whole string is copied.
    347    * @param result Receives a copy of the text under iteration.
    348    * @stable ICU 2.0
    349    */
    350   virtual void            getText(UnicodeString& result);
    351 
    352   /**
    353    * Return a class ID for this class (not really public)
    354    * @return a class ID for this class
    355    * @stable ICU 2.0
    356    */
    357   static UClassID         U_EXPORT2 getStaticClassID(void);
    358 
    359   /**
    360    * Return a class ID for this object (not really public)
    361    * @return a class ID for this object.
    362    * @stable ICU 2.0
    363    */
    364   virtual UClassID        getDynamicClassID(void) const;
    365 
    366 protected:
    367   /**
    368    * Protected constructor
    369    * @stable ICU 2.0
    370    */
    371   UCharCharacterIterator();
    372   /**
    373    * Protected member text
    374    * @stable ICU 2.0
    375    */
    376   const UChar*            text;
    377 
    378 };
    379 
    380 U_NAMESPACE_END
    381 #endif
    382