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

#ifndef __gnu_java_util_regex_RETokenRepeated__
#define __gnu_java_util_regex_RETokenRepeated__

#pragma interface

#include <gnu/java/util/regex/REToken.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace lang
      {
          class CPStringBuilder;
      }
      namespace util
      {
        namespace regex
        {
            class BacktrackStack;
            class CharIndexed;
            class REMatch;
            class REToken;
            class RETokenRepeated;
            class RETokenRepeated$DoablesFinder;
            class RETokenRepeated$TryAnotherResult;
        }
      }
    }
  }
}

class gnu::java::util::regex::RETokenRepeated : public ::gnu::java::util::regex::REToken
{

public: // actually package-private
  RETokenRepeated(jint, ::gnu::java::util::regex::REToken *, jint, jint);
  void makeStingy();
  jboolean isStingy();
  void makePossessive();
  jboolean isPossessive();
  jint getMinimumLength();
  jint getMaximumLength();
  ::gnu::java::util::regex::REMatch * findMatch(::gnu::java::util::regex::CharIndexed *, ::gnu::java::util::regex::REMatch *);
  ::gnu::java::util::regex::REMatch * backtrack(::gnu::java::util::regex::CharIndexed *, ::gnu::java::util::regex::REMatch *, ::java::lang::Object *);
private:
  ::gnu::java::util::regex::REMatch * findMatch(::gnu::java::util::regex::BacktrackStack *);
  ::gnu::java::util::regex::REMatch * findMatch(::gnu::java::util::regex::BacktrackStack *, ::java::util::Deque *);
  ::gnu::java::util::regex::RETokenRepeated$TryAnotherResult * tryAnother(::gnu::java::util::regex::BacktrackStack *, ::gnu::java::util::regex::CharIndexed *, ::gnu::java::util::regex::REMatch *, jint, ::gnu::java::util::regex::RETokenRepeated$DoablesFinder *, JArray< jint > *);
public: // actually package-private
  jboolean match(::gnu::java::util::regex::CharIndexed *, ::gnu::java::util::regex::REMatch *);
private:
  static JArray< jint > * initVisited();
  static jboolean visitedContains(jint, JArray< jint > *);
  static JArray< jint > * addVisited(jint, JArray< jint > *);
  ::gnu::java::util::regex::REMatch * matchRest(::gnu::java::util::regex::CharIndexed *, ::gnu::java::util::regex::REMatch *);
  ::gnu::java::util::regex::REMatch * findMatchFixedLength(::gnu::java::util::regex::CharIndexed *, ::gnu::java::util::regex::REMatch *);
  ::gnu::java::util::regex::REMatch * backtrackFixedLength(::gnu::java::util::regex::CharIndexed *, ::gnu::java::util::regex::REMatch *, ::java::lang::Object *);
  ::gnu::java::util::regex::REMatch * findMatchFixedLength(::gnu::java::util::regex::CharIndexed *, ::gnu::java::util::regex::REMatch *, jint, jint);
public: // actually package-private
  void dump(::gnu::java::lang::CPStringBuilder *);
private:
  ::gnu::java::util::regex::REToken * __attribute__((aligned(__alignof__( ::gnu::java::util::regex::REToken)))) token;
  jint min;
  jint max;
  jboolean stingy;
  jboolean possessive;
  jint tokenFixedLength;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_util_regex_RETokenRepeated__
