tmplinst_cs.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 1,290 行 · 第 1/3 页
CPP
1,290 行
if (this->visit_scope (node) != 0)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_tmplinst_cs::"
"visit_structure - visit scope failed\n"),
-1);
}
if (node->imported ())
{
this->this_mode_generated (node, I_TRUE);
return 0;
}
// For _var and/or _out tmp]ate clases.
this->gen_common_tmplinst (node, os);
if (be_global->any_support ())
{
TAO_OutStream *tmp = os;
if (be_global->gen_anyop_files ())
{
os = tao_cg->anyop_source ();
}
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO::Any_Dual_Impl_T<" << this->linebreak_
<< be_idt << be_idt_nl
<< node->name () << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;
os = tmp;
}
this->this_mode_generated (node, I_TRUE);
return 0;
}
idl_bool
be_visitor_tmplinst_cs::this_mode_generated (be_decl *node) const
{
switch (this->mode_)
{
case TMPL_CLASS:
return node->cli_tmpl_class_gen ();
case PRAGMA_INST:
return node->cli_pragma_inst_gen ();
default:
return I_FALSE;
}
}
void
be_visitor_tmplinst_cs::this_mode_generated (be_decl *node,
idl_bool val)
{
switch (this->mode_)
{
case TMPL_CLASS:
node->cli_tmpl_class_gen (val);
break;
case PRAGMA_INST:
node->cli_pragma_inst_gen (val);
break;
default:
break;
}
}
void
be_visitor_tmplinst_cs::gen_managed_type_tmplinst (be_sequence *node,
be_type *bt)
{
TAO_OutStream *os = this->ctx_->stream ();
switch (node->managed_type ())
{
case be_sequence::MNG_OBJREF:
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Object_Manager<" << this->linebreak_ << be_idt << be_idt_nl
<< bt->name () << "," << this->linebreak_ << be_nl
<< bt->name () << "_var" << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;
break;
case be_sequence::MNG_VALUE:
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Valuetype_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << "," << this->linebreak_ << be_nl
<< bt->name () << "_var" << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;
break;
case be_sequence::MNG_PSEUDO:
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Pseudo_Object_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;
break;
default:
// String and Wstring managed types are not template classes.
break;
}
}
int
be_visitor_tmplinst_cs::gen_varout_tmplinst (be_sequence *node,
be_type *bt)
{
TAO_OutStream *os = this->ctx_->stream ();
switch (node->managed_type ())
{
case be_sequence::MNG_OBJREF:
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_MngSeq_Var_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< "TAO_Object_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << "," << this->linebreak_ << be_nl
<< bt->name () << "_var" << this->linebreak_
<< be_uidt_nl
<< ">" << this->linebreak_ << be_uidt << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Seq_Var_Base_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< "TAO_Object_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << "," << this->linebreak_ << be_nl
<< bt->name () << "_var" << this->linebreak_ << be_uidt_nl
<< ">" << this->linebreak_ << be_uidt << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_MngSeq_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< node->name () << "_var," << this->linebreak_ << be_nl
<< "TAO_Object_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << "," << this->linebreak_ << be_nl
<< bt->name () << "_var" << this->linebreak_ << be_uidt_nl
<< ">" << this->linebreak_ << be_uidt << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
break;
case be_sequence::MNG_PSEUDO:
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_MngSeq_Var_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< "TAO_Pseudo_Object_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << this->linebreak_ << be_uidt_nl
<< ">" << this->linebreak_ << be_uidt << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Seq_Var_Base_T<" << this->linebreak_
<< be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< "TAO_Pseudo_Object_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << this->linebreak_ << be_uidt_nl
<< ">" << this->linebreak_ << be_uidt << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_MngSeq_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< node->name () << "_var," << this->linebreak_ << be_nl
<< "TAO_Pseudo_Object_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << this->linebreak_ << be_uidt_nl
<< ">" << this->linebreak_ << be_uidt << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
break;
case be_sequence::MNG_VALUE:
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_MngSeq_Var_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< "TAO_Valuetype_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << "," << this->linebreak_ << be_nl
<< bt->name () << "_var" << this->linebreak_ << be_uidt_nl
<< ">" << this->linebreak_ << be_uidt << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Seq_Var_Base_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< "TAO_Valuetype_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << "," << this->linebreak_ << be_nl
<< bt->name () << "_var" << this->linebreak_ << be_uidt_nl
<< ">" << this->linebreak_ << be_uidt << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_MngSeq_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< node->name () << "_var," << this->linebreak_ << be_nl
<< "TAO_Valuetype_Manager<" << this->linebreak_
<< be_idt << be_idt_nl
<< bt->name () << "," << this->linebreak_ << be_nl
<< bt->name () << "_var" << this->linebreak_ << be_uidt_nl
<< ">" << this->linebreak_ << be_uidt << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
break;
case be_sequence::MNG_STRING:
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_MngSeq_Var_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<<"TAO_SeqElem_String_Manager" << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Seq_Var_Base_T<" << this->linebreak_
<< be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<<"TAO_SeqElem_String_Manager" << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_MngSeq_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< node->name () << "_var," << this->linebreak_ << be_nl
<<"TAO_SeqElem_String_Manager" << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
break;
case be_sequence::MNG_WSTRING:
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_MngSeq_Var_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<<"TAO_SeqElem_WString_Manager" << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Seq_Var_Base_T<" << this->linebreak_
<< be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<<"TAO_SeqElem_WString_Manager" << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_MngSeq_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< node->name () << "_var," << this->linebreak_ << be_nl
<<"TAO_SeqElem_WString_Manager" << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
break;
default: // not a managed type
{
AST_Type::SIZE_TYPE st = bt->size_type ();
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< (st == AST_Type::FIXED ? "TAO_FixedSeq_Var_T<"
: "TAO_VarSeq_Var_T<")
<< this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< bt->name () << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Seq_Var_Base_T<" << this->linebreak_
<< be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< bt->name () << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Seq_Out_T<" << this->linebreak_
<< be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< node->name () << "_var," << this->linebreak_ << be_nl
<< bt->name () << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_
<< be_uidt << be_uidt << be_uidt;
}
break;
}
return 0;
}
int
be_visitor_tmplinst_cs::gen_base_class_tmplinst (be_sequence *node)
{
TAO_OutStream *os = this->ctx_->stream ();
// A generated sequence is a unique class type for each IDL typedef,
// but the base template class may not be. So, when generating the
// explicit template instantiation of the base class, we use the
// unaliased element type and the bound (if any) in the #ifdef guard to
// prevent duplicates.
be_type *bt = be_type::narrow_from_decl (node->base_type ());
AST_Decl::NodeType nt = bt->node_type ();
if (nt == AST_Decl::NT_typedef)
{
be_typedef *td = be_typedef::narrow_from_decl (bt);
bt = td->primitive_base_type ();
}
static char ifdef_suffix [NAMEBUFSIZE];
ACE_OS::memset (ifdef_suffix,
'\0',
NAMEBUFSIZE);
if (node->unbounded ())
{
ACE_OS::sprintf (ifdef_suffix,
"%s",
"explicit");
}
else
{
ACE_OS::sprintf (ifdef_suffix,
"%ld_%s",
node->max_size ()->ev ()->u.ulval,
"explicit");
}
os->gen_ifdef_macro (bt->flat_name (), ifdef_suffix);
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl;
int status = node->gen_base_class_name (os,
this->linebreak_,
idl_global->root ());
// Pass it to the base constructor.
if (status == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_tmplinst_cs::"
"gen_base_class_tmplinst - "
"codegen for base sequence class failed\n"),
-1);
}
*os << this->suffix_ << be_uidt << be_uidt;
os->gen_endif ();
return 0;
}
void
be_visitor_tmplinst_cs::gen_common_tmplinst (be_type *node,
TAO_OutStream *os)
{
idl_bool fixed = (node->size_type () == AST_Type::FIXED);
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_" << (fixed ? "Fixed" : "Var") << "_Var_T<"
<< this->linebreak_ << be_idt << be_idt_nl
<< node->name () << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;
*os << be_nl << be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Var_Base_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;
if (!fixed)
{
*os << be_nl<< be_nl
<< this->prefix_ << this->linebreak_ << be_idt << be_idt_nl
<< "TAO_Out_T<" << this->linebreak_ << be_idt << be_idt_nl
<< node->name () << "," << this->linebreak_ << be_nl
<< node->name () << "_var" << this->linebreak_ << be_uidt_nl
<< ">" << this->suffix_ << be_uidt << be_uidt << be_uidt;
}
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?