TAO::TypeCode::Case< StringType, TypeCodeType > Class Template Reference

Abstract base class for that represents an IDL union case/member. More...

#include <TypeCode_Case_Base_T.h>

Inheritance diagram for TAO::TypeCode::Case< StringType, TypeCodeType >:

Inheritance graph
[legend]
Collaboration diagram for TAO::TypeCode::Case< StringType, TypeCodeType >:

Collaboration graph
[legend]
List of all members.

Public Member Functions

 Case (char const *name, TypeCodeType tc)
 Constructor.

 Case (void)
 Constructor.

virtual ~Case (void)
 Destructor.

virtual Caseclone (void) const=0
 Cloning/copying operation.

virtual CORBA::Anylabel (void) const=0
char const * name (void) const
 Get the name of the union case/member.

void name (char const *the_name)
 Set the name of the union case/member.

CORBA::TypeCode_ptr type (void) const
 Get the CORBA::TypeCode of the union case/member.

void type (CORBA::TypeCode_ptr tc)
 Set the CORBA::TypeCode of the union case/member.

bool marshal (TAO_OutputCDR &cdr, CORBA::ULong offset) const
bool equal (CORBA::ULong index, CORBA::TypeCode_ptr tc) const
bool equivalent (CORBA::ULong index, CORBA::TypeCode_ptr tc) const

Protected Member Functions

virtual bool marshal_label (TAO_OutputCDR &cdr) const=0
virtual bool equal_label (CORBA::ULong index, CORBA::TypeCode_ptr tc) const=0
 Verify equality of member labels.


Private Attributes

StringType name_
 The name of the case.

TypeCodeType type_
 Pointer to the CORBA::TypeCode of the case.


Detailed Description

template<typename StringType, typename TypeCodeType>
class TAO::TypeCode::Case< StringType, TypeCodeType >

Abstract base class for that represents an IDL union case/member.

This class hides the actual IDL union member label value from the TAO::TypeCode::Union class by relying on a CORBA::Any return value that corresponds to the CORBA::TypeCode::member_label() return type. It also allows the TAO::TypeCode::Union class to marshal the member label values into a CDR stream without knowledge of the underlying member label values.

Definition at line 56 of file TypeCode_Case_Base_T.h.


Constructor & Destructor Documentation

template<typename StringType, typename TypeCodeType>
TAO_BEGIN_VERSIONED_NAMESPACE_DECL ACE_INLINE TAO::TypeCode::Case< StringType, TypeCodeType >::Case char const *  name,
TypeCodeType  tc
 

Constructor.

Constructor used when creating static union TypeCodes.

Definition at line 12 of file TypeCode_Case_Base_T.inl.

00015   : name_ (member_name)
00016   , type_ (member_type)
00017 {
00018 }

template<typename StringType, typename TypeCodeType>
ACE_INLINE TAO::TypeCode::Case< StringType, TypeCodeType >::Case void   ) 
 

Constructor.

Constructor used when creating dynamic union TypeCodes.

Definition at line 22 of file TypeCode_Case_Base_T.inl.

00023   : name_ ()
00024   , type_ ()
00025 {
00026   // Only used when StringType and TypeCodeType are CORBA::String_var
00027   // and CORBA::TypeCode_var, respectively.
00028 }

template<typename StringType, typename TypeCodeType>
TAO_BEGIN_VERSIONED_NAMESPACE_DECL TAO::TypeCode::Case< StringType, TypeCodeType >::~Case void   )  [virtual]
 

Destructor.

Definition at line 16 of file TypeCode_Case_Base_T.cpp.

00017 {
00018 }


Member Function Documentation

template<typename StringType, typename TypeCodeType>
virtual Case* TAO::TypeCode::Case< StringType, TypeCodeType >::clone void   )  const [pure virtual]
 

Cloning/copying operation.

Implemented in TAO::TypeCode::Case_Enum_T< StringType, TypeCodeType >, and TAO::TypeCode::Case_T< DiscriminatorType, StringType, TypeCodeType >.

Referenced by ACE::VP_traits< TAO::TypeCode::Case_Dynamic >::clone().

template<typename StringType, typename TypeCodeType>
bool TAO::TypeCode::Case< StringType, TypeCodeType >::equal CORBA::ULong  index,
CORBA::TypeCode_ptr  tc
const
 

Check for equality of the case attributes contained by this class and the corresponding member attributes at index "index" in the given TypeCode tc.

Definition at line 22 of file TypeCode_Case_Base_T.cpp.

References TAO::TypeCode::Case< StringType, TypeCodeType >::equal_label(), TAO::TypeCode::Case< StringType, TypeCodeType >::name(), ACE_OS::strcmp(), and TAO::TypeCode::Case< StringType, TypeCodeType >::type().

Referenced by TAO::TypeCode::Union< StringType, TypeCodeType, CaseArrayType, RefCountPolicy >::equal_i().

00025 {
00026   // Check case names.
00027   char const * const lhs_name = this->name ();
00028   char const * const rhs_name = tc->member_name (index
00029                                                 );
00030 
00031   if (ACE_OS::strcmp (lhs_name, rhs_name) != 0)
00032     return false;
00033 
00034   // Check case TypeCodes.
00035   CORBA::TypeCode_ptr const lhs_tc = this->type ();
00036   CORBA::TypeCode_var const rhs_tc =
00037     tc->member_type (index
00038                     );
00039 
00040   CORBA::Boolean const equal_members =
00041     lhs_tc->equal (rhs_tc.in ()
00042                   );
00043 
00044   if (!equal_members)
00045     return false;
00046 
00047   // Check case label.
00048   return this->equal_label (index,
00049                             tc
00050                            );
00051 }

template<typename StringType, typename TypeCodeType>
virtual bool TAO::TypeCode::Case< StringType, TypeCodeType >::equal_label CORBA::ULong  index,
CORBA::TypeCode_ptr  tc
const [protected, pure virtual]
 

Verify equality of member labels.

Performing member label equality comparisons in the Case subclass allows us to avoid performing interpretive extraction of the value from the Any returned from the "right hand side" operand TypeCode since the Case subclass already knows what type and value should be extracted from the Any.

Parameters:
index Member index of given TypeCode tc being tested.
tc The TypeCode whose member "@a index" label is being tested.

Implemented in TAO::TypeCode::Case_Enum_T< StringType, TypeCodeType >, and TAO::TypeCode::Case_T< DiscriminatorType, StringType, TypeCodeType >.

Referenced by TAO::TypeCode::Case< StringType, TypeCodeType >::equal(), and TAO::TypeCode::Case< StringType, TypeCodeType >::equivalent().

template<typename StringType, typename TypeCodeType>
bool TAO::TypeCode::Case< StringType, TypeCodeType >::equivalent CORBA::ULong  index,
CORBA::TypeCode_ptr  tc
const
 

Check for equivalence of the case attributes contained by this class and the corresponding member attributes at index "@a index" in the given TypeCode tc.

Definition at line 55 of file TypeCode_Case_Base_T.cpp.

References TAO::TypeCode::Case< StringType, TypeCodeType >::equal_label(), and TAO::TypeCode::Case< StringType, TypeCodeType >::type().

Referenced by TAO::TypeCode::Union< StringType, TypeCodeType, CaseArrayType, RefCountPolicy >::equivalent_i().

00059 {
00060   // Member names are ignore when determining equivalence.
00061 
00062   // Check case TypeCodes.
00063   CORBA::TypeCode_ptr const lhs_tc = this->type ();
00064   CORBA::TypeCode_var const rhs_tc =
00065     tc->member_type (index
00066                     );
00067 
00068   CORBA::Boolean const equivalent_members =
00069     lhs_tc->equivalent (rhs_tc.in ()
00070                        );
00071 
00072   if (!equivalent_members)
00073     return 0;
00074 
00075   // Check case label.
00076   // The label must be equal when determining equivalence, too.
00077   return this->equal_label (index,
00078                             tc
00079                            );
00080 }

template<typename StringType, typename TypeCodeType>
virtual CORBA::Any* TAO::TypeCode::Case< StringType, TypeCodeType >::label void   )  const [pure virtual]
 

Return the IDL union case label value embedded within a CORBA::Any.

Implemented in TAO::TypeCode::Case_Enum_T< StringType, TypeCodeType >, and TAO::TypeCode::Case_T< DiscriminatorType, StringType, TypeCodeType >.

template<typename StringType, typename TypeCodeType>
ACE_INLINE bool TAO::TypeCode::Case< StringType, TypeCodeType >::marshal TAO_OutputCDR cdr,
CORBA::ULong  offset
const
 

Marshal this IDL union member into the given output CDR stream.

Definition at line 32 of file TypeCode_Case_Base_T.inl.

References TAO::TypeCode::Case< StringType, TypeCodeType >::marshal_label(), and ACE_OutputCDR::total_length().

Referenced by TAO::TypeCode::Union< StringType, TypeCodeType, CaseArrayType, RefCountPolicy >::tao_marshal().

00035 {
00036   return
00037     this->marshal_label (cdr)
00038     && (cdr << TAO_OutputCDR::from_string (
00039          Traits<StringType>::get_string (this->name_), 0))
00040     && TAO::TypeCode::marshal (cdr,
00041                                Traits<StringType>::get_typecode (this->type_),
00042                                offset + cdr.total_length ());
00043 }

template<typename StringType, typename TypeCodeType>
virtual bool TAO::TypeCode::Case< StringType, TypeCodeType >::marshal_label TAO_OutputCDR cdr  )  const [protected, pure virtual]
 

Marshal the IDL union case label value into the given output CDR stream.

Implemented in TAO::TypeCode::Case_Enum_T< StringType, TypeCodeType >, and TAO::TypeCode::Case_T< DiscriminatorType, StringType, TypeCodeType >.

Referenced by TAO::TypeCode::Case< StringType, TypeCodeType >::marshal().

template<typename StringType, typename TypeCodeType>
ACE_INLINE void TAO::TypeCode::Case< StringType, TypeCodeType >::name char const *  the_name  ) 
 

Set the name of the union case/member.

Definition at line 55 of file TypeCode_Case_Base_T.inl.

00057 {
00058   this->name_ = the_name;
00059 }

template<typename StringType, typename TypeCodeType>
ACE_INLINE char const * TAO::TypeCode::Case< StringType, TypeCodeType >::name void   )  const
 

Get the name of the union case/member.

Definition at line 47 of file TypeCode_Case_Base_T.inl.

Referenced by TAO::TypeCode::Case< StringType, TypeCodeType >::equal().

00048 {
00049   return
00050     Traits<StringType>::get_string (this->name_);
00051 }

template<typename StringType, typename TypeCodeType>
ACE_INLINE void TAO::TypeCode::Case< StringType, TypeCodeType >::type CORBA::TypeCode_ptr  tc  ) 
 

Set the CORBA::TypeCode of the union case/member.

Note:
CORBA::TypeCode::_duplicate() is called on the TypeCode tc.

Definition at line 71 of file TypeCode_Case_Base_T.inl.

References CORBA::TypeCode::_duplicate().

00072 {
00073   // This assignment works since it is only used when TypeCodeType is
00074   // "CORBA::TypeCode_var", not in the "CORBA::TypeCode_ptr const *"
00075   // case.
00076   this->type_ = CORBA::TypeCode::_duplicate (tc);
00077 }

template<typename StringType, typename TypeCodeType>
ACE_INLINE CORBA::TypeCode_ptr TAO::TypeCode::Case< StringType, TypeCodeType >::type void   )  const
 

Get the CORBA::TypeCode of the union case/member.

Note:
The reference count is not manipulated by this method, i.e., ownership is retained by this class.

Definition at line 63 of file TypeCode_Case_Base_T.inl.

Referenced by TAO::TypeCode::Case< StringType, TypeCodeType >::equal(), and TAO::TypeCode::Case< StringType, TypeCodeType >::equivalent().

00064 {
00065   return
00066     Traits<StringType>::get_typecode (this->type_);
00067 }


Member Data Documentation

template<typename StringType, typename TypeCodeType>
StringType TAO::TypeCode::Case< StringType, TypeCodeType >::name_ [private]
 

The name of the case.

Definition at line 142 of file TypeCode_Case_Base_T.h.

template<typename StringType, typename TypeCodeType>
TypeCodeType TAO::TypeCode::Case< StringType, TypeCodeType >::type_ [private]
 

Pointer to the CORBA::TypeCode of the case.

A pointer to the CORBA::TypeCode_ptr rather than the CORBA::TypeCode_ptr itself is stored since that address is well-defined. We may not know the value of the CORBA::TypeCode_ptr when creating this Case statically at compile-time, hence the indirection.

Note:
This TypeCode is released upon destruction of this Case.

Definition at line 155 of file TypeCode_Case_Base_T.h.


The documentation for this class was generated from the following files:
Generated on Sun Jan 27 13:22:14 2008 for TAO_AnyTypeCode by doxygen 1.3.6