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

#ifndef __java_nio_ByteBufferImpl__
#define __java_nio_ByteBufferImpl__

#pragma interface

#include <java/nio/ByteBuffer.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace nio
    {
        class ByteBuffer;
        class ByteBufferImpl;
        class CharBuffer;
        class DoubleBuffer;
        class FloatBuffer;
        class IntBuffer;
        class LongBuffer;
        class ShortBuffer;
    }
  }
}

class java::nio::ByteBufferImpl : public ::java::nio::ByteBuffer
{

public: // actually package-private
  ByteBufferImpl(JArray< jbyte > *, jint, jint, jint, jint, jint, jboolean);
public:
  ::java::nio::CharBuffer * asCharBuffer();
  ::java::nio::ShortBuffer * asShortBuffer();
  ::java::nio::IntBuffer * asIntBuffer();
  ::java::nio::LongBuffer * asLongBuffer();
  ::java::nio::FloatBuffer * asFloatBuffer();
  ::java::nio::DoubleBuffer * asDoubleBuffer();
  jboolean isReadOnly();
  ::java::nio::ByteBuffer * slice();
  ::java::nio::ByteBuffer * duplicate();
  ::java::nio::ByteBuffer * asReadOnlyBuffer();
public: // actually package-private
  void shiftDown(jint, jint, jint);
public:
  ::java::nio::ByteBuffer * compact();
  jboolean isDirect();
  jbyte get();
  ::java::nio::ByteBuffer * get(JArray< jbyte > *, jint, jint);
  ::java::nio::ByteBuffer * put(JArray< jbyte > *, jint, jint);
  ::java::nio::ByteBuffer * put(jbyte);
  jbyte get(jint);
  ::java::nio::ByteBuffer * put(jint, jbyte);
  jchar getChar();
  ::java::nio::ByteBuffer * putChar(jchar);
  jchar getChar(jint);
  ::java::nio::ByteBuffer * putChar(jint, jchar);
  jshort getShort();
  ::java::nio::ByteBuffer * putShort(jshort);
  jshort getShort(jint);
  ::java::nio::ByteBuffer * putShort(jint, jshort);
  jint getInt();
  ::java::nio::ByteBuffer * putInt(jint);
  jint getInt(jint);
  ::java::nio::ByteBuffer * putInt(jint, jint);
  jlong getLong();
  ::java::nio::ByteBuffer * putLong(jlong);
  jlong getLong(jint);
  ::java::nio::ByteBuffer * putLong(jint, jlong);
  jfloat getFloat();
  ::java::nio::ByteBuffer * putFloat(jfloat);
  jfloat getFloat(jint);
  ::java::nio::ByteBuffer * putFloat(jint, jfloat);
  jdouble getDouble();
  ::java::nio::ByteBuffer * putDouble(jdouble);
  jdouble getDouble(jint);
  ::java::nio::ByteBuffer * putDouble(jint, jdouble);
private:
  jboolean __attribute__((aligned(__alignof__( ::java::nio::ByteBuffer)))) readOnly;
public:
  static ::java::lang::Class class$;
};

#endif // __java_nio_ByteBufferImpl__
