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

#ifndef __gnu_java_security_prng_BasePRNG__
#define __gnu_java_security_prng_BasePRNG__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace java
    {
      namespace security
      {
        namespace prng
        {
            class BasePRNG;
        }
      }
    }
  }
}

class gnu::java::security::prng::BasePRNG : public ::java::lang::Object
{

public: // actually protected
  BasePRNG(::java::lang::String *);
public:
  virtual ::java::lang::String * name();
  virtual void init(::java::util::Map *);
  virtual jbyte nextByte();
  virtual void nextBytes(JArray< jbyte > *);
  virtual void nextBytes(JArray< jbyte > *, jint, jint);
  virtual void addRandomByte(jbyte);
  virtual void addRandomBytes(JArray< jbyte > *);
  virtual void addRandomBytes(JArray< jbyte > *, jint, jint);
  virtual jboolean isInitialised();
private:
  jbyte nextByteInternal();
public:
  virtual ::java::lang::Object * clone();
  virtual void setup(::java::util::Map *) = 0;
  virtual void fillBlock() = 0;
public: // actually protected
  ::java::lang::String * __attribute__((aligned(__alignof__( ::java::lang::Object)))) name__;
  jboolean initialised;
  JArray< jbyte > * buffer;
  jint ndx;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_java_security_prng_BasePRNG__
