summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp169
1 files changed, 142 insertions, 27 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp
index fe8df12a2da..ead93407e9b 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp
@@ -18,8 +18,8 @@
// ***************************************************************************
be_visitor_sequence_any_op_cs::be_visitor_sequence_any_op_cs (
- be_visitor_context *ctx
- )
+ be_visitor_context *ctx
+ )
: be_visitor_decl (ctx)
{
}
@@ -88,21 +88,21 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node)
switch (tc)
{
- case ANY_OBJREF:
- *os << "insert_objref_vector<"
- << bt->full_name () << "_ptr> (";
+ case ANY_OBJREF:
+ *os << "insert_objref_vector<"
+ << bt->full_name () << "_ptr> (";
- break;
- case ANY_ARRAY:
- *os << "insert_array_vector<"
- << bt->full_name () << "_forany> (";
+ break;
+ case ANY_ARRAY:
+ *os << "insert_array_vector<"
+ << bt->full_name () << "_forany> (";
- break;
- default:
- *os << "insert_value_vector<"
- << bt->full_name () << "> (";
+ break;
+ default:
+ *os << "insert_value_vector<"
+ << bt->full_name () << "> (";
- break;
+ break;
}
*os << be_idt_nl
@@ -121,21 +121,21 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node)
switch (tc)
{
- case ANY_OBJREF:
- *os << "extract_objref_vector<"
- << bt->full_name () << "_ptr> (";
+ case ANY_OBJREF:
+ *os << "extract_objref_vector<"
+ << bt->full_name () << "_ptr> (";
- break;
- case ANY_ARRAY:
- *os << "extract_array_vector<"
- << bt->full_name () << "_forany> (";
+ break;
+ case ANY_ARRAY:
+ *os << "extract_array_vector<"
+ << bt->full_name () << "_forany> (";
- break;
- default:
- *os << "extract_value_vector<"
- << bt->full_name () << "> (";
+ break;
+ default:
+ *os << "extract_value_vector<"
+ << bt->full_name () << "> (";
- break;
+ break;
}
*os << be_idt_nl
@@ -178,11 +178,121 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node)
<< "}" << be_uidt_nl
<< "}" << be_nl;
}
-
+
+ *os << be_global->core_versioning_end () << be_nl;
+
// If this is non-zero, we want to call its tc_name()
// for the TypeCode to pass to the Any operator impls.
be_typedef *td = this->ctx_->tdef ();
+ be_module *module = 0;
+ if (node->is_nested ())
+ {
+ AST_Decl *d = node;
+ AST_Decl::NodeType nt = d->node_type ();
+
+ while (nt != AST_Decl::NT_root)
+ {
+ if (nt == AST_Decl::NT_module)
+ {
+ module = be_module::narrow_from_decl (d);
+ break;
+ }
+ else
+ {
+ d = ScopeAsDecl (d->defined_in ());
+ nt = d->node_type ();
+ }
+ }
+
+ if (module != 0)
+ {
+ // Some compilers handle "any" operators in a namespace
+ // corresponding to their module, others do not.
+ *os << "\n\n#if defined (ACE_ANY_OPS_USE_NAMESPACE)\n";
+
+ be_util::gen_nested_namespace_begin (os, module);
+
+ // Copying insertion.
+ *os << be_nl
+ << "// Copying insertion." << be_nl
+ << "void operator<<= (" << be_idt << be_idt_nl
+ << "::CORBA::Any &_tao_any," << be_nl
+ << "const ::" << node->name () << " &_tao_elem" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << "{" << be_idt_nl
+
+ << "if (0 == &_tao_elem) // Trying to de-reference NULL object"
+ << be_idt_nl
+ << "_tao_any <<= static_cast< ::" << node->name ()
+ << " *>( 0 ); // Use non-copying insertion of a NULL" << be_uidt_nl
+ << "else" << be_idt_nl
+
+ << "TAO::Any_Dual_Impl_T< ::" << node->name () << ">::insert_copy ("
+ << be_idt << be_idt_nl
+ << "_tao_any," << be_nl
+ << "::" << node->name () << "::_tao_any_destructor," << be_nl
+ << "::" << (td != 0 ? td->tc_name () : node->tc_name ()) << "," << be_nl
+ << "_tao_elem" << be_uidt_nl
+ << ");" << be_uidt << be_uidt << be_uidt_nl
+ << "}" << be_nl << be_nl;
+
+ // Non-copying insertion.
+ *os << "// Non-copying insertion." << be_nl
+ << "void operator<<= (" << be_idt << be_idt_nl
+ << "::CORBA::Any &_tao_any," << be_nl
+ << "::" << node->name () << " *_tao_elem" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << "{" << be_idt_nl
+ << "TAO::Any_Dual_Impl_T< ::" << node->name () << ">::insert ("
+ << be_idt << be_idt_nl
+ << "_tao_any," << be_nl
+ << "::" << node->name () << "::_tao_any_destructor," << be_nl
+ << "::" << (td != 0 ? td->tc_name () : node->tc_name ()) << "," << be_nl
+ << "_tao_elem" << be_uidt_nl
+ << ");" << be_uidt << be_uidt_nl
+ << "}" << be_nl << be_nl;
+
+ // Extraction to non-const pointer (deprecated, just calls the other).
+ *os << "// Extraction to non-const pointer (deprecated)." << be_nl
+ << "::CORBA::Boolean operator>>= (" << be_idt << be_idt_nl
+ << "const ::CORBA::Any &_tao_any," << be_nl
+ << "::" << node->name () << " *&_tao_elem" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << "{" << be_idt_nl
+ << "return _tao_any >>= const_cast<" << be_idt << be_idt_nl
+ << "const ::" << node->name () << " *&> (" << be_nl
+ << "_tao_elem" << be_uidt_nl
+ << ");" << be_uidt << be_uidt_nl
+ << "}" << be_nl << be_nl;
+
+ // Extraction to const pointer.
+ *os << "// Extraction to const pointer." << be_nl
+ << "::CORBA::Boolean operator>>= (" << be_idt << be_idt_nl
+ << "const ::CORBA::Any &_tao_any," << be_nl
+ << "const ::" << node->name () << " *&_tao_elem" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << "{" << be_idt_nl
+ << "return" << be_idt_nl
+ << "TAO::Any_Dual_Impl_T< ::" << node->name () << ">::extract ("
+ << be_idt << be_idt_nl
+ << "_tao_any," << be_nl
+ << "::" << node->name () << "::_tao_any_destructor," << be_nl
+ << "::" << (td != 0 ? td->tc_name () : node->tc_name ()) << "," << be_nl
+ << "_tao_elem" << be_uidt_nl
+ << ");" << be_uidt << be_uidt << be_uidt_nl
+ << "}";
+
+ be_util::gen_nested_namespace_end (os, module);
+
+ // Emit #else.
+ *os << be_nl << be_nl
+ << "#else\n\n";
+ }
+ }
+
+ *os << be_global->core_versioning_begin () << be_nl;
+
// Copying insertion.
*os << be_nl
<< "// Copying insertion." << be_nl
@@ -254,6 +364,11 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node)
<< "}";
*os << be_global->core_versioning_end () << be_nl;
+
+ if (module != 0)
+ {
+ *os << "\n\n#endif";
+ }
node->cli_stub_any_op_gen (true);
return 0;