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

#ifndef __java_lang_AbstractStringBuffer__
#define __java_lang_AbstractStringBuffer__

#pragma interface

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


class java::lang::AbstractStringBuffer : public ::java::lang::Object
{

public: // actually package-private
  AbstractStringBuffer();
  AbstractStringBuffer(jint);
  AbstractStringBuffer(::java::lang::String *);
  AbstractStringBuffer(::java::lang::CharSequence *);
public:
  virtual void ensureCapacity(jint);
  virtual void setLength(jint);
  virtual jchar charAt(jint);
  virtual jint codePointAt(jint);
  virtual jint codePointBefore(jint);
  virtual void getChars(jint, jint, JArray< jchar > *, jint);
  virtual void setCharAt(jint, jchar);
  virtual ::java::lang::AbstractStringBuffer * append(::java::lang::Object *);
  virtual ::java::lang::AbstractStringBuffer * append(::java::lang::String *);
  virtual ::java::lang::AbstractStringBuffer * append(::java::lang::StringBuffer *);
  virtual ::java::lang::AbstractStringBuffer * append(JArray< jchar > *);
  virtual ::java::lang::AbstractStringBuffer * append(JArray< jchar > *, jint, jint);
  virtual ::java::lang::AbstractStringBuffer * append(jboolean);
  virtual ::java::lang::AbstractStringBuffer * AbstractStringBuffer$append(jchar);
  virtual ::java::lang::AbstractStringBuffer * AbstractStringBuffer$append(::java::lang::CharSequence *);
  virtual ::java::lang::AbstractStringBuffer * AbstractStringBuffer$append(::java::lang::CharSequence *, jint, jint);
  virtual ::java::lang::AbstractStringBuffer * append(jint);
  virtual ::java::lang::AbstractStringBuffer * append(jlong);
  virtual ::java::lang::AbstractStringBuffer * append(jfloat);
  virtual ::java::lang::AbstractStringBuffer * append(jdouble);
  virtual ::java::lang::AbstractStringBuffer * appendCodePoint(jint);
  virtual ::java::lang::AbstractStringBuffer * delete$(jint, jint);
  virtual ::java::lang::AbstractStringBuffer * deleteCharAt(jint);
  virtual ::java::lang::AbstractStringBuffer * replace(jint, jint, ::java::lang::String *);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, JArray< jchar > *, jint, jint);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, ::java::lang::Object *);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, ::java::lang::String *);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, ::java::lang::CharSequence *);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, ::java::lang::CharSequence *, jint, jint);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, JArray< jchar > *);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, jboolean);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, jchar);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, jint);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, jlong);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, jfloat);
  virtual ::java::lang::AbstractStringBuffer * insert(jint, jdouble);
  virtual jint indexOf(::java::lang::String *);
  virtual jint indexOf(::java::lang::String *, jint);
  virtual jint lastIndexOf(::java::lang::String *);
  virtual jint lastIndexOf(::java::lang::String *, jint);
  virtual ::java::lang::AbstractStringBuffer * reverse();
  virtual void trimToSize();
  virtual jint codePointCount(jint, jint);
  virtual jint offsetByCodePoints(jint, jint);
public: // actually package-private
  virtual void ensureCapacity_unsynchronized(jint);
private:
  jboolean regionMatches(jint, ::java::lang::String *);
public:
  virtual ::java::lang::Appendable * append(::java::lang::CharSequence *, jint, jint);
  virtual ::java::lang::Appendable * append(::java::lang::CharSequence *);
  virtual ::java::lang::Appendable * append(jchar);
  virtual jint length() = 0;
  virtual ::java::lang::CharSequence * subSequence(jint, jint) = 0;
public: // actually package-private
  jint __attribute__((aligned(__alignof__( ::java::lang::Object)))) count;
  JArray< jchar > * value;
private:
  static const jint DEFAULT_CAPACITY = 16;
public:
  static ::java::lang::Class class$;
};

#endif // __java_lang_AbstractStringBuffer__
