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

#ifndef __java_nio_charset_CharsetDecoder__
#define __java_nio_charset_CharsetDecoder__

#pragma interface

#include <java/lang/Object.h>
extern "Java"
{
  namespace java
  {
    namespace nio
    {
        class ByteBuffer;
        class CharBuffer;
      namespace charset
      {
          class Charset;
          class CharsetDecoder;
          class CoderResult;
          class CodingErrorAction;
      }
    }
  }
}

class java::nio::charset::CharsetDecoder : public ::java::lang::Object
{

  CharsetDecoder(::java::nio::charset::Charset *, jfloat, jfloat, ::java::lang::String *);
public: // actually protected
  CharsetDecoder(::java::nio::charset::Charset *, jfloat, jfloat);
public:
  virtual jfloat averageCharsPerByte();
  virtual ::java::nio::charset::Charset * charset();
  virtual ::java::nio::CharBuffer * decode(::java::nio::ByteBuffer *);
  virtual ::java::nio::charset::CoderResult * decode(::java::nio::ByteBuffer *, ::java::nio::CharBuffer *, jboolean);
public: // actually protected
  virtual ::java::nio::charset::CoderResult * decodeLoop(::java::nio::ByteBuffer *, ::java::nio::CharBuffer *) = 0;
public:
  virtual ::java::nio::charset::Charset * detectedCharset();
  virtual ::java::nio::charset::CoderResult * flush(::java::nio::CharBuffer *);
public: // actually protected
  virtual ::java::nio::charset::CoderResult * implFlush(::java::nio::CharBuffer *);
public:
  virtual ::java::nio::charset::CharsetDecoder * onMalformedInput(::java::nio::charset::CodingErrorAction *);
public: // actually protected
  virtual void implOnMalformedInput(::java::nio::charset::CodingErrorAction *);
  virtual void implOnUnmappableCharacter(::java::nio::charset::CodingErrorAction *);
  virtual void implReplaceWith(::java::lang::String *);
  virtual void implReset();
public:
  virtual jboolean isAutoDetecting();
  virtual jboolean isCharsetDetected();
  virtual ::java::nio::charset::CodingErrorAction * malformedInputAction();
  virtual jfloat maxCharsPerByte();
  virtual ::java::nio::charset::CharsetDecoder * onUnmappableCharacter(::java::nio::charset::CodingErrorAction *);
  virtual ::java::lang::String * replacement();
  virtual ::java::nio::charset::CharsetDecoder * replaceWith(::java::lang::String *);
  virtual ::java::nio::charset::CharsetDecoder * reset();
  virtual ::java::nio::charset::CodingErrorAction * unmappableCharacterAction();
private:
  static const jint STATE_RESET = 0;
  static const jint STATE_CODING = 1;
  static const jint STATE_END = 2;
  static const jint STATE_FLUSHED = 3;
  static ::java::lang::String * DEFAULT_REPLACEMENT;
  ::java::nio::charset::Charset * __attribute__((aligned(__alignof__( ::java::lang::Object)))) charset__;
  jfloat averageCharsPerByte__;
  jfloat maxCharsPerByte__;
  ::java::lang::String * replacement__;
  jint state;
  ::java::nio::charset::CodingErrorAction * malformedInputAction__;
  ::java::nio::charset::CodingErrorAction * unmappableCharacterAction__;
public:
  static ::java::lang::Class class$;
};

#endif // __java_nio_charset_CharsetDecoder__
