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

#ifndef __javax_imageio_stream_ImageInputStreamImpl__
#define __javax_imageio_stream_ImageInputStreamImpl__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace nio
    {
        class ByteOrder;
    }
  }
  namespace javax
  {
    namespace imageio
    {
      namespace stream
      {
          class IIOByteBuffer;
          class ImageInputStreamImpl;
      }
    }
  }
}

class javax::imageio::stream::ImageInputStreamImpl : public ::java::lang::Object
{

public:
  ImageInputStreamImpl();
public: // actually protected
  virtual void checkClosed();
public:
  virtual void close();
public: // actually protected
  virtual void finalize();
public:
  virtual void flush();
  virtual void flushBefore(jlong);
  virtual jint getBitOffset();
  virtual ::java::nio::ByteOrder * getByteOrder();
  virtual jlong getFlushedPosition();
  virtual jlong getStreamPosition();
  virtual jboolean isCached();
  virtual jboolean isCachedFile();
  virtual jboolean isCachedMemory();
  virtual jlong length();
  virtual void mark();
  virtual jint read() = 0;
  virtual jint read(JArray< jbyte > *, jint, jint) = 0;
  virtual jint read(JArray< jbyte > *);
  virtual jint readBit();
  virtual jlong readBits(jint);
  virtual jboolean readBoolean();
  virtual jbyte readByte();
  virtual void readBytes(::javax::imageio::stream::IIOByteBuffer *, jint);
  virtual jchar readChar();
  virtual jdouble readDouble();
  virtual jfloat readFloat();
  virtual void readFully(JArray< jbyte > *);
  virtual void readFully(JArray< jbyte > *, jint, jint);
  virtual void readFully(JArray< jchar > *, jint, jint);
  virtual void readFully(JArray< jdouble > *, jint, jint);
  virtual void readFully(JArray< jfloat > *, jint, jint);
  virtual void readFully(JArray< jint > *, jint, jint);
  virtual void readFully(JArray< jlong > *, jint, jint);
  virtual void readFully(JArray< jshort > *, jint, jint);
  virtual jint readInt();
  virtual ::java::lang::String * readLine();
  virtual jlong readLong();
  virtual jshort readShort();
  virtual jint readUnsignedByte();
  virtual jlong readUnsignedInt();
  virtual jint readUnsignedShort();
  virtual ::java::lang::String * readUTF();
  virtual void reset();
  virtual void seek(jlong);
  virtual void setBitOffset(jint);
  virtual void setByteOrder(::java::nio::ByteOrder *);
  virtual jint skipBytes(jint);
  virtual jlong skipBytes(jlong);
private:
  void readFullyPrivate(JArray< jbyte > *, jint, jint);
  jboolean __attribute__((aligned(__alignof__( ::java::lang::Object)))) closed;
  ::java::util::Stack * markStack;
public: // actually package-private
  JArray< jbyte > * buffer;
public: // actually protected
  jint bitOffset;
  ::java::nio::ByteOrder * byteOrder;
  jlong flushedPos;
  jlong streamPos;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_imageio_stream_ImageInputStreamImpl__
