/*
  // CharIter.java
  CharIter class - 2001.11.09
    by milan ramaiya
    
  similiar to CharacterIterator interface
  offers iteration over text, uses a character array for very fast manipulation
  
  CONSTRUCTORS
  ------------
  CharIter(String s)
  CharIter(char a[])
  
  METHODS
  -------
  char    first()           move index to beginning, and return char
  char    last()            move index to end, and return char
  char    current()         return char at current index
  char    next()            increment index, return char, ERROR if out-of-range
  char    previous()        decrement index, return char, ERROR if out-of-range
  char    next(int i)       increment index by i, return char, ERROR if OOR
  char    previous(int i)   decrement index by i, return char, ERROR if OOR
  char    setIndex(int i)   set index, and return char, or ERROR if OOR
  int     getIndex()        return current index
  int     getBeginIndex()   returns first index
  int     getEndIndex()     returns last index
  boolean matches(String s) tests if s matches array from current index

  PRIVATE METHODS
  ---------------
  int     minmax(n, a, b)   if n<a, returns a; if n>b, returns b; else returns n
*/
  
class CharIter
{
    // undefined in UNICODE 2.0 standard
    public static final char ERROR = '\uFFFF';
    
    private char array[]; // storage for text
    private int  index;   // current position
    
    CharIter(String s) { array = s.toCharArray(); }
    CharIter(char a[]) { array = a; }

    public boolean done() { return index>=array.length; }

    public char first()   { return array[index=0]; }
    public char last()    { return array[index=array.length-1]; }
    public char current() { return array[index]; }
    
    public char next()          { return setIndex(index+1);  }
    public char next(int i)     { return setIndex(index+i);  }
    public char previous()      { return setIndex(index-1);  }
    public char previous(int i) { return setIndex(index-i);  }

    public int getIndex()      { return index; }
    public int getBeginIndex() { return 0; }
    public int getEndIndex()   { return array.length - 1; }
    
    public char setIndex(int position)
    {
        index = minmax(position, -1, array.length);
        return (index>-1 && index<array.length) ? array[index] : ERROR;
    }
    
    public boolean matches(String s)
    {
        return (index+s.length()<=array.length) &&
            s.equals(new String(array, index, s.length()));
    }

    private int minmax(int n, int a, int b)
    { return (n<a)?a:((n>b)?b:n); }
}
