valuetype.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 1,005 行 · 第 1/2 页
CPP
1,005 行
//
// valuetype.cpp,v 1.32 2003/11/04 05:21:28 dhinton Exp
//
// ============================================================================
//
// = LIBRARY
// TAO IDL
//
// = FILENAME
// valuetype.cpp
//
// = DESCRIPTION
// Visitor generating code for Valuetypes. This is a generic visitor.
//
// = AUTHOR
// Torsten Kuepper <kuepper2@lfa.uni-wuppertal.de>
// based on interface.cpp from Aniruddha Gokhale
//
// ============================================================================
ACE_RCSID (be_visitor_valuetype,
valuetype,
"valuetype.cpp,v 1.32 2003/11/04 05:21:28 dhinton Exp")
be_visitor_valuetype::be_visitor_valuetype (be_visitor_context *ctx)
: be_visitor_scope (ctx)
{
}
be_visitor_valuetype::~be_visitor_valuetype (void)
{
}
// This method must be overridden by the derived valuetype visitors.
int
be_visitor_valuetype::visit_valuetype (be_valuetype *)
{
return -1;
}
int
be_visitor_valuetype::visit_valuetype_scope (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);
}
AST_Field *field = AST_Field::narrow_from_decl (d);
if (field && field->visibility () == AST_Field::vis_PRIVATE)
{
continue;
// Ignore private fields in this run
// AST_Attribute derives from AST_Field, so test for
// vis_PRIVATE is ok (the attribute has it set to vis_NA)
}
be_decl *bd = be_decl::narrow_from_decl (d);
// 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 ());
this->ctx_->node (bd);
this->elem_number_++;
if (bd == 0 || bd->accept (this) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_scope::visit_scope - "
"codegen for scope failed\n"),
-1);
}
}
this->elem_number_ = 0;
for (UTL_ScopeActiveIterator sj (node, UTL_Scope::IK_decls);
!sj.is_done ();
sj.next())
{
AST_Decl *d = sj.item ();
if (!d)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_scope::visit_scope - "
"bad node in this scope\n"),
-1);
}
AST_Field *field = AST_Field::narrow_from_decl (d);
if (!field
|| (field && field->visibility () != AST_Field::vis_PRIVATE))
{
// Only private fields.
continue;
}
++ n_processed;
if (n_processed == 1)
{
this->begin_private ();
}
be_decl *bd = be_decl::narrow_from_decl (d);
// 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 ());
this->ctx_->node (bd);
this->elem_number_++;
if (bd == 0 || bd->accept (this) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_scope::visit_scope - "
"codegen for scope failed\n"),
-1);
}
}
return 0;
}
// These two are called from visit_valuetype_scope()
void
be_visitor_valuetype::begin_public ()
{
// In derived visitors print "public:" in class definition
}
void
be_visitor_valuetype::begin_private ()
{
// In derived visitors print "protected:" in class definition
}
// All common visit methods for valuetype visitor.
int
be_visitor_valuetype::visit_attribute (be_attribute *node)
{
this->ctx_->node (node);
this->ctx_->attribute (node);
be_operation get_op (node->field_type (),
AST_Operation::OP_noflags,
node->name (),
0,
0);
get_op.set_name ((UTL_IdList *) node->name ()->copy ());
if (this->visit_operation (&get_op) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_attribute::"
"visit_attribute - "
"codegen for get_attribute failed\n"),
-1);
}
if (node->readonly ())
{
// Nothing else to do.
return 0;
}
Identifier id ("void");
UTL_ScopedName sn (&id,
0);
be_predefined_type rt (AST_PredefinedType::PT_void,
&sn);
// Argument type is the same as the attribute type.
be_argument arg (AST_Argument::dir_IN,
node->field_type (),
node->name ());
arg.set_name ((UTL_IdList *) node->name ()->copy ());
// Create the operation.
be_operation set_op (&rt,
AST_Operation::OP_noflags,
node->name (),
0,
0);
set_op.set_name ((UTL_IdList *) node->name ()->copy ());
set_op.be_add_argument (&arg);
if (this->visit_operation (&set_op) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_attribute::"
"visit_attribute - "
"codegen for set_attribute failed\n"),
-1);
}
return 0;
}
int
be_visitor_valuetype::visit_constant (be_constant *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_constant_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CS:
{
be_visitor_constant_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_ANY_OP_CH:
case TAO_CodeGen::TAO_ROOT_ANY_OP_CS:
case TAO_CodeGen::TAO_ROOT_CDR_OP_CH:
case TAO_CodeGen::TAO_ROOT_CDR_OP_CI:
case TAO_CodeGen::TAO_ROOT_CDR_OP_CS:
case TAO_CodeGen::TAO_ROOT_CI:
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_constant - "
"Bad context state\n"),
-1);
}
}
if (status == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype::"
"visit_constant - "
"failed to accept visitor\n"),
-1);
}
return 0;
}
int
be_visitor_valuetype::visit_enum (be_enum *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_enum_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CS:
{
be_visitor_enum_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_ANY_OP_CH:
{
be_visitor_enum_any_op_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_ANY_OP_CS:
{
be_visitor_enum_any_op_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CH:
{
be_visitor_enum_cdr_op_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CI:
{
be_visitor_enum_cdr_op_ci visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CS:
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_CI:
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_enum - "
"Bad context state\n"),
-1);
}
}
if (status == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_valuetype::"
"visit_enum - "
"failed to accept visitor\n"),
-1);
}
return 0;
}
int
be_visitor_valuetype::visit_exception (be_exception *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_exception_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CI:
{
be_visitor_exception_ci visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CS:
{
be_visitor_exception_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_ANY_OP_CH:
{
be_visitor_exception_any_op_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_ANY_OP_CS:
{
be_visitor_exception_any_op_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CH:
{
be_visitor_exception_cdr_op_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CI:
{
be_visitor_exception_cdr_op_ci visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CS:
{
be_visitor_exception_cdr_op_cs 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_interface::"
"visit_exception - "
"failed to accept visitor\n"),
-1);
}
return 0;
}
int
be_visitor_valuetype::visit_structure (be_structure *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_structure_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CI:
{
be_visitor_structure_ci visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CS:
{
be_visitor_structure_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_ANY_OP_CH:
{
be_visitor_structure_any_op_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_ANY_OP_CS:
{
be_visitor_structure_any_op_cs visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CH:
{
be_visitor_structure_cdr_op_ch visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CI:
{
be_visitor_structure_cdr_op_ci visitor (&ctx);
status = node->accept (&visitor);
break;
}
case TAO_CodeGen::TAO_ROOT_CDR_OP_CS:
{
be_visitor_structure_cdr_op_cs 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 - "
"failed to accept visitor\n"),
-1);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?