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

#ifndef __java_nio_charset_CoderResult__
#define __java_nio_charset_CoderResult__

#pragma interface

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

extern "Java"
{
  namespace java
  {
    namespace nio
    {
      namespace charset
      {
          class CoderResult;
          class CoderResult$Cache;
      }
    }
  }
}

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

public: // actually package-private
  CoderResult(jint, jint);
public:
  virtual jboolean isError();
  virtual jboolean isMalformed();
  virtual jboolean isOverflow();
  virtual jboolean isUnderflow();
  virtual jboolean isUnmappable();
  virtual jint length();
  static ::java::nio::charset::CoderResult * malformedForLength(jint);
  virtual void throwException();
  virtual ::java::lang::String * toString();
  static ::java::nio::charset::CoderResult * unmappableForLength(jint);
private:
  static const jint TYPE_MALFORMED = 0;
  static const jint TYPE_OVERFLOW = 1;
  static const jint TYPE_UNDERFLOW = 2;
  static const jint TYPE_UNMAPPABLE = 3;
public:
  static ::java::nio::charset::CoderResult * OVERFLOW;
  static ::java::nio::charset::CoderResult * UNDERFLOW;
private:
  static JArray< ::java::lang::String * > * names;
  static ::java::nio::charset::CoderResult$Cache * malformedCache;
  static ::java::nio::charset::CoderResult$Cache * unmappableCache;
  jint __attribute__((aligned(__alignof__( ::java::lang::Object)))) type;
  jint length__;
public:
  static ::java::lang::Class class$;
};

#endif // __java_nio_charset_CoderResult__
