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

#ifndef __java_util_logging_Level__
#define __java_util_logging_Level__

#pragma interface

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


class java::util::logging::Level : public ::java::lang::Object
{

public: // actually protected
  Level(::java::lang::String *, jint);
  Level(::java::lang::String *, jint, ::java::lang::String *);
private:
  ::java::lang::Object * readResolve();
public:
  virtual ::java::lang::String * getResourceBundleName();
  virtual ::java::lang::String * getName();
  virtual ::java::lang::String * getLocalizedName();
  virtual ::java::lang::String * toString();
  virtual jint intValue();
  static ::java::util::logging::Level * parse(::java::lang::String *);
  virtual jboolean equals(::java::lang::Object *);
  virtual jint hashCode();
public: // actually package-private
  virtual jboolean isStandardLevel();
public:
  static ::java::util::logging::Level * OFF;
  static ::java::util::logging::Level * SEVERE;
  static ::java::util::logging::Level * WARNING;
  static ::java::util::logging::Level * INFO;
  static ::java::util::logging::Level * CONFIG;
  static ::java::util::logging::Level * FINE;
  static ::java::util::logging::Level * FINER;
  static ::java::util::logging::Level * FINEST;
  static ::java::util::logging::Level * ALL;
private:
  static JArray< ::java::util::logging::Level * > * knownLevels;
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) name;
  jint value;
  ::java::lang::String * resourceBundleName;
public: // actually package-private
  static const jlong serialVersionUID = -8176160795706313070LL;
public:
  static ::java::lang::Class class$;
};

#endif // __java_util_logging_Level__
