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

#ifndef __java_text_CollationElementIterator__
#define __java_text_CollationElementIterator__

#pragma interface

#include <java/lang/Object.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace text
    {
        class CharacterIterator;
        class CollationElementIterator;
        class RuleBasedCollator;
        class RuleBasedCollator$CollationElement;
    }
  }
}

class java::text::CollationElementIterator : public ::java::lang::Object
{

public: // actually package-private
  CollationElementIterator(::java::text::RuleBasedCollator *, ::java::lang::String *);
  CollationElementIterator(::java::text::RuleBasedCollator *, ::java::text::CharacterIterator *);
  ::java::text::RuleBasedCollator$CollationElement * nextBlock();
  ::java::text::RuleBasedCollator$CollationElement * previousBlock();
public:
  jint next();
  jint previous();
  static jint primaryOrder(jint);
  void reset();
  static jshort secondaryOrder(jint);
  static jshort tertiaryOrder(jint);
  void setText(::java::lang::String *);
  void setText(::java::text::CharacterIterator *);
  jint getOffset();
  void setOffset(jint);
  jint getMaxExpansion(jint);
  static const jint NULLORDER = -1;
public: // actually package-private
  ::java::text::RuleBasedCollator * __attribute__((aligned(__alignof__( ::java::lang::Object)))) collator;
  ::java::text::CharacterIterator * text;
  jint index;
  jint textIndex;
private:
  JArray< ::java::text::RuleBasedCollator$CollationElement * > * textDecomposition;
  JArray< jint > * textIndexes;
public:
  static ::java::lang::Class class$;
};

#endif // __java_text_CollationElementIterator__
