summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp469
1 files changed, 469 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp
new file mode 100644
index 00000000000..e336c230fa1
--- /dev/null
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ci.cpp
@@ -0,0 +1,469 @@
+//
+// $Id$
+//
+
+// ============================================================================
+//
+// = LIBRARY
+// TAO IDL
+//
+// = FILENAME
+// sequence_ci.cpp
+//
+// = DESCRIPTION
+// Visitor generating code for Sequence in the client inline file
+//
+// = AUTHOR
+// Aniruddha Gokhale
+//
+// ============================================================================
+
+#include "idl.h"
+#include "idl_extern.h"
+#include "be.h"
+
+#include "be_visitor_sequence.h"
+
+
+// ***********************************************************
+// sequence visitor for inline generation
+// ***********************************************************
+
+
+be_visitor_sequence_ci::be_visitor_sequence_ci (be_visitor_context *ctx)
+ : be_visitor_decl (ctx)
+{
+}
+
+be_visitor_sequence_ci::~be_visitor_sequence_ci (void)
+{
+}
+
+int
+be_visitor_sequence_ci::visit_sequence (be_sequence *node)
+{
+ TAO_OutStream *os = this->ctx_->stream ();
+
+ if (node->cli_inline_gen () || node->imported ())
+ return 0;
+
+ // all we do is generate the _var and _out implementations
+ if (this->gen_var_impl (node) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_sequence_ci::"
+ "visit_sequence - "
+ "codegen for _var failed\n"), -1);
+ }
+
+ if (this->gen_out_impl (node) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_sequence_ci::"
+ "visit_sequence - "
+ "codegen for _out failed\n"), -1);
+ }
+
+ return 0;
+}
+
+int
+be_visitor_sequence_ci::gen_var_impl (be_sequence *node)
+{
+ TAO_OutStream *os; // output stream
+ char fname [NAMEBUFSIZE]; // to hold the full and
+ char lname [NAMEBUFSIZE]; // local _var names
+ be_type *bt; // base type
+
+
+ ACE_OS::memset (fname, '\0', NAMEBUFSIZE);
+ ACE_OS::sprintf (fname, "%s_var", node->fullname ());
+
+ ACE_OS::memset (lname, '\0', NAMEBUFSIZE);
+ ACE_OS::sprintf (lname, "%s_var", node->local_name ()->get_string ());
+
+ os = this->ctx_->stream ();
+
+ // retrieve base type
+ bt = be_type::narrow_from_decl (node->base_type ());
+ if (!bt)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_sequence_ci::"
+ "visit_sequence - "
+ "Bad element type\n"), -1);
+ }
+
+ // generate the var implementation in the inline file
+ os->indent (); // start with whatever was our current indent level
+
+ *os << "// *************************************************************"
+ << be_nl;
+ *os << "// Inline operations for class " << fname << be_nl;
+ *os << "// *************************************************************\n\n";
+
+ // default constr
+ *os << "ACE_INLINE" << be_nl
+ << fname << "::" << lname
+ << " (void) // default constructor" << be_nl
+ << " " << ": ptr_ (0)" << be_nl
+ << "{}\n\n";
+
+ // constr from a _ptr
+ os->indent ();
+ *os << "ACE_INLINE" << be_nl;
+ *os << fname << "::" << lname << " (" << node->name () << " *p)" << be_nl;
+ *os << " : ptr_ (p)" << be_nl;
+ *os << "{}\n\n";
+
+ // copy constructor
+ os->indent ();
+ *os << "ACE_INLINE" << be_nl;
+ *os << fname << "::" << lname << " (const " << fname <<
+ " &p) // copy constructor" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "if (p.ptr_)" << be_nl;
+ *os << " this->ptr_ = new " << node->name () << "(*p.ptr_);" << be_nl;
+ *os << "else" << be_nl;
+ *os << " this->ptr_ = 0;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // destructor
+ os->indent ();
+ *os << "ACE_INLINE" << be_nl;
+ *os << fname << "::~" << lname << " (void) // destructor" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "delete this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // assignment operator from a pointer
+ os->indent ();
+ *os << "ACE_INLINE " << fname << " &" << be_nl;
+ *os << fname << "::operator= (" << node->name () <<
+ " *p)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "delete this->ptr_;" << be_nl;
+ *os << "this->ptr_ = p;" << be_nl;
+ *os << "return *this;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // assignment operator from _var
+ os->indent ();
+ *os << "ACE_INLINE " << fname << " &" << be_nl;
+ *os << fname << "::operator= (const " << fname <<
+ " &p) // deep copy" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "if (this != &p)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "delete this->ptr_;" << be_nl;
+ *os << "this->ptr_ = new " << node->name () << " (*p.ptr_);\n";
+ os->decr_indent ();
+ *os << "}" << be_nl;
+ *os << "return *this;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // two arrow operators
+ os->indent ();
+ *os << "ACE_INLINE const " << node->name () << " *" << be_nl;
+ *os << fname << "::operator-> (void) const" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ os->indent ();
+ *os << "ACE_INLINE " << node->name () << " *" << be_nl;
+ *os << fname << "::operator-> (void)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // other extra methods - 3 cast operator ()
+ os->indent ();
+ *os << "ACE_INLINE " << be_nl;
+ *os << fname << "::operator const " << node->name () <<
+ " &() const // cast" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return *this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ os->indent ();
+ *os << "ACE_INLINE " << be_nl;
+ *os << fname << "::operator " << node->name () << " &() // cast " << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return *this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ os->indent ();
+ *os << "ACE_INLINE " << be_nl;
+ *os << fname << "::operator " << node->name () << " &() const// cast " << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return *this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // operator []
+ os->indent ();
+ *os << "ACE_INLINE ";
+
+ be_visitor_context ctx (*this->ctx_);
+ ctx.state (TAO_CodeGen::TAO_SEQELEM_RETTYPE_CI);
+ be_visitor *visitor = tao_cg->make_visitor (&ctx);
+ if (!visitor)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_sequence_ci::"
+ "gen_var_impl - "
+ "Bad visitor\n"), -1);
+ }
+
+ if (bt->accept (visitor) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_sequence_ci::"
+ "gen_var_impl - "
+ "[] ret type gen failed\n"),
+ -1);
+ }
+ delete visitor;
+
+ *os << be_nl;
+ *os << fname << "::operator[] (CORBA::ULong index)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return this->ptr_->operator[] (index);\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // in, inout, out, and _retn
+ os->indent ();
+ *os << "ACE_INLINE const " << node->name () << " &" << be_nl;
+ *os << fname << "::in (void) const" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return *this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ os->indent ();
+ *os << "ACE_INLINE " << node->name () << " &" << be_nl;
+ *os << fname << "::inout (void)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return *this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ os->indent ();
+ *os << "// mapping for variable size " << be_nl;
+ *os << "ACE_INLINE " << node->name () << " *&" << be_nl;
+ *os << fname << "::out (void)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "delete this->ptr_;" << be_nl;
+ *os << "this->ptr_ = 0;" << be_nl;
+ *os << "return this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ os->indent ();
+ *os << "ACE_INLINE " << node->name () << " *" << be_nl;
+ *os << fname << "::_retn (void)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << node->name () << " *tmp = this->ptr_;" << be_nl;
+ *os << "this->ptr_ = 0;" << be_nl;
+ *os << "return tmp;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // the additional ptr () member function
+ os->indent ();
+ *os << "ACE_INLINE " << node->name () << " *" << be_nl;
+ *os << fname << "::ptr (void) const" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ return 0;
+}
+
+int
+be_visitor_sequence_ci::gen_out_impl (be_sequence *node)
+{
+ TAO_OutStream *os; // output stream
+ char fname [NAMEBUFSIZE]; // to hold the full and
+ char lname [NAMEBUFSIZE]; // local _out names
+ be_type *bt; // base type
+
+
+ ACE_OS::memset (fname, '\0', NAMEBUFSIZE);
+ ACE_OS::sprintf (fname, "%s_out", node->fullname ());
+
+ ACE_OS::memset (lname, '\0', NAMEBUFSIZE);
+ ACE_OS::sprintf (lname, "%s_out", node->local_name ()->get_string ());
+
+ os = this->ctx_->stream ();
+
+ // retrieve base type
+ bt = be_type::narrow_from_decl (node->base_type ());
+ if (!bt)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_sequence_ci::"
+ "gen_out_impl - "
+ "Bad element type\n"), -1);
+ }
+
+ // generate the out implementation in the inline file
+
+ os->indent (); // start with whatever was our current indent level
+
+ *os << "// *************************************************************"
+ << be_nl;
+ *os << "// Inline operations for class " << fname << be_nl;
+ *os << "// *************************************************************\n\n";
+
+ // constr from a pointer
+ os->indent ();
+ *os << "ACE_INLINE" << be_nl;
+ *os << fname << "::" << lname << " (" << node->name () << " *&p)" << be_nl;
+ *os << " : ptr_ (p)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "this->ptr_ = 0;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // constructor from _var &
+ os->indent ();
+ *os << "ACE_INLINE" << be_nl;
+ *os << fname << "::" << lname << " (" << node->name () <<
+ "_var &p) // constructor from _var" << be_nl;
+ *os << " : ptr_ (p.out ())" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "delete this->ptr_;" << be_nl;
+ *os << "this->ptr_ = 0;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // copy constructor
+ os->indent ();
+ *os << "ACE_INLINE" << be_nl;
+ *os << fname << "::" << lname << " (" << fname <<
+ " &p) // copy constructor" << be_nl;
+ *os << " : ptr_ (p.ptr_)" << be_nl;
+ *os << "{}\n\n";
+
+ // assignment operator from _out &
+ os->indent ();
+ *os << "ACE_INLINE " << fname << " &" << be_nl;
+ *os << fname << "::operator= (" << fname <<
+ " &p)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "this->ptr_ = p.ptr_;" << be_nl;
+ *os << "return *this;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // assignment from _var is not allowed by a private declaration
+
+ // assignment operator from pointer
+ os->indent ();
+ *os << "ACE_INLINE " << fname << " &" << be_nl;
+ *os << fname << "::operator= (" << node->name () <<
+ " *p)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "this->ptr_ = p;" << be_nl;
+ *os << "return *this;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // other extra methods - cast operator ()
+ os->indent ();
+ *os << "ACE_INLINE " << be_nl;
+ *os << fname << "::operator " << node->name () <<
+ " *&() // cast" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // ptr function
+ os->indent ();
+ *os << "ACE_INLINE " << node->name () << " *&" << be_nl;
+ *os << fname << "::ptr (void) // ptr" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // operator ->
+ os->indent ();
+ *os << "ACE_INLINE " << node->name () << " *" << be_nl;
+ *os << fname << "::operator-> (void)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return this->ptr_;\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ // sequence has an additional method
+ os->indent ();
+ *os << "ACE_INLINE ";
+
+ be_visitor_context ctx (*this->ctx_);
+ ctx.state (TAO_CodeGen::TAO_SEQELEM_RETTYPE_CI);
+ be_visitor *visitor = tao_cg->make_visitor (&ctx);
+ if (!visitor)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_sequence_ci::"
+ "gen_out_impl - "
+ "Bad visitor\n"), -1);
+ }
+
+ if (bt->accept (visitor) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_sequence_ci::"
+ "gen_out_impl - "
+ "[] ret type gen failed\n"),
+ -1);
+ }
+ delete visitor;
+
+ *os << be_nl;
+ *os << fname << "::operator[] (CORBA::ULong index)" << be_nl;
+ *os << "{\n";
+ os->incr_indent ();
+ *os << "return this->ptr_->operator[] (index);\n";
+ os->decr_indent ();
+ *os << "}\n\n";
+
+ return 0;
+}