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

#ifndef __gnu_javax_crypto_assembly_Stage__
#define __gnu_javax_crypto_assembly_Stage__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace javax
    {
      namespace crypto
      {
        namespace assembly
        {
            class Cascade;
            class Direction;
            class Stage;
        }
        namespace mode
        {
            class IMode;
        }
      }
    }
  }
}

class gnu::javax::crypto::assembly::Stage : public ::java::lang::Object
{

public: // actually protected
  Stage(::gnu::javax::crypto::assembly::Direction *);
public:
  static ::gnu::javax::crypto::assembly::Stage * getInstance(::gnu::javax::crypto::mode::IMode *, ::gnu::javax::crypto::assembly::Direction *);
  static ::gnu::javax::crypto::assembly::Stage * getInstance(::gnu::javax::crypto::assembly::Cascade *, ::gnu::javax::crypto::assembly::Direction *);
  virtual ::java::util::Set * blockSizes() = 0;
  virtual void init(::java::util::Map *);
  virtual jint currentBlockSize() = 0;
  virtual void reset();
  virtual void update(JArray< jbyte > *, jint, JArray< jbyte > *, jint);
  virtual jboolean selfTest() = 0;
public: // actually package-private
  virtual void initDelegate(::java::util::Map *) = 0;
  virtual void resetDelegate() = 0;
  virtual void updateDelegate(JArray< jbyte > *, jint, JArray< jbyte > *, jint) = 0;
public:
  static ::java::lang::String * DIRECTION;
public: // actually protected
  ::gnu::javax::crypto::assembly::Direction * __attribute__((aligned(__alignof__( ::java::lang::Object)))) forward;
  ::gnu::javax::crypto::assembly::Direction * wired;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_javax_crypto_assembly_Stage__
