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

#ifndef __gnu_java_text_AttributedFormatBuffer__
#define __gnu_java_text_AttributedFormatBuffer__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace lang
      {
          class CPStringBuilder;
      }
      namespace text
      {
          class AttributedFormatBuffer;
      }
    }
  }
  namespace java
  {
    namespace text
    {
        class AttributedCharacterIterator$Attribute;
    }
  }
}

class gnu::java::text::AttributedFormatBuffer : public ::java::lang::Object
{

public:
  AttributedFormatBuffer(::gnu::java::lang::CPStringBuilder *);
  AttributedFormatBuffer(jint);
  AttributedFormatBuffer();
private:
  void addAttribute(jint, ::java::text::AttributedCharacterIterator$Attribute *);
public:
  virtual void append(::java::lang::String *);
  virtual void append(::java::lang::String *, ::java::text::AttributedCharacterIterator$Attribute *);
  virtual void append(::java::lang::String *, JArray< jint > *, JArray< ::java::util::HashMap * > *);
  virtual void append(jchar);
  virtual void append(jchar, ::java::text::AttributedCharacterIterator$Attribute *);
  virtual void setDefaultAttribute(::java::text::AttributedCharacterIterator$Attribute *);
  virtual ::java::text::AttributedCharacterIterator$Attribute * getDefaultAttribute();
  virtual void cutTail(jint);
  virtual jint length();
  virtual void clear();
  virtual void sync();
  virtual ::gnu::java::lang::CPStringBuilder * getBuffer();
  virtual JArray< jint > * getRanges();
  virtual JArray< ::java::util::HashMap * > * getAttributes();
private:
  ::gnu::java::lang::CPStringBuilder * __attribute__((aligned(__alignof__( ::java::lang::Object)))) buffer;
  ::java::util::ArrayList * ranges;
  ::java::util::ArrayList * attributes;
  JArray< jint > * a_ranges;
  JArray< ::java::util::HashMap * > * a_attributes;
  jint startingRange;
public: // actually package-private
  ::java::text::AttributedCharacterIterator$Attribute * defaultAttr;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_text_AttributedFormatBuffer__
