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

#ifndef __gnu_java_security_OID__
#define __gnu_java_security_OID__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace security
      {
          class OID;
      }
    }
  }
}

class gnu::java::security::OID : public ::java::lang::Object
{

public:
  OID(JArray< jint > *);
  OID(JArray< jint > *, jboolean);
  OID(::java::lang::String *);
  OID(::java::lang::String *, jboolean);
  OID(::java::io::InputStream *, jint);
  OID(::java::io::InputStream *, jint, jboolean);
  OID(JArray< jbyte > *);
  OID(JArray< jbyte > *, jboolean);
  virtual JArray< jint > * getIDs();
  virtual JArray< jbyte > * getDER();
  virtual ::gnu::java::security::OID * getParent();
  virtual ::gnu::java::security::OID * getChild(jint);
  virtual ::gnu::java::security::OID * getRoot();
  virtual jboolean isRelative();
  virtual ::java::lang::Object * clone();
  virtual ::java::lang::String * toString();
  virtual jint hashCode();
  virtual jboolean equals(::java::lang::Object *);
  virtual jint compareTo(::java::lang::Object *);
private:
  static JArray< jint > * fromDER(JArray< jbyte > *, jboolean);
  static JArray< jint > * fromString(::java::lang::String *);
  static void encodeSubID(::java::io::ByteArrayOutputStream *, jint);
public: // actually package-private
  static const jlong serialVersionUID = 5722492029044597779LL;
private:
  JArray< jint > * __attribute__((aligned(__alignof__( ::java::lang::Object)))) components;
  ::java::lang::String * strRep;
  JArray< jbyte > * der;
  jboolean relative;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_security_OID__
