summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_valuetype_fwd.cpp
diff options
context:
space:
mode:
authorcoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-05-06 18:24:48 +0000
committercoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-05-06 18:24:48 +0000
commitbeb659d170f11599dff5d6909454a2b319649f66 (patch)
treefdc6756cd69e04ed291adfed799ffa0e5cd99fc9 /TAO/TAO_IDL/be/be_valuetype_fwd.cpp
parente5fcba7c88779c95ff864111bf5a54bbfb4028f5 (diff)
downloadATCD-beb659d170f11599dff5d6909454a2b319649f66.tar.gz
ChangeLogTag:Thu May 6 12:11:22 1999 Carlos O'Ryan <coryan@cs.wustl.edu>
Diffstat (limited to 'TAO/TAO_IDL/be/be_valuetype_fwd.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_valuetype_fwd.cpp529
1 files changed, 529 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_valuetype_fwd.cpp b/TAO/TAO_IDL/be/be_valuetype_fwd.cpp
new file mode 100644
index 00000000000..843b8c24a1d
--- /dev/null
+++ b/TAO/TAO_IDL/be/be_valuetype_fwd.cpp
@@ -0,0 +1,529 @@
+// $Id$
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO IDL
+//
+// = FILENAME
+// be_valuetype_fwd.h
+//
+// = DESCRIPTION
+// Extension of class be_interface_fwd that provides additional
+// means for C++ mapping of an valuetype.
+//
+// = AUTHOR
+// Copyright 1994-1995 by Sun Microsystems, Inc.
+// and
+// Aniruddha Gokhale
+// changed for valuetypes by Torsten Kuepper <kuepper2@lfa.uni-wuppertal.de>
+//
+// ============================================================================
+
+
+#include "idl.h"
+#include "idl_extern.h"
+#include "be.h"
+
+#ifdef IDL_HAS_VALUETYPE
+
+ACE_RCSID(be, be_interface_fwd, "$Id$")
+
+/*
+ * BE_ValuetypeFwd
+ */
+
+
+be_valuetype_fwd::be_valuetype_fwd (void)
+{
+}
+
+be_valuetype_fwd::be_valuetype_fwd (AST_Interface *dummy,
+ UTL_ScopedName *n, UTL_StrList *p)
+ : be_interface_fwd (dummy, n, p),
+ AST_InterfaceFwd (dummy, n, p),
+ AST_Decl (AST_Decl::NT_interface_fwd, n, p)
+{
+}
+
+be_valuetype_fwd::~be_valuetype_fwd (void)
+{
+}
+
+
+void
+be_valuetype_fwd::set_abstract_valuetype ()
+{
+ this->full_definition()->set_abstract_valuetype();
+};
+
+// generate the var definition
+int
+be_valuetype_fwd::gen_var_defn (void)
+{
+ ACE_ASSERT (0);
+ TAO_OutStream *ch; // output stream
+ TAO_NL nl; // end line
+ char namebuf [NAMEBUFSIZE]; // names
+
+ ACE_OS::memset (namebuf, '\0', NAMEBUFSIZE);
+ ACE_OS::sprintf (namebuf, "%s_var", this->local_name ()->get_string ());
+
+ // retrieve a singleton instance of the code generator
+ TAO_CodeGen *cg = TAO_CODEGEN::instance ();
+
+ ch = cg->client_header ();
+
+ // generate the var definition (always in the client header).
+ // Depending upon the data type, there are some differences which we account
+ // for over here.
+
+ ch->indent (); // start with whatever was our current indent level
+ *ch << "class " << idl_global->export_macro ()
+ << " " << namebuf << nl;
+ *ch << "{" << nl;
+ *ch << "public:\n";
+ ch->incr_indent ();
+
+ // default constr
+ *ch << namebuf << " (void); // default constructor" << nl;
+ *ch << namebuf << " (" << local_name () << "_ptr);" << nl;
+
+ // copy constructor
+ *ch << namebuf << " (const " << namebuf <<
+ " &); // copy constructor" << nl;
+
+ // destructor
+ *ch << "~" << namebuf << " (void); // destructor" << nl;
+ *ch << nl;
+
+ // assignment operator from a pointer
+ *ch << namebuf << " &operator= (" << local_name () << "_ptr);" << nl;
+
+ // assignment from _var
+ *ch << namebuf << " &operator= (const " << namebuf <<
+ " &);" << nl;
+
+ // arrow operator
+ *ch << local_name () << "_ptr operator-> (void) const;" << nl;
+
+ *ch << nl;
+
+ // other extra types (cast operators, [] operator, and others)
+ *ch << "operator const " << local_name () << "_ptr &() const;" << nl;
+ *ch << "operator " << local_name () << "_ptr &();" << nl;
+
+ *ch << "// in, inout, out, _retn " << nl;
+ // the return types of in, out, inout, and _retn are based on the parameter
+ // passing rules and the base type
+ *ch << local_name () << "_ptr in (void) const;" << nl;
+ *ch << local_name () << "_ptr &inout (void);" << nl;
+ *ch << local_name () << "_ptr &out (void);" << nl;
+ *ch << local_name () << "_ptr _retn (void);" << nl;
+
+ // generate an additional member function that returns the underlying pointer
+ *ch << local_name () << "_ptr ptr (void) const;\n";
+
+ *ch << "\n";
+ ch->decr_indent ();
+
+ // private
+ *ch << "private:\n";
+ ch->incr_indent ();
+ *ch << local_name () << "_ptr ptr_;\n";
+
+ ch->decr_indent ();
+ *ch << "};\n\n";
+
+ return 0;
+}
+
+// implementation of the _var class. All of these get generated in the inline
+// file
+int
+be_valuetype_fwd::gen_var_impl (void)
+{
+ ACE_ASSERT (0);
+ TAO_OutStream *ci; // output stream
+ TAO_NL nl; // end line
+ char fname [NAMEBUFSIZE]; // to hold the full and
+ char lname [NAMEBUFSIZE]; // local _var names
+
+ ACE_OS::memset (fname, '\0', NAMEBUFSIZE);
+ ACE_OS::sprintf (fname, "%s_var", this->fullname ());
+
+ ACE_OS::memset (lname, '\0', NAMEBUFSIZE);
+ ACE_OS::sprintf (lname, "%s_var", local_name ()->get_string ());
+
+ // retrieve a singleton instance of the code generator
+ TAO_CodeGen *cg = TAO_CODEGEN::instance ();
+
+ ci = cg->client_inline ();
+
+ // generate the var implementation in the inline file
+ // Depending upon the data type, there are some differences which we account
+ // for over here.
+
+ ci->indent (); // start with whatever was our current indent level
+
+ *ci << "// *************************************************************"
+ << nl;
+ *ci << "// Inline operations for class " << fname << nl;
+ *ci << "// *************************************************************\n\n";
+
+ // default constr
+ *ci << "ACE_INLINE" << nl;
+ *ci << fname << "::" << lname <<
+ " (void) // default constructor" << nl;
+ *ci << " " << ": ptr_ (" << this->name () << "::_nil ())" << nl;
+ *ci << "{}\n\n";
+
+ // constr from a _ptr
+ ci->indent ();
+ *ci << "ACE_INLINE" << nl;
+ *ci << fname << "::" << lname << " (" << name () << "_ptr p)" << nl;
+ *ci << " : ptr_ (p)" << nl;
+ *ci << "{}\n\n";
+
+ // the additional ptr () member function. This member function must be
+ // defined before the remaining member functions including the copy
+ // constructor because this inline function is used elsewhere. Hence to make
+ // inlining of this function possible, we must define it before its use.
+ ci->indent ();
+ *ci << "ACE_INLINE " << name () << "_ptr " << nl;
+ *ci << fname << "::ptr (void) const" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "return this->ptr_;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // copy constructor
+ ci->indent ();
+ *ci << "ACE_INLINE" << nl;
+ *ci << fname << "::" << lname << " (const " << fname <<
+ " &p) // copy constructor" << nl;
+ *ci << " : ptr_ (" << name () << "::_duplicate (p.ptr ()))" << nl;
+ *ci << "{}\n\n";
+
+ // destructor
+ ci->indent ();
+ *ci << "ACE_INLINE" << nl;
+ *ci << fname << "::~" << lname << " (void) // destructor" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "CORBA::release (this->ptr_);\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // assignment operator
+ ci->indent ();
+ *ci << "ACE_INLINE " << fname << " &" << nl;
+ *ci << fname << "::operator= (" << name () <<
+ "_ptr p)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "CORBA::release (this->ptr_);" << nl;
+ *ci << "this->ptr_ = p;" << nl;
+ *ci << "return *this;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // assignment operator from _var
+ ci->indent ();
+ *ci << "ACE_INLINE " << fname << " &" << nl;
+ *ci << fname << "::operator= (const " << fname <<
+ " &p)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "if (this != &p)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "CORBA::release (this->ptr_);" << nl;
+ *ci << "this->ptr_ = " << name () << "::_duplicate (p.ptr ());\n";
+ ci->decr_indent ();
+ *ci << "}" << nl;
+ *ci << "return *this;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // other extra methods - cast operator ()
+ ci->indent ();
+ *ci << "ACE_INLINE " << nl;
+ *ci << fname << "::operator const " << name () <<
+ "_ptr &() const // cast" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "return this->ptr_;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ ci->indent ();
+ *ci << "ACE_INLINE " << nl;
+ *ci << fname << "::operator " << name () << "_ptr &() // cast " << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "return this->ptr_;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // operator->
+ ci->indent ();
+ *ci << "ACE_INLINE " << name () << "_ptr " << nl;
+ *ci << fname << "::operator-> (void) const" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "return this->ptr_;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // in, inout, out, and _retn
+ ci->indent ();
+ *ci << "ACE_INLINE " << name () << "_ptr" << nl;
+ *ci << fname << "::in (void) const" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "return this->ptr_;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ ci->indent ();
+ *ci << "ACE_INLINE " << name () << "_ptr &" << nl;
+ *ci << fname << "::inout (void)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "return this->ptr_;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ ci->indent ();
+ *ci << "ACE_INLINE " << name () << "_ptr &" << nl;
+ *ci << fname << "::out (void)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "CORBA::release (this->ptr_);" << nl;
+ *ci << "this->ptr_ = " << this->name () << "::_nil ();" << nl;
+ *ci << "return this->ptr_;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ ci->indent ();
+ *ci << "ACE_INLINE " << name () << "_ptr " << nl;
+ *ci << fname << "::_retn (void)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "// yield ownership of managed obj reference" << nl;
+ *ci << this->name () << "_ptr val = this->ptr_;" << nl;
+ *ci << "this->ptr_ = " << this->name () << "::_nil ();" << nl;
+ *ci << "return val;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ return 0;
+}
+
+// generate the _out definition
+int
+be_valuetype_fwd::gen_out_defn (void)
+{
+ ACE_ASSERT (0);
+ TAO_OutStream *ch; // output stream
+ TAO_NL nl; // end line
+ char namebuf [NAMEBUFSIZE]; // to hold the _out name
+
+ ACE_OS::memset (namebuf, '\0', NAMEBUFSIZE);
+ ACE_OS::sprintf (namebuf, "%s_out", local_name ()->get_string ());
+
+ // retrieve a singleton instance of the code generator
+ TAO_CodeGen *cg = TAO_CODEGEN::instance ();
+
+ ch = cg->client_header ();
+
+ // generate the out definition (always in the client header)
+ ch->indent (); // start with whatever was our current indent level
+
+ *ch << "class " << idl_global->export_macro ()
+ << " " << namebuf << nl;
+ *ch << "{" << nl;
+ *ch << "public:\n";
+ ch->incr_indent ();
+
+ // No default constructor
+
+ // constructor from a pointer
+ *ch << namebuf << " (" << local_name () << "_ptr &);" << nl;
+ // constructor from a _var &
+ *ch << namebuf << " (" << local_name () << "_var &);" << nl;
+ // constructor from a _out &
+ *ch << namebuf << " (const " << namebuf << " &);" << nl;
+ // assignment operator from a _out &
+ *ch << namebuf << " &operator= (const " << namebuf << " &);" << nl;
+ // assignment operator from a pointer &, cast operator, ptr fn, operator
+ // -> and any other extra operators
+ // only valuetype allows assignment from var &
+ *ch << namebuf << " &operator= (const " << local_name () << "_var &);" << nl;
+ *ch << namebuf << " &operator= (" << local_name () << "_ptr);" << nl;
+ // cast
+ *ch << "operator " << local_name () << "_ptr &();" << nl;
+ // ptr fn
+ *ch << local_name () << "_ptr &ptr (void);" << nl;
+ // operator ->
+ *ch << local_name () << "_ptr operator-> (void);" << nl;
+
+ *ch << "\n";
+ ch->decr_indent ();
+ *ch << "private:\n";
+ ch->incr_indent ();
+ *ch << local_name () << "_ptr &ptr_;\n";
+
+ ch->decr_indent ();
+ *ch << "};\n\n";
+
+ return 0;
+}
+
+int
+be_valuetype_fwd::gen_out_impl (void)
+{
+ ACE_ASSERT (0);
+ TAO_OutStream *ci; // output stream
+ TAO_NL nl; // end line
+ char fname [NAMEBUFSIZE]; // to hold the full and
+ char lname [NAMEBUFSIZE]; // local _out names
+
+ ACE_OS::memset (fname, '\0', NAMEBUFSIZE);
+ ACE_OS::sprintf (fname, "%s_out", this->fullname ());
+
+ ACE_OS::memset (lname, '\0', NAMEBUFSIZE);
+ ACE_OS::sprintf (lname, "%s_out", local_name ()->get_string ());
+
+ // retrieve a singleton instance of the code generator
+ TAO_CodeGen *cg = TAO_CODEGEN::instance ();
+
+ ci = cg->client_inline ();
+
+ // generate the var implementation in the inline file
+ // Depending upon the data type, there are some differences which we account
+ // for over here.
+
+ ci->indent (); // start with whatever was our current indent level
+
+ *ci << "// *************************************************************"
+ << nl;
+ *ci << "// Inline operations for class " << fname << nl;
+ *ci << "// *************************************************************\n\n";
+
+ // constr from a _ptr
+ ci->indent ();
+ *ci << "ACE_INLINE" << nl;
+ *ci << fname << "::" << lname << " (" << name () << "_ptr &p)" << nl;
+ *ci << " : ptr_ (p)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "this->ptr_ = " << this->name () << "::_nil ();\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // constructor from _var &
+ ci->indent ();
+ *ci << "ACE_INLINE" << nl;
+ *ci << fname << "::" << lname << " (" << this->name () <<
+ "_var &p) // constructor from _var" << nl;
+ *ci << " : ptr_ (p.out ())" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "CORBA::release (this->ptr_);" << nl;
+ *ci << "this->ptr_ = " << this->name () << "::_nil ();\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // copy constructor
+ ci->indent ();
+ *ci << "ACE_INLINE" << nl;
+ *ci << fname << "::" << lname << " (const " << fname <<
+ " &p) // copy constructor" << nl;
+ *ci << " : ptr_ (ACE_const_cast (" << fname
+ << "&,p).ptr_)" << nl;
+ *ci << "{}\n\n";
+
+ // assignment operator from _out &
+ ci->indent ();
+ *ci << "ACE_INLINE " << fname << " &" << nl;
+ *ci << fname << "::operator= (const " << fname <<
+ " &p)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "this->ptr_ = ACE_const_cast (" << fname << "&,p).ptr_;" << nl;
+ *ci << "return *this;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // assignment operator from _var
+ ci->indent ();
+ *ci << "ACE_INLINE " << fname << " &" << nl;
+ *ci << fname << "::operator= (const " << this->name () <<
+ "_var &p)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "this->ptr_ = " << this->name () << "::_duplicate (p.ptr ());" << nl;
+ *ci << "return *this;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // assignment operator from _ptr
+ ci->indent ();
+ *ci << "ACE_INLINE " << fname << " &" << nl;
+ *ci << fname << "::operator= (" << this->name () <<
+ "_ptr p)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "this->ptr_ = p;" << nl;
+ *ci << "return *this;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // other extra methods - cast operator ()
+ ci->indent ();
+ *ci << "ACE_INLINE " << nl;
+ *ci << fname << "::operator " << this->name () <<
+ "_ptr &() // cast" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "return this->ptr_;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // ptr function
+ ci->indent ();
+ *ci << "ACE_INLINE " << this->name () << "_ptr &" << nl;
+ *ci << fname << "::ptr (void) // ptr" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "return this->ptr_;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ // operator->
+ ci->indent ();
+ *ci << "ACE_INLINE " << this->name () << "_ptr " << nl;
+ *ci << fname << "::operator-> (void)" << nl;
+ *ci << "{\n";
+ ci->incr_indent ();
+ *ci << "return this->ptr_;\n";
+ ci->decr_indent ();
+ *ci << "}\n\n";
+
+ return 0;
+}
+
+int
+be_valuetype_fwd::accept (be_visitor *visitor)
+{
+ return visitor->visit_valuetype_fwd (this);
+}
+
+// Narrowing
+IMPL_NARROW_METHODS1 (be_valuetype_fwd, be_interface_fwd)
+IMPL_NARROW_FROM_DECL (be_valuetype_fwd)
+
+#endif /* IDL_HAS_VALUETYPE */