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

#ifndef __java_text_AttributedStringIterator__
#define __java_text_AttributedStringIterator__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace text
    {
        class AttributedCharacterIterator$Attribute;
        class AttributedString$AttributeRange;
        class AttributedStringIterator;
        class CharacterIterator;
        class StringCharacterIterator;
    }
  }
}

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

public: // actually package-private
  AttributedStringIterator(::java::text::StringCharacterIterator *, JArray< ::java::text::AttributedString$AttributeRange * > *, jint, jint, JArray< ::java::text::AttributedCharacterIterator$Attribute * > *);
public:
  virtual ::java::lang::Object * clone();
  virtual jchar current();
  virtual jchar next();
  virtual jchar previous();
  virtual jchar first();
  virtual jchar last();
  virtual jint getIndex();
  virtual jchar setIndex(jint);
  virtual jint getBeginIndex();
  virtual jint getEndIndex();
  virtual ::java::util::Set * getAllAttributeKeys();
  virtual jint getRunLimit();
  virtual jint getRunLimit(::java::text::AttributedCharacterIterator$Attribute *);
  virtual jint getRunLimit(::java::util::Set *);
  virtual jint getRunStart();
  virtual jint getRunStart(::java::text::AttributedCharacterIterator$Attribute *);
  virtual jint getRunStart(::java::util::Set *);
private:
  ::java::lang::Object * getAttribute(::java::text::AttributedCharacterIterator$Attribute *, jint);
public:
  virtual ::java::lang::Object * getAttribute(::java::text::AttributedCharacterIterator$Attribute *);
  virtual ::java::util::Map * getAttributes();
private:
  ::java::text::CharacterIterator * __attribute__((aligned(__alignof__( ::java::lang::Object)))) ci;
  JArray< ::java::text::AttributedString$AttributeRange * > * attribs;
  JArray< ::java::text::AttributedCharacterIterator$Attribute * > * restricts;
public:
  static ::java::lang::Class class$;
};

#endif // __java_text_AttributedStringIterator__
