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

#ifndef __gnu_CORBA_Poa_AOM__
#define __gnu_CORBA_Poa_AOM__

#pragma interface

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

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace Poa
      {
          class AOM;
          class AOM$Obj;
          class ServantDelegateImpl;
          class gnuPOA;
          class gnuServantObject;
      }
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Object;
      }
      namespace PortableServer
      {
          class Servant;
      }
    }
  }
}

class gnu::CORBA::Poa::AOM : public ::java::lang::Object
{

public:
  AOM();
  virtual ::gnu::CORBA::Poa::AOM$Obj * findObject(::org::omg::CORBA::Object *);
  virtual ::gnu::CORBA::Poa::AOM$Obj * findServant(::org::omg::PortableServer::Servant *);
  virtual ::gnu::CORBA::Poa::AOM$Obj * findServant(::org::omg::PortableServer::Servant *, jboolean);
  virtual ::gnu::CORBA::Poa::AOM$Obj * add(::gnu::CORBA::Poa::gnuServantObject *, ::org::omg::PortableServer::Servant *, ::gnu::CORBA::Poa::gnuPOA *);
  virtual ::gnu::CORBA::Poa::AOM$Obj * add(JArray< jbyte > *, ::gnu::CORBA::Poa::gnuServantObject *, ::org::omg::PortableServer::Servant *, ::gnu::CORBA::Poa::gnuPOA *);
  virtual ::gnu::CORBA::Poa::AOM$Obj * add(::gnu::CORBA::Poa::ServantDelegateImpl *);
  virtual void put(::gnu::CORBA::Poa::AOM$Obj *);
  virtual ::gnu::CORBA::Poa::AOM$Obj * get(JArray< jbyte > *);
  virtual ::java::util::Set * keySet();
  virtual void remove(JArray< jbyte > *);
public: // actually protected
  virtual JArray< jbyte > * generateObjectKey(::org::omg::CORBA::Object *);
public:
  static JArray< jbyte > * getFreeId();
private:
  static jlong free_id;
public: // actually package-private
  ::java::util::Map * __attribute__((aligned(__alignof__( ::java::lang::Object)))) objects;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_Poa_AOM__
