
// 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 > *, ::java::util::List *);
  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 ::java::util::List * getAttributes();
private:
  ::gnu::java::lang::CPStringBuilder * __attribute__((aligned(__alignof__( ::java::lang::Object)))) buffer;
  ::java::util::ArrayList * ranges;
  ::java::util::ArrayList * attributes;
  JArray< jint > * aRanges;
  ::java::util::List * aAttributes;
  jint startingRange;
public: // actually package-private
  ::java::text::AttributedCharacterIterator$Attribute * defaultAttr;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_text_AttributedFormatBuffer__
