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

#ifndef __gnu_CORBA_DynAn_gnuDynEnum__
#define __gnu_CORBA_DynAn_gnuDynEnum__

#pragma interface

#include <gnu/CORBA/DynAn/UndivideableAny.h>
#include <gcj/array.h>

extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace DynAn
      {
          class gnuDynAnyFactory;
          class gnuDynEnum;
      }
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Any;
          class ORB;
          class TypeCode;
      }
      namespace DynamicAny
      {
          class DynAny;
      }
    }
  }
}

class gnu::CORBA::DynAn::gnuDynEnum : public ::gnu::CORBA::DynAn::UndivideableAny
{

public:
  gnuDynEnum(::org::omg::CORBA::TypeCode *, ::org::omg::CORBA::TypeCode *, ::gnu::CORBA::DynAn::gnuDynAnyFactory *, ::org::omg::CORBA::ORB *);
  gnuDynEnum(::gnu::CORBA::DynAn::gnuDynEnum *);
  virtual void assign(::org::omg::DynamicAny::DynAny *);
  virtual ::org::omg::DynamicAny::DynAny * copy();
  virtual jboolean equal(::org::omg::DynamicAny::DynAny *);
  virtual void from_any(::org::omg::CORBA::Any *);
  virtual ::java::lang::String * get_as_string();
  virtual jint get_as_ulong();
  virtual void set_as_string(::java::lang::String *);
  virtual void set_as_ulong(jint);
  virtual ::org::omg::CORBA::Any * to_any();
private:
  static const jlong serialVersionUID = 1LL;
public: // actually package-private
  JArray< ::java::lang::String * > * __attribute__((aligned(__alignof__( ::gnu::CORBA::DynAn::UndivideableAny)))) values;
  jint current;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_DynAn_gnuDynEnum__
