summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_interface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_interface.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_interface.cpp b/TAO/TAO_IDL/be/be_visitor_interface.cpp
index 6dea0191d48..5d391f6766b 100644
--- a/TAO/TAO_IDL/be/be_visitor_interface.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_interface.cpp
@@ -733,6 +733,21 @@ be_visitor_interface_ch::visit_interface (be_interface *node)
os->gen_endif ();
+ // generate the Any <<= and >>= operators
+ os->indent ();
+ if (node->is_nested ())
+ *os << "friend ";
+ *os << "void operator<<= (CORBA::Any &, " << node->local_name ()
+ << "_ptr); // copying version" << be_nl;
+ if (node->is_nested ())
+ *os << "friend ";
+ *os << "void operator<<= (CORBA::Any &, " << node->local_name ()
+ << "_ptr *); // noncopying version" << be_nl;
+ if (node->is_nested ())
+ *os << "friend ";
+ *os << "CORBA::Boolean operator>>= (const CORBA::Any &, "
+ << node->local_name () << "_ptr &);\n";
+
// generate the typecode decl. If we are in the outermost scope, our typecode
// decl is extern
if (node->is_nested ())
@@ -966,6 +981,46 @@ be_visitor_interface_cs::visit_interface (be_interface *node)
<< "return \"" << node->repoID () << "\";" << be_uidt_nl
<< "}\n\n";
+ // Any <<= and >>= operators
+ os->indent ();
+ *os << "void operator<<= (CORBA::Any &_tao_any, "
+ << node->name () << "_ptr _tao_elem) // copying" << be_nl
+ << "{" << be_idt_nl
+ << "CORBA::Environment _tao_env;" << be_nl
+ << "_tao_any.replace (" << node->tc_name () << ", &"
+ << "_tao_elem, 1, _tao_env);" << be_uidt_nl
+ << "}" << be_nl;
+
+ *os << "void operator<<= (CORBA::Any &_tao_any, "
+ << node->name () << "_ptr *_tao_elem) // non copying" << be_nl
+ << "{" << be_idt_nl
+ << "CORBA::Environment _tao_env;" << be_nl
+ << "_tao_any.replace (" << node->tc_name () << ", "
+ << "_tao_elem, 0, _tao_env);" << be_uidt_nl
+ << "}" << be_nl;
+
+ *os << "CORBA::Boolean operator>>= (const CORBA::Any &_tao_any, "
+ << node->name () << "_ptr *&_tao_elem)" << be_nl
+ << "{" << be_idt_nl
+ << "CORBA::Environment _tao_env;" << be_nl
+ << "*_tao_elem = " << node->name () << "::_nil ();" << be_nl
+ << "if (!_tao_any.type ()->equal (" << node->tc_name ()
+ << ", _tao_env)) return 0; // not equal" << be_nl
+ << "TAO_InputCDR stream ((ACE_Message_Block *)_tao_any.value ());"
+ << be_nl
+ << "CORBA::Object_ptr _tao_obj;" << be_nl
+ << "if (stream.decode (" << node->tc_name ()
+ << ", &_tao_obj, 0, _tao_env)" << be_nl
+ << " == CORBA::TypeCode::TRAVERSE_CONTINUE)" << be_nl
+ << "{" << be_idt_nl
+ << "*_tao_elem = " << node->name () << "::_narrow (_tao_obj, _tao_env);"
+ << be_nl
+ << "CORBA::release (_tao_obj);" << be_nl
+ << "if (_tao_env.exception ()) return 0; // narrow failed" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "}\n\n";
+
+ os->indent ();
// generate the typecode information here
os->indent (); // start from current indentation level
*os << "static const CORBA::Long _oc_" << node->flatname () << "[] =" <<