
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __gnu_java_util_regex_CharIndexedCharSequence__
#define __gnu_java_util_regex_CharIndexedCharSequence__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace util
      {
        namespace regex
        {
            class CharIndexed;
            class CharIndexedCharSequence;
            class REMatch;
        }
      }
    }
  }
}

class gnu::java::util::regex::CharIndexedCharSequence : public ::java::lang::Object
{

public: // actually package-private
  CharIndexedCharSequence(::java::lang::CharSequence *, jint);
public:
  virtual jchar charAt(jint);
  virtual jboolean isValid();
  virtual jboolean move(jint);
  virtual jboolean move1(jint);
  virtual ::gnu::java::util::regex::CharIndexed * lookBehind(jint, jint);
  virtual jint length();
  virtual void setLastMatch(::gnu::java::util::regex::REMatch *);
  virtual ::gnu::java::util::regex::REMatch * getLastMatch();
  virtual void setHitEnd(::gnu::java::util::regex::REMatch *);
  virtual jboolean hitEnd();
  virtual jint getAnchor();
  virtual void setAnchor(jint);
private:
  ::java::lang::CharSequence * __attribute__((aligned(__alignof__( ::java::lang::Object)))) s;
  jint anchor;
  jint len;
  ::gnu::java::util::regex::REMatch * lastMatch;
  jint rightmostTriedPosition;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_util_regex_CharIndexedCharSequence__
