
/*
********************************************************************
*
*   Copyright (C) 1997-1999, International Business Machines
*   Corporation and others.  All Rights Reserved.
*
********************************************************************
*/

#ifndef CHARITER_H
#define CHARITER_H

#include "unicode/utypes.h"
#include "unicode/unistr.h"


/**
 *  Abstract class defining a protcol for accessing characters in a text-storage object.
    <P>Examples:<P>

    Function processing characters, in this example simple output
    <pre>
    .   void processChar( UChar c )
    .   {
    .       cout &lt;&lt; " " &lt;&lt; c;
    .   }
    </pre>
    Traverse the text from start to finish
    <pre> 
    .   void traverseForward(CharacterIterator& iter)
    .   {
    .       for(UChar c = iter.first(); c != CharacterIterator.DONE; c = iter.next()) {
    .           processChar(c);
    .       }
    .   }
    </pre>
    Traverse the text backwards, from end to start
    <pre>
    .   void traverseBackward(CharacterIterator& iter)
    .   {
    .       for(UChar c = iter.last(); c != CharacterIterator.DONE; c = iter.previous()) {
    .           processChar(c);
    .       }
    .   }
    </pre>
    Traverse both forward and backward from a given position in the text. 
    Calls to notBoundary() in this example represents some additional stopping criteria.
    <pre>
    .   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 &lt;&lt; "start: " &lt;&lt; start &lt;&lt; " end: " &lt;&lt; end &lt;&lt; endl;
    .       for (c = iter.setIndex(start); iter.getIndex() &lt; end; c = iter.next() ) {
    .           processChar(c);
    .       }
    .    }
    </pre>
    Creating a StringCharacterIteratorand calling the test functions
    <pre>
    .    void CharacterIterator_Example( void )
    .    {
    .        cout &lt;&lt; endl &lt;&lt; "===== CharacterIterator_Example: =====" &lt;&lt; endl;
    .        UnicodeString text("Ein kleiner Satz.");
    .        StringCharacterIterator iterator(text);
    .        cout &lt;&lt; "----- traverseForward: -----------" &lt;&lt; endl;
    .        traverseForward( iterator );
    .        cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "----- traverseBackward: ----------" &lt;&lt; endl;
    .        traverseBackward( iterator );
    .        cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "----- traverseOut: ---------------" &lt;&lt; endl;
    .        traverseOut( iterator, 7 );
    .        cout &lt;&lt; endl &lt;&lt; endl &lt;&lt; "-----" &lt;&lt; endl;
    .    }
    </pre>
 */
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").<P> 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



