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

#ifndef __java_text_AttributedString__
#define __java_text_AttributedString__

#pragma interface

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

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

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

public:
  AttributedString(::java::lang::String *);
  AttributedString(::java::lang::String *, ::java::util::Map *);
  AttributedString(::java::text::AttributedCharacterIterator *);
  AttributedString(::java::text::AttributedCharacterIterator *, jint, jint);
  AttributedString(::java::text::AttributedCharacterIterator *, jint, jint, JArray< ::java::text::AttributedCharacterIterator$Attribute * > *);
  virtual void addAttribute(::java::text::AttributedCharacterIterator$Attribute *, ::java::lang::Object *);
  virtual void addAttribute(::java::text::AttributedCharacterIterator$Attribute *, ::java::lang::Object *, jint, jint);
  virtual void addAttributes(::java::util::Map *, jint, jint);
  virtual ::java::text::AttributedCharacterIterator * getIterator();
  virtual ::java::text::AttributedCharacterIterator * getIterator(JArray< ::java::text::AttributedCharacterIterator$Attribute * > *);
  virtual ::java::text::AttributedCharacterIterator * getIterator(JArray< ::java::text::AttributedCharacterIterator$Attribute * > *, jint, jint);
private:
  ::java::text::StringCharacterIterator * __attribute__((aligned(__alignof__( ::java::lang::Object)))) sci;
  JArray< ::java::text::AttributedString$AttributeRange * > * attribs;
public:
  static ::java::lang::Class class$;
};

#endif // __java_text_AttributedString__
