valuetype.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 1,005 行 · 第 1/2 页
CPP
1,005 行
return 0;
}
int
be_visitor_valuetype::visit_structure_fwd (be_structure_fwd *node)
{
// Instantiate a visitor context with a copy of our context. This info
// will be modified based on what type of node we are visiting.
be_visitor_context ctx (*this->ctx_);
ctx.node (node);
int status = 0;
switch (this->ctx_->state ())
{
case TAO_CodeGen::TAO_ROOT_CH:
{
be_visitor_structure_fwd_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
default:
return 0; // nothing to be done
}
if (status == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype::"
"visit_structure_fwd - "
"failed to accept visitor\n"),
-1);
}
return 0;
}
int
be_visitor_valuetype::visit_union (be_union *node)
{
be_visitor_context ctx (*this->ctx_);
ctx.node (node);
int status = 0;
switch (this->ctx_->state ())
{
case TAO_CodeGen::TAO_ROOT_CH:
{
be_visitor_union_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CI:
{
be_visitor_union_ci visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CS:
{
be_visitor_union_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_ANY_OP_CH:
{
be_visitor_union_any_op_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_ANY_OP_CS:
{
be_visitor_union_any_op_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CH:
{
be_visitor_union_cdr_op_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CI:
{
be_visitor_union_cdr_op_ci visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CS:
{
be_visitor_union_cdr_op_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_VALUETYPE_OBV_CH:
case TAO_CodeGen::TAO_VALUETYPE_OBV_CI:
case TAO_CodeGen::TAO_VALUETYPE_OBV_CS:
case TAO_CodeGen::TAO_ROOT_SH:
case TAO_CodeGen::TAO_ROOT_IH:
case TAO_CodeGen::TAO_ROOT_IS:
case TAO_CodeGen::TAO_ROOT_SI:
case TAO_CodeGen::TAO_ROOT_SS:
return 0; // Nothing to be done.
default:
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype::"
"visit_union - "
"Bad context state\n"),
-1);
}
}
if (status == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype::"
"visit_union - "
"failed to accept visitor\n"),
-1);
}
return 0;
}
int
be_visitor_valuetype::visit_union_fwd (be_union_fwd *node)
{
// Instantiate a visitor context with a copy of our context. This info
// will be modified based on what type of node we are visiting.
be_visitor_context ctx (*this->ctx_);
ctx.node (node);
int status = 0;
switch (this->ctx_->state ())
{
case TAO_CodeGen::TAO_ROOT_CH:
{
be_visitor_union_fwd_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
default:
return 0; // nothing to be done
}
if (status == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype::"
"visit_union_fwd - "
"failed to accept visitor\n"),
-1);
}
return 0;
}
int
be_visitor_valuetype::visit_typedef (be_typedef *node)
{
be_visitor_context ctx (*this->ctx_);
ctx.node (node);
int status = 0;
switch (this->ctx_->state ())
{
case TAO_CodeGen::TAO_ROOT_CH:
{
be_visitor_typedef_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CI:
{
be_visitor_typedef_ci visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CS:
{
be_visitor_typedef_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_ANY_OP_CH:
{
be_visitor_typedef_any_op_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_ANY_OP_CS:
{
be_visitor_typedef_any_op_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CH:
{
be_visitor_typedef_cdr_op_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CI:
{
be_visitor_typedef_cdr_op_ci visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CS:
{
be_visitor_typedef_cdr_op_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_VALUETYPE_OBV_CH:
case TAO_CodeGen::TAO_VALUETYPE_OBV_CI:
case TAO_CodeGen::TAO_VALUETYPE_OBV_CS:
case TAO_CodeGen::TAO_ROOT_SH:
case TAO_CodeGen::TAO_ROOT_IH:
case TAO_CodeGen::TAO_ROOT_IS:
case TAO_CodeGen::TAO_ROOT_SI:
case TAO_CodeGen::TAO_ROOT_SS:
return 0; // Nothing to be done.
default:
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype::"
"visit_typedef - "
"Bad context state\n"),
-1);
}
}
if (status == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype::"
"visit_typedef - "
"failed to accept visitor\n"),
-1);
}
return 0;
}
int
be_visitor_valuetype::visit_field (be_field *)
{
// Is overridden in derived visitors.
return 0;
}
// Private data fields for scope.
int
be_visitor_valuetype::gen_pd (be_valuetype *node)
{
int n_processed = 0;
this->elem_number_ = 0;
for (UTL_ScopeActiveIterator si (node, UTL_Scope::IK_decls);
!si.is_done ();
si.next())
{
AST_Decl *d = si.item ();
if (!d)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_scope::visit_scope - "
"bad node in this scope\n"),
-1);
}
be_field *field = be_field::narrow_from_decl (d);
if (!field)
{
continue;
}
++n_processed;
// Set the scope node as "node" in which the code is being
// generated so that elements in the node's scope can use it
// for code generation.
this->ctx_->scope (node->decl ());
// Set the node to be visited.
this->ctx_->node (field);
this->elem_number_++;
if (this->gen_field_pd (field) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_scope::visit_scope - "
"codegen for scope failed\n"),
-1);
}
}
return 0;
}
// Private data for field.
int
be_visitor_valuetype::gen_field_pd (be_field *node)
{
TAO_OutStream *os = this->ctx_->stream ();
// First generate the type information.
be_type *bt = be_type::narrow_from_decl (node->field_type ());
be_valuetype *vt = be_valuetype::narrow_from_scope (node->defined_in ());
if (!bt || !vt)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_field_ch::"
"visit_field - "
"Bad field type\n"),
-1);
}
// Instantiate a visitor context with a copy of our context. This info
// will be modified based on what type of node we are visiting.
be_visitor_context ctx (*this->ctx_);
ctx.node (node);
be_visitor_field_ch visitor (&ctx);
*os << be_nl;
if (bt->accept (&visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_field_ch::"
"visit_field - "
"codegen for field type failed\n"),
-1);
}
// Now output the field name.
*os << " " << vt->field_pd_prefix ()
<< node->local_name ()
<< vt->field_pd_postfix () << ";";
return 0;
}
// Generate the _init definition.
int
be_visitor_valuetype::gen_init_defn (be_valuetype *node)
{
if (node->is_abstract ())
{
return 0;
}
TAO_OutStream *os = this->ctx_->stream ();
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
*os << "class " << be_global->stub_export_macro ()
<< " " << node->local_name ()
<< "_init : public CORBA::ValueFactoryBase" << be_nl;
// Generate the body.
*os << "{" << be_nl
<< "public:" << be_idt_nl
<< "virtual ~" << node->local_name () << "_init (void);" << be_nl;
*os << "virtual const char* tao_repository_id (void);\n" << be_nl;
*os << "// create () goes here" << be_nl;
*os << be_uidt_nl << "};" << be_nl;
return 0;
}
int
be_visitor_valuetype::gen_init_impl (be_valuetype *node)
{
if (node->is_abstract ())
{
return 0;
}
TAO_OutStream *os = this->ctx_->stream ();
os->indent ();
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_init",
node->full_name ());
ACE_OS::memset (lname,
'\0',
NAMEBUFSIZE);
ACE_OS::sprintf (lname,
"%s_init",
node->local_name ());
// Destructor.
*os << fname << "::~" << lname << " (void)" << be_nl
<< "{" << be_nl << "}\n\n";
*os << "const char* " << be_nl
<< fname << "::tao_repository_id (void)" << be_nl
<< "{" << be_idt_nl
<< "return " << node->local_name ()
<< "::_tao_obv_static_repository_id ();"
<< be_uidt_nl << "}\n\n";
return 0;
}
idl_bool
be_visitor_valuetype::obv_need_ref_counter (be_valuetype* node)
{
// VT needs RefCounter if it has concrete factory or supports an
// abstract interface and none of its base VT has ref_counter
if (node->determine_factory_style () != be_valuetype::FS_CONCRETE_FACTORY
&& !node->supports_abstract ())
{
return 0;
}
// Now go thru our base VTs and see if one has already.
for (int i = 0; i < node->n_inherits (); ++i)
{
be_valuetype *vt =
be_valuetype::narrow_from_decl (node->inherits ()[i]);
if (vt != 0)
{
if (be_visitor_valuetype::obv_have_ref_counter (vt))
{
return 0;
}
}
}
return 1;
}
idl_bool
be_visitor_valuetype::obv_have_ref_counter (be_valuetype* node)
{
// Just try to find a VT with concrete factory in inheritance tree.
if (node == 0)
{
return 0;
}
if (node->determine_factory_style () == be_valuetype::FS_CONCRETE_FACTORY)
{
return 1;
}
// Now go thru our base VTs.
for (int i = 0; i < node->n_inherits (); ++i)
{
be_valuetype *vt = be_valuetype::narrow_from_decl (node->inherits ()[i]);
if (vt != 0)
{
if (be_visitor_valuetype::obv_have_ref_counter (vt))
{
return 1;
}
}
}
return 0;
}
idl_bool
be_visitor_valuetype::is_amh_exception_holder (be_valuetype *node)
{
if (ACE_OS::strncmp (node->local_name (), "AMH_", 4) == 0)
{
const char *last_E =
ACE_OS::strrchr (node->full_name (), 'E');
if (last_E != 0
&& ACE_OS::strcmp (last_E, "ExceptionHolder") == 0)
{
return I_TRUE;
}
}
return I_FALSE;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?