Recursive type TypeCode
decorator template.
More...
#include <Recursive_Type_TypeCode.h>
Classes | |
class | Reset |
Public Member Functions | |
Recursive_Type (CORBA::TCKind kind, char const *id, char const *name, MemberArrayType const &fields, CORBA::ULong nfields) | |
Recursive struct constructor. | |
Recursive_Type (char const *id, char const *name, TypeCodeType const &discriminant_type, MemberArrayType const &cases, CORBA::ULong ncases, CORBA::Long default_index) | |
Recursive union constructor. | |
Recursive_Type (CORBA::TCKind kind, char const *id, char const *name, CORBA::ValueModifier modifier, TypeCodeType const &concrete_base, MemberArrayType const &fields, CORBA::ULong nfields) | |
Recursive valuetype constructor. | |
Recursive_Type (CORBA::TCKind kind, char const *id) | |
Dynamic Recursive_Type TypeCode constructor. | |
bool | struct_parameters (char const *name, MemberArrayType const &fields, CORBA::ULong nfields) |
Set struct TypeCode parameters. | |
bool | union_parameters (char const *name, TypeCodeType const &discriminant_type, MemberArrayType const &cases, CORBA::ULong ncases, CORBA::Long default_index) |
Set union TypeCode parameters. | |
bool | valuetype_parameters (char const *name, CORBA::ValueModifier modifier, TypeCodeType const &concrete_base, MemberArrayType const &fields, CORBA::ULong nfields) |
Set valuetype or eventtype TypeCode parameters. | |
TAO-specific @c CORBA::TypeCode Methods | |
Methods required by TAO's implementation of the These are recursive type
| |
virtual bool | tao_marshal_kind (TAO_OutputCDR &cdr) const |
virtual bool | tao_marshal (TAO_OutputCDR &cdr, CORBA::ULong offset) const |
Protected Member Functions | |
TAO @c CORBA::TypeCode Template Methods | |
Recursive type
| |
virtual CORBA::Boolean | equal_i (CORBA::TypeCode_ptr tc) const |
virtual CORBA::Boolean | equivalent_i (CORBA::TypeCode_ptr tc) const |
Private Attributes | |
TAO_SYNCH_RECURSIVE_MUTEX | lock_ |
Internal state thread synchronization mutex. | |
bool | in_recursion_ |
bool | data_initialized_ |
Track whether data has been initialized. |
Recursive type TypeCode
decorator template.
This class template decorates the underlying TypeCode
implementation TypeCodeBase to provide support for IDL defined recursive types. Only IDL an struct
, union
or valuetype
may be recursive, which is why this decorator only supports constructors for the corresponding TypeCode
implementations.
Definition at line 48 of file Recursive_Type_TypeCode.h.
TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::Recursive_Type | ( | CORBA::TCKind | kind, | |
char const * | id, | |||
char const * | name, | |||
MemberArrayType const & | fields, | |||
CORBA::ULong | nfields | |||
) |
Recursive struct
constructor.
Definition at line 11 of file Recursive_Type_TypeCode.inl.
: TypeCodeBase (kind, id, name, fields, nfields) , lock_ () , in_recursion_ (false) , data_initialized_(true) { // ACE_ASSERT (kind != CORBA::tk_except); }
TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::Recursive_Type | ( | char const * | id, | |
char const * | name, | |||
TypeCodeType const & | discriminant_type, | |||
MemberArrayType const & | cases, | |||
CORBA::ULong | ncases, | |||
CORBA::Long | default_index | |||
) |
Recursive union
constructor.
Definition at line 29 of file Recursive_Type_TypeCode.inl.
: TypeCodeBase (id, name, discriminant_type, cases, ncases, default_index) , lock_ () , in_recursion_ (false) , data_initialized_(true) { }
TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::Recursive_Type | ( | CORBA::TCKind | kind, | |
char const * | id, | |||
char const * | name, | |||
CORBA::ValueModifier | modifier, | |||
TypeCodeType const & | concrete_base, | |||
MemberArrayType const & | fields, | |||
CORBA::ULong | nfields | |||
) |
Recursive valuetype
constructor.
Definition at line 52 of file Recursive_Type_TypeCode.inl.
: TypeCodeBase (kind, id, name, modifier, concrete_base, fields, nfields) , lock_ () , in_recursion_ (false) , data_initialized_(true) { }
TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::Recursive_Type | ( | CORBA::TCKind | kind, | |
char const * | id | |||
) |
Dynamic Recursive_Type
TypeCode constructor.
Definition at line 77 of file Recursive_Type_TypeCode.inl.
: TypeCodeBase (kind, id) , lock_ () , in_recursion_ (false) , data_initialized_(false) { // ACE_ASSERT (kind == CORBA::tk_struct // || kind == CORBA::tk_union // || kind == CORBA::tk_value // || kind == CORBA::tk_event); }
CORBA::Boolean TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::equal_i | ( | CORBA::TypeCode_ptr | tc | ) | const [protected, virtual] |
Definition at line 59 of file Recursive_Type_TypeCode.cpp.
{ ACE_GUARD_RETURN (TAO_SYNCH_RECURSIVE_MUTEX, guard, this->lock_, false); // Top-level TypeCode case. if (!(this->in_recursion_)) { this->in_recursion_ = true; // Reset recursion flag to false in an exception-safe manner once // equality determination is done. // // Only reset the recursion flag at the top-level. Reset flag (this->in_recursion_); return this->TypeCodeBase::equal_i (tc); } // Nothing else to do. return true; }
CORBA::Boolean TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::equivalent_i | ( | CORBA::TypeCode_ptr | tc | ) | const [protected, virtual] |
Definition at line 89 of file Recursive_Type_TypeCode.cpp.
{ ACE_GUARD_RETURN (TAO_SYNCH_RECURSIVE_MUTEX, guard, this->lock_, false); // Top-level TypeCode case. if (!(this->in_recursion_)) { this->in_recursion_ = true; // Reset recursion flag to false in an exception-safe manner once // equivalence determination is done. // // Only reset the recursion flag at the top-level. Reset flag (this->in_recursion_); return this->TypeCodeBase::equivalent_i (tc); } // Nothing else to do. return true; }
bool TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::struct_parameters | ( | char const * | name, | |
MemberArrayType const & | fields, | |||
CORBA::ULong | nfields | |||
) |
Set struct
TypeCode
parameters.
Definition at line 95 of file Recursive_Type_TypeCode.inl.
{ // Do not replace pre-existing fields! if ( !this->data_initialized_ ) { this->base_attributes_.name (name); this->fields_ = fields; this->nfields_ = nfields; this->data_initialized_ = true; return true; } return false; }
bool TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::tao_marshal | ( | TAO_OutputCDR & | cdr, | |
CORBA::ULong | offset | |||
) | const [virtual] |
Definition at line 15 of file Recursive_Type_TypeCode.cpp.
{ ACE_GUARD_RETURN (TAO_SYNCH_RECURSIVE_MUTEX, guard, this->lock_, false); // Top-level TypeCode case. if (!(this->in_recursion_)) { this->in_recursion_ = true; // Starting offset should point to the CORBA::TCKind value. // Note that this doesn't need to take into account alignment // padding since CORBA::TCKind (encoded as a CORBA::ULong) is // already aligned on the appropriate boundary, and since the // CORBA::TCKind was the last thing marshaled into the CDR // stream before getting here. offset = sizeof (CORBA::ULong); // Reset recursion flag to false in an exception-safe manner once // marshaling is done. // // Only reset the recursion flag at the top-level. Reset flag (this->in_recursion_); return this->TypeCodeBase::tao_marshal (cdr, offset); } // Recursive/indirected TypeCode case. // ACE_ASSERT (offset > 4 // && offset < static_cast<CORBA::ULong> (ACE_INT32_MAX)); return (cdr << -static_cast<CORBA::Long> (offset)); }
bool TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::tao_marshal_kind | ( | TAO_OutputCDR & | cdr | ) | const [virtual] |
Definition at line 119 of file Recursive_Type_TypeCode.cpp.
{ ACE_GUARD_RETURN (TAO_SYNCH_RECURSIVE_MUTEX, guard, this->lock_, false); // Top-level TypeCode case. if (!(this->in_recursion_)) return this->::CORBA::TypeCode::tao_marshal_kind (cdr); // Recursive/indirected TypeCode case. CORBA::ULong const indirection_kind = 0xffffffff; return (cdr << indirection_kind); }
bool TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::union_parameters | ( | char const * | name, | |
TypeCodeType const & | discriminant_type, | |||
MemberArrayType const & | cases, | |||
CORBA::ULong | ncases, | |||
CORBA::Long | default_index | |||
) |
Set union
TypeCode
parameters.
Definition at line 118 of file Recursive_Type_TypeCode.inl.
{ if ( !this->data_initialized_ ) { this->base_attributes_.name (name); this->discriminant_type_ = discriminant_type; this->cases_ = cases; this->ncases_ = ncases; this->default_index_ = default_index; this->data_initialized_ = true; return true; } return false; }
bool TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::valuetype_parameters | ( | char const * | name, | |
CORBA::ValueModifier | modifier, | |||
TypeCodeType const & | concrete_base, | |||
MemberArrayType const & | fields, | |||
CORBA::ULong | nfields | |||
) |
Set valuetype
or eventtype
TypeCode
parameters.
Definition at line 144 of file Recursive_Type_TypeCode.inl.
{ if ( !this->data_initialized_ ) { this->base_attributes_.name (name); this->type_modifier_ = modifier; this->concrete_base_ = concrete_base; this->fields_ = fields; this->nfields_ = nfields; this->data_initialized_ = true; return true; } return false; }
bool TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::data_initialized_ [private] |
Track whether data has been initialized.
Definition at line 169 of file Recursive_Type_TypeCode.h.
bool TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::in_recursion_ [mutable, private] |
true
if equality or equivalence is being determined recursively. This flag is used to prevent TypeCode
equality and equivalence operations from recursing indefinitely.
Definition at line 166 of file Recursive_Type_TypeCode.h.
TAO_SYNCH_RECURSIVE_MUTEX TAO::TypeCode::Recursive_Type< TypeCodeBase, TypeCodeType, MemberArrayType >::lock_ [mutable, private] |
Internal state thread synchronization mutex.
Definition at line 158 of file Recursive_Type_TypeCode.h.