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

#ifndef __gnu_CORBA_DynAn_gnuDynValueBox__
#define __gnu_CORBA_DynAn_gnuDynValueBox__

#pragma interface

#include <gnu/CORBA/DynAn/DivideableAny.h>
extern "Java"
{
  namespace gnu
  {
    namespace CORBA
    {
      namespace DynAn
      {
          class gnuDynAnyFactory;
          class gnuDynValueBox;
      }
    }
  }
  namespace org
  {
    namespace omg
    {
      namespace CORBA
      {
          class Any;
          class ORB;
          class TypeCode;
      }
      namespace DynamicAny
      {
          class DynAny;
      }
    }
  }
}

class gnu::CORBA::DynAn::gnuDynValueBox : public ::gnu::CORBA::DynAn::DivideableAny
{

public:
  gnuDynValueBox(::org::omg::CORBA::TypeCode *, ::org::omg::CORBA::TypeCode *, ::gnu::CORBA::DynAn::gnuDynAnyFactory *, ::org::omg::CORBA::ORB *);
  virtual void assign(::org::omg::DynamicAny::DynAny *);
  virtual ::org::omg::DynamicAny::DynAny * copy();
  virtual ::org::omg::DynamicAny::DynAny * current_component();
  virtual jboolean equal(::org::omg::DynamicAny::DynAny *);
  virtual void from_any(::org::omg::CORBA::Any *);
  virtual ::org::omg::CORBA::Any * get_boxed_value();
  virtual ::org::omg::DynamicAny::DynAny * get_boxed_value_as_dyn_any();
  virtual ::java::io::Serializable * get_val();
  virtual void insert_val(::java::io::Serializable *);
  virtual jboolean is_null();
  virtual void set_boxed_value(::org::omg::CORBA::Any *);
  virtual void set_boxed_value_as_dyn_any(::org::omg::DynamicAny::DynAny *);
  virtual void set_to_null();
  virtual void set_to_value();
  virtual ::org::omg::CORBA::Any * to_any();
private:
  static const jlong serialVersionUID = 1LL;
public: // actually package-private
  ::org::omg::CORBA::TypeCode * __attribute__((aligned(__alignof__( ::gnu::CORBA::DynAn::DivideableAny)))) content;
  ::java::lang::String * CONTENT;
public:
  static ::java::lang::Class class$;
};

#endif // __gnu_CORBA_DynAn_gnuDynValueBox__
