field_ch.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 668 行 · 第 1/2 页
CPP
668 行
//
// field_ch.cpp,v 1.38 2003/04/22 20:50:06 bala Exp
//
// ============================================================================
//
// = LIBRARY
// TAO IDL
//
// = FILENAME
// field_ch.cpp
//
// = DESCRIPTION
// Visitor generating code for Field node in the client header
//
// = AUTHOR
// Aniruddha Gokhale
//
// ============================================================================
#include "be_visitor_enum/enum_ch.h"
#include "be_visitor_sequence/sequence_ch.h"
#include "nr_extern.h"
ACE_RCSID (be_visitor_field,
field_ch,
"field_ch.cpp,v 1.38 2003/04/22 20:50:06 bala Exp")
// **********************************************
// Visitor for field in the client header file.
// **********************************************
be_visitor_field_ch::be_visitor_field_ch (be_visitor_context *ctx)
: be_visitor_decl (ctx)
{
}
be_visitor_field_ch::~be_visitor_field_ch (void)
{
}
int
be_visitor_field_ch::visit_field (be_field *node)
{
TAO_OutStream *os = this->ctx_->stream ();
be_type *bt = be_type::narrow_from_decl (node->field_type ());
if (!bt)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_field_ch::"
"visit_field - "
"Bad field type\n"),
-1);
}
this->ctx_->node (node);
*os << be_nl;
if (bt->accept (this) == -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 << " " << node->local_name () << ";";
return 0;
}
// Visit operations on all possible data types that a field can be.
int
be_visitor_field_ch::visit_array (be_array *node)
{
TAO_OutStream *os = this->ctx_->stream ();
be_type *bt;
if (this->ctx_->alias ())
{
bt = this->ctx_->alias ();
}
else
{
bt = node;
}
// If not a typedef and we are defined in the use scope, we must be defined.
if (!this->ctx_->alias ()
&& node->is_child (this->ctx_->scope ()))
{
// This is the case for anonymous arrays.
// 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); // set the node to be the node being visited. The scope
// is still the same
// First generate the array declaration
ctx.state (TAO_CodeGen::TAO_ARRAY_CH);
be_visitor_array_ch visitor (&ctx);
if (node->accept (&visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_field_ch::"
"visit_array - "
"codegen failed\n"),
-1);
}
ctx.state (TAO_CodeGen::TAO_ROOT_CH);
// Having defined all array type and its supporting operations, now
// generate the actual variable that is a field of the structure.
*os << be_nl << be_nl << "_" << bt->local_name ();
}
else
{
// This was a typedefed array.
// ACE_NESTED_CLASS macro generated by nested_type_name
// is necessary if the struct, union, or valuetype containing this
// field was not defined inside a module. In such a case, VC++
// complains that the non-module scope is not yet fully defined.
UTL_Scope *holds_container = this->ctx_->scope ()->defined_in ();
AST_Decl *hc_decl = ScopeAsDecl (holds_container);
if (hc_decl->node_type () != AST_Decl::NT_module)
{
*os << bt->nested_type_name (this->ctx_->scope ());
}
else
{
*os << bt->name ();
}
}
return 0;
}
int
be_visitor_field_ch::visit_enum (be_enum *node)
{
TAO_OutStream *os = this->ctx_->stream ();
be_type *bt;
if (this->ctx_->alias ())
{
bt = this->ctx_->alias ();
}
else
{
bt = node;
}
// If not a typedef and we are defined in the use scope, we must be defined.
if (!this->ctx_->alias () // not a typedef
&& node->is_child (this->ctx_->scope ()))
{
// 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);
// First generate the enum declaration.
be_visitor_enum_ch visitor (&ctx);
if (node->accept (&visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_field_ch::"
"visit_enum - "
"codegen failed\n"),
-1);
}
}
// This was a typedefed array.
// ACE_NESTED_CLASS macro generated by nested_type_name
// is necessary if the struct, union, or valuetype containing this
// field was not defined inside a module. In such a case, VC++
// complains that the non-module scope is not yet fully defined.
UTL_Scope *holds_container = this->ctx_->scope ()->defined_in ();
AST_Decl *hc_decl = ScopeAsDecl (holds_container);
if (hc_decl->node_type () != AST_Decl::NT_module)
{
*os << bt->nested_type_name (this->ctx_->scope ());
}
else
{
*os << bt->name ();
}
return 0;
}
int
be_visitor_field_ch::visit_interface (be_interface *node)
{
TAO_OutStream *os = this->ctx_->stream ();
be_type *bt;
if (this->ctx_->alias ())
{
bt = this->ctx_->alias ();
}
else
{
bt = node;
}
// This was a typedefed array.
// ACE_NESTED_CLASS macro generated by nested_type_name
// is necessary if the struct, union, or valuetype containing this
// field was not defined inside a module. In such a case, VC++
// complains that the non-module scope is not yet fully defined.
UTL_Scope *holds_container = this->ctx_->scope ()->defined_in ();
AST_Decl *hc_decl = ScopeAsDecl (holds_container);
if (hc_decl->node_type () != AST_Decl::NT_module)
{
*os << bt->nested_type_name (this->ctx_->scope (), "_var");
}
else
{
*os << bt->name () << "_var";
}
return 0;
}
int
be_visitor_field_ch::visit_interface_fwd (be_interface_fwd *node)
{
TAO_OutStream *os = this->ctx_->stream ();
be_type *bt;
if (this->ctx_->alias ())
{
bt = this->ctx_->alias ();
}
else
{
bt = node;
}
// This was a typedefed array.
// ACE_NESTED_CLASS macro generated by nested_type_name
// is necessary if the struct, union, or valuetype containing this
// field was not defined inside a module. In such a case, VC++
// complains that the non-module scope is not yet fully defined.
UTL_Scope *holds_container = this->ctx_->scope ()->defined_in ();
AST_Decl *hc_decl = ScopeAsDecl (holds_container);
if (hc_decl->node_type () != AST_Decl::NT_module)
{
*os << bt->nested_type_name (this->ctx_->scope (), "_var");
}
else
{
*os << bt->name () << "_var";
}
return 0;
}
int
be_visitor_field_ch::visit_valuetype (be_valuetype *node)
{
TAO_OutStream *os = this->ctx_->stream ();
be_type *bt;
if (this->ctx_->alias ())
{
bt = this->ctx_->alias ();
}
else
{
bt = node;
}
// This was a typedefed array.
// ACE_NESTED_CLASS macro generated by nested_type_name
// is necessary if the struct, union, or valuetype containing this
// field was not defined inside a module. In such a case, VC++
// complains that the non-module scope is not yet fully defined.
UTL_Scope *holds_container = this->ctx_->scope ()->defined_in ();
AST_Decl *hc_decl = ScopeAsDecl (holds_container);
if (hc_decl->node_type () != AST_Decl::NT_module)
{
*os << bt->nested_type_name (this->ctx_->scope (), "_var");
}
else
{
*os << bt->name () << "_var";
}
return 0;
}
int
be_visitor_field_ch::visit_valuetype_fwd (be_valuetype_fwd *node)
{
TAO_OutStream *os = this->ctx_->stream ();
be_type *bt;
if (this->ctx_->alias ())
{
bt = this->ctx_->alias ();
}
else
{
bt = node;
}
// This was a typedefed array.
// ACE_NESTED_CLASS macro generated by nested_type_name
// is necessary if the struct, union, or valuetype containing this
// field was not defined inside a module. In such a case, VC++
// complains that the non-module scope is not yet fully defined.
UTL_Scope *holds_container = this->ctx_->scope ()->defined_in ();
AST_Decl *hc_decl = ScopeAsDecl (holds_container);
if (hc_decl->node_type () != AST_Decl::NT_module)
{
*os << bt->nested_type_name (this->ctx_->scope (), "_var");
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?