summaryrefslogtreecommitdiff
path: root/TAO/tao/AnyTypeCode/Enum_TypeCode.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/tao/AnyTypeCode/Enum_TypeCode.cpp')
-rw-r--r--TAO/tao/AnyTypeCode/Enum_TypeCode.cpp224
1 files changed, 224 insertions, 0 deletions
diff --git a/TAO/tao/AnyTypeCode/Enum_TypeCode.cpp b/TAO/tao/AnyTypeCode/Enum_TypeCode.cpp
new file mode 100644
index 00000000000..b84a50f9b72
--- /dev/null
+++ b/TAO/tao/AnyTypeCode/Enum_TypeCode.cpp
@@ -0,0 +1,224 @@
+// $Id$
+
+#ifndef TAO_ENUM_TYPECODE_CPP
+#define TAO_ENUM_TYPECODE_CPP
+
+#include "tao/AnyTypeCode/Enum_TypeCode.h"
+#include "tao/AnyTypeCode/TypeCode_Traits.h"
+#include "tao/TypeCodeFactory_Adapter.h"
+#include "tao/ORB_Core.h"
+#include "tao/CDR.h"
+
+#include "ace/Dynamic_Service.h"
+
+#ifndef __ACE_INLINE__
+# include "tao/AnyTypeCode/Enum_TypeCode.inl"
+#endif /* !__ACE_INLINE__ */
+
+TAO_BEGIN_VERSIONED_NAMESPACE_DECL
+
+template <typename StringType, class EnumeratorArrayType, class RefCountPolicy>
+bool
+TAO::TypeCode::Enum<StringType,
+ EnumeratorArrayType,
+ RefCountPolicy>::tao_marshal (TAO_OutputCDR & cdr,
+ CORBA::ULong) const
+{
+ // A tk_enum TypeCode has a "complex" parameter list type (see
+ // Table 15-2 in Section 15.3.5.1 "TypeCode" in the CDR section of
+ // the CORBA specification), meaning that it must be marshaled into
+ // a CDR encapsulation.
+
+ // Create a CDR encapsulation.
+ TAO_OutputCDR enc;
+
+ bool const success =
+ (enc << TAO_OutputCDR::from_boolean (TAO_ENCAP_BYTE_ORDER))
+ && (enc << TAO_OutputCDR::from_string (this->base_attributes_.id (), 0))
+ && (enc << TAO_OutputCDR::from_string (this->base_attributes_.name (), 0))
+ && (enc << this->nenumerators_);
+
+ if (!success)
+ return false;
+
+ StringType const * const begin = &this->enumerators_[0];
+ StringType const * const end = begin + this->nenumerators_;
+
+ for (StringType const * i = begin; i != end; ++i)
+ {
+ StringType const & enumerator = *i;
+
+ if (!(enc << TAO_OutputCDR::from_string (
+ Traits<StringType>::get_string (enumerator), 0)))
+ return false;
+ }
+
+ return
+ cdr << static_cast<CORBA::ULong> (enc.total_length ())
+ && cdr.write_octet_array_mb (enc.begin ());
+}
+
+template <typename StringType, class EnumeratorArrayType, class RefCountPolicy>
+void
+TAO::TypeCode::Enum<StringType,
+ EnumeratorArrayType,
+ RefCountPolicy>::tao_duplicate (void)
+{
+ this->RefCountPolicy::add_ref ();
+}
+
+template <typename StringType, class EnumeratorArrayType, class RefCountPolicy>
+void
+TAO::TypeCode::Enum<StringType,
+ EnumeratorArrayType,
+ RefCountPolicy>::tao_release (void)
+{
+ this->RefCountPolicy::remove_ref ();
+}
+
+template <typename StringType, class EnumeratorArrayType, class RefCountPolicy>
+CORBA::Boolean
+TAO::TypeCode::Enum<StringType,
+ EnumeratorArrayType,
+ RefCountPolicy>::equal_i (
+ CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL) const
+{
+ // This call shouldn't throw since CORBA::TypeCode::equal() verified
+ // that the TCKind is the same as our's prior to invoking this
+ // method, meaning that member_count() is supported.
+
+ CORBA::ULong const tc_nenumerators =
+ tc->member_count (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ if (tc_nenumerators != this->nenumerators_)
+ return false;
+
+ for (CORBA::ULong i = 0; i < this->nenumerators_; ++i)
+ {
+ StringType const & lhs_enumerator = this->enumerators_[i];
+
+ char const * const lhs_name =
+ Traits<StringType>::get_string (lhs_enumerator);
+ char const * const rhs_name = tc->member_name (i
+ ACE_ENV_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ if (ACE_OS::strcmp (lhs_name, rhs_name) != 0)
+ return false;
+ }
+
+ return true;
+}
+
+template <typename StringType, class EnumeratorArrayType, class RefCountPolicy>
+CORBA::Boolean
+TAO::TypeCode::Enum<StringType,
+ EnumeratorArrayType,
+ RefCountPolicy>::equivalent_i (
+ CORBA::TypeCode_ptr tc
+ ACE_ENV_ARG_DECL) const
+{
+ // Perform a structural comparison, excluding the name() and
+ // member_name() operations.
+
+ CORBA::ULong const tc_nenumerators =
+ tc->member_count (ACE_ENV_SINGLE_ARG_PARAMETER);
+ ACE_CHECK_RETURN (false);
+
+ if (tc_nenumerators != this->nenumerators_)
+ return false;
+
+ return true;
+}
+
+template <typename StringType, class EnumeratorArrayType, class RefCountPolicy>
+CORBA::TypeCode_ptr
+TAO::TypeCode::Enum<StringType,
+ EnumeratorArrayType,
+ RefCountPolicy>::get_compact_typecode_i (
+ ACE_ENV_SINGLE_ARG_DECL) const
+{
+ ACE_Array_Base<CORBA::String_var> tc_enumerators (this->nenumerators_);
+
+ // Dynamically construct a new array of enumerators stripped of
+ // member names.
+
+ static char const empty_name[] = "";
+
+ for (CORBA::ULong i = 0; i < this->nenumerators_; ++i)
+ {
+ // Member names will be stripped, i.e. not embedded within
+ // the compact TypeCode.
+
+ tc_enumerators[i] = empty_name;
+ }
+
+ TAO_TypeCodeFactory_Adapter * adapter =
+ ACE_Dynamic_Service<TAO_TypeCodeFactory_Adapter>::instance (
+ TAO_ORB_Core::typecodefactory_adapter_name ());
+
+ if (adapter == 0)
+ {
+ ACE_THROW_RETURN (CORBA::INTERNAL (),
+ CORBA::TypeCode::_nil ());
+ }
+
+ return
+ adapter->create_enum_tc (this->base_attributes_.id (),
+ "" /* empty name */,
+ tc_enumerators,
+ this->nenumerators_
+ ACE_ENV_ARG_PARAMETER);
+}
+
+template <typename StringType, class EnumeratorArrayType, class RefCountPolicy>
+char const *
+TAO::TypeCode::Enum<StringType, EnumeratorArrayType, RefCountPolicy>::id_i (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED) const
+{
+ // Ownership is retained by the TypeCode, as required by the C++
+ // mapping.
+ return this->base_attributes_.id ();
+}
+
+template <typename StringType, class EnumeratorArrayType, class RefCountPolicy>
+char const *
+TAO::TypeCode::Enum<StringType, EnumeratorArrayType, RefCountPolicy>::name_i (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED) const
+{
+ // Ownership is retained by the TypeCode, as required by the C++
+ // mapping.
+ return this->base_attributes_.name ();
+}
+
+template <typename StringType, class EnumeratorArrayType, class RefCountPolicy>
+CORBA::ULong
+TAO::TypeCode::Enum<StringType,
+ EnumeratorArrayType,
+ RefCountPolicy>::member_count_i (
+ ACE_ENV_SINGLE_ARG_DECL_NOT_USED) const
+{
+ return this->nenumerators_;
+}
+
+template <typename StringType, class EnumeratorArrayType, class RefCountPolicy>
+char const *
+TAO::TypeCode::Enum<StringType,
+ EnumeratorArrayType,
+ RefCountPolicy>::member_name_i (
+ CORBA::ULong index
+ ACE_ENV_ARG_DECL) const
+{
+ // Ownership is retained by the TypeCode, as required by the C++
+ // mapping.
+ if (index >= this->nenumerators_)
+ ACE_THROW_RETURN (CORBA::TypeCode::Bounds (), 0);
+
+ return Traits<StringType>::get_string (this->enumerators_[index]);
+}
+
+TAO_END_VERSIONED_NAMESPACE_DECL
+
+#endif /* TAO_ENUM_TYPECODE_CPP */