be_valuetype.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 934 行 · 第 1/2 页
CPP
934 行
// be_valuetype.cpp,v 1.41 2003/10/28 18:30:37 bala Exp
// ============================================================================
//
// = LIBRARY
// TAO IDL
//
// = FILENAME
// be_valuetype.cpp
//
// = DESCRIPTION
// Extension of class AST_Interface and be_interface that provides
// additional means for C++ mapping of an valuetype.
//
// = AUTHOR
// Torsten Kuepper <kuepper2@lfa.uni-wuppertal.de>
// derived from be_interface.cpp
//
// ============================================================================
#include "be_valuetype.h"
#include "be_visitor.h"
#include "be_extern.h"
#include "be_helper.h"
#include "ast_module.h"
#include "utl_identifier.h"
#include "idl_defines.h"
#include "nr_extern.h"
#include "global_extern.h"
#include "ace/Log_Msg.h"
ACE_RCSID (be,
be_valuetype,
"be_valuetype.cpp,v 1.41 2003/10/28 18:30:37 bala Exp")
// Default constructor.
be_valuetype::be_valuetype (void)
: COMMON_Base (),
AST_Decl (),
AST_Type (),
UTL_Scope (),
AST_Interface (),
be_scope (),
be_decl (),
be_type (),
be_interface (),
AST_ValueType (),
full_obv_skel_name_ (0)
{
// Always the case.
this->size_type (AST_Type::VARIABLE);
AST_Module *m = AST_Module::narrow_from_scope (this->defined_in ());
if (m != 0)
{
m->set_has_nested_valuetype ();
}
// Always the case.
this->has_constructor (I_TRUE);
}
// Constructor used to build the AST.
be_valuetype::be_valuetype (UTL_ScopedName *n,
AST_Interface **inherits,
long n_inherits,
AST_ValueType *inherits_concrete,
AST_Interface **inherits_flat,
long n_inherits_flat,
AST_Interface **supports,
long n_supports,
AST_Interface *supports_concrete,
idl_bool abstract,
idl_bool truncatable,
idl_bool custom)
: COMMON_Base (0,
abstract),
AST_Decl (AST_Decl::NT_valuetype,
n),
AST_Type (AST_Decl::NT_valuetype,
n),
UTL_Scope (AST_Decl::NT_valuetype),
AST_Interface (n,
inherits,
n_inherits,
inherits_flat,
n_inherits_flat,
0,
abstract),
be_scope (AST_Decl::NT_valuetype),
be_decl (AST_Decl::NT_valuetype,
n),
be_type (AST_Decl::NT_valuetype,
n),
be_interface (n,
inherits,
n_inherits,
inherits_flat,
n_inherits_flat,
0,
abstract),
AST_ValueType (n,
inherits,
n_inherits,
inherits_concrete,
inherits_flat,
n_inherits_flat,
supports,
n_supports,
supports_concrete,
abstract,
truncatable,
custom),
full_obv_skel_name_ (0),
supports_abstract_ (0),
var_out_seq_decls_gen_ (0)
{
// Check that redefine() copies all members.
// Always the case.
this->size_type (AST_Type::VARIABLE);
AST_Module *m = AST_Module::narrow_from_scope (this->defined_in ());
if (m != 0)
{
m->set_has_nested_valuetype ();
}
// Always the case.
this->has_constructor (I_TRUE);
for (long i = 0; i < this->pd_n_supports; ++i)
{
if (this->pd_supports[i]->is_abstract ())
{
this->supports_abstract_ = I_TRUE;
break;
}
}
if (this->imported ())
{
return;
}
// Set the flag that says we have a valuetype in this IDL file.
if (this->is_defined ())
{
ACE_SET_BITS (idl_global->decls_seen_info_,
idl_global->decls_seen_masks.valuetype_seen_);
}
else
{
ACE_SET_BITS (idl_global->decls_seen_info_,
idl_global->decls_seen_masks.fwd_valuetype_seen_);
}
}
be_valuetype::~be_valuetype (void)
{
}
void
be_valuetype::redefine (AST_Interface *from)
{
be_valuetype *bv = be_valuetype::narrow_from_decl (from);
bv->var_out_seq_decls_gen_ = bv->var_out_seq_decls_gen_;
this->AST_ValueType::redefine (from);
}
// Is true if non-virtual accessor and modifier should be generated
// If #pragma TAO OBV opt_accessor (todo) is used or -Wb,obv_opt_accessor.
idl_bool
be_valuetype::opt_accessor (void)
{
return be_global->obv_opt_accessor ();
}
// Compute stringified fully scoped skeleton name (OBV_name).
void
be_valuetype::compute_fullobvskelname (void)
{
this->compute_full_skel_name ("OBV_",
this->full_obv_skel_name_);
}
// Retrieve the fully scoped skeleton name.
const char*
be_valuetype::full_obv_skel_name (void)
{
if (!this->full_obv_skel_name_)
{
compute_fullobvskelname ();
}
return this->full_obv_skel_name_;
}
const char *
be_valuetype::fwd_helper_name (void) const
{
return this->fwd_helper_name_.fast_rep ();
}
be_valuetype::FactoryStyle
be_valuetype::determine_factory_style (void)
{
FactoryStyle factory_style = FS_UNKNOWN;
if (this->is_abstract ())
{
return FS_NO_FACTORY;
}
// Check whether we have at least one operation or not.
idl_bool have_operation = this->have_operation ();
idl_bool have_factory = 0;
// Try only our own scope.
if (this->nmembers () > 0)
{
// Initialize an iterator to iterate thru our scope
// Continue until each element is visited.
for (UTL_ScopeActiveIterator si (this,
UTL_Scope::IK_decls);
!si.is_done ();
si.next())
{
AST_Decl *d = si.item ();
if (!d)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_valuetype::"
"determine_factory_style"
"bad node in this scope\n"),
factory_style);
}
AST_Decl::NodeType node_type = d->node_type ();
if (node_type == AST_Decl::NT_factory)
{
have_factory = 1;
break;
}
} // end of for loop
} // end of if
if (!have_operation && !have_factory)
{
factory_style = FS_CONCRETE_FACTORY;
}
else if (have_operation && !have_factory)
{
factory_style = FS_NO_FACTORY;
}
else
{
factory_style = FS_ABSTRACT_FACTORY;
}
return factory_style;
}
idl_bool
be_valuetype::have_operation (void)
{
// Check whatever scope we get for operations/attributes.
idl_bool have_operation = I_FALSE;
// Operations are either operations or attributes of:
// -its own
// -derived (abstract VT | VT | abstract iface | iface)
//
// First try our own scope.
if (this->nmembers () > 0)
{
// Initialize an iterator to iterate thru our scope
// Continue until each element is checked.
for (UTL_ScopeActiveIterator si (this,
UTL_Scope::IK_decls);
!si.is_done ();
si.next())
{
AST_Decl *d = si.item ();
if (!d)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_valuetype::"
"has_operation"
"bad node in this scope\n"),
0);
}
AST_Decl::NodeType nt = d->node_type();
if (nt == AST_Decl::NT_op || nt == AST_Decl::NT_attr)
{
have_operation = I_TRUE;
break;
}
} // end of for loop
} // end of if
if (! have_operation)
{
// Now traverse inheritance tree.
long i; // loop index
long n_inherits = this->n_inherits ();
AST_Interface **inherits = this->inherits ();
for (i = 0; i < n_inherits; ++i)
{
be_valuetype *vt = be_valuetype::narrow_from_decl (inherits[i]);
if (vt != 0 && vt->have_operation ())
{
have_operation = I_TRUE;
break;
}
}
}
if (! have_operation)
{
// Check for operations on supported interfaces
AST_Interface * supported = this->supports_concrete ();
if (supported != 0)
{
be_interface *intf = be_interface::narrow_from_decl (supported);
if (intf != 0)
{
have_operation = be_valuetype::have_supported_op (intf);
}
}
}
return have_operation;
}
idl_bool
be_valuetype::have_supported_op (be_interface * node)
{
idl_bool have_supported_op = 0;
if (node->nmembers () == 0)
{
return I_FALSE;
}
// Initialize an iterator for supported interface elements
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_valuetype::"
"have_supported_op"
"bad node in this scope\n"),
0);
}
AST_Decl::NodeType nt = d->node_type ();
// Check the type of each element in the supported interface
if (nt == AST_Decl::NT_op || nt == AST_Decl::NT_attr)
{
have_supported_op = 1;
break;
}
} // end for loop
if (! have_supported_op)
{
// Now traverse inheritance tree.
long i; // loop index
long n_inherits = node->n_inherits ();
AST_Interface **inherits = node->inherits ();
for (i = 0; i < n_inherits; ++i)
{
be_interface * intf = be_interface::narrow_from_decl (inherits[i]);
if (intf != 0)
{
have_supported_op = be_valuetype::have_supported_op (intf);
if (have_supported_op)
{
break;
}
}
}
}
return have_supported_op;
}
idl_bool
be_valuetype::will_have_factory (void)
{
FactoryStyle fs = this->determine_factory_style ();
return (fs == FS_ABSTRACT_FACTORY || fs == FS_CONCRETE_FACTORY);
}
int
be_valuetype::gen_helper_header (char*,
char*)
{
TAO_OutStream *os = 0;
os = tao_cg->client_header ();
*os << be_nl << be_nl
<< "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
*os << "namespace CORBA" << be_nl
<< "{"
<< be_idt_nl
<< "TAO_NAMESPACE_STORAGE_CLASS void add_ref ("
<< this->full_name () << " *);" << be_nl
<< "TAO_NAMESPACE_STORAGE_CLASS void remove_ref ("
<< this->full_name () << " *);";
*os << be_uidt_nl
<< "}";
return 0;
}
int
be_valuetype::gen_helper_inline (char*,
char*)
{
TAO_OutStream *os = 0;
os = tao_cg->client_inline ();
// There is a problem, here. Looks like the if defined __ACE_INLINE
// is not getting generated... Actually this is a much bigger
// problem. Just hacking it up for the timebeing..
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
*os << "#if defined (__ACE_INLINE__)" << be_nl << be_nl
<< "namespace CORBA" << be_nl
<< "{"
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?