Object_Reference_Traits_T.h

Go to the documentation of this file.
00001 #ifndef guard_object_reference_traits_hpp
00002 #define guard_object_reference_traits_hpp
00003 /**
00004  * @file
00005  *
00006  * @brief Implement the element manipulation traits for object
00007  *        reference types.
00008  *
00009  * $Id: Object_Reference_Traits_T.h 77683 2007-03-12 21:42:05Z ossama $
00010  *
00011  * @author Carlos O'Ryan
00012  */
00013 #include "Object_Reference_Traits_Base_T.h"
00014 
00015 #include <algorithm>
00016 #include <functional>
00017 
00018 TAO_BEGIN_VERSIONED_NAMESPACE_DECL
00019 
00020 namespace TAO
00021 {
00022 namespace details
00023 {
00024 
00025 template<class object_t, class object_t_var, class derived>
00026 struct object_reference_traits_decorator
00027 {
00028   typedef object_t object_type;
00029   typedef object_type * value_type;
00030   typedef object_type const * const_value_type;
00031   typedef object_t_var object_type_var;
00032 
00033   inline static void zero_range(
00034       object_type ** begin, object_type ** end)
00035   {
00036     std::fill(begin, end, derived::nil());
00037   }
00038 
00039   inline static void initialize_range(
00040       object_type ** begin, object_type ** end)
00041   {
00042     std::generate(begin, end, &derived::default_initializer);
00043   }
00044 
00045 # ifndef ACE_LACKS_MEMBER_TEMPLATES
00046   // Allow MSVC++ >= 8 checked iterators to be used.
00047   template <typename iter>
00048   inline static void copy_range(
00049       object_type ** begin, object_type ** end, iter dst)
00050   {
00051     std::transform(begin, end, dst, &derived::duplicate);
00052   }
00053 #else
00054   inline static void copy_range(
00055       object_type ** begin, object_type ** end, object_type ** dst)
00056   {
00057     std::transform(begin, end, dst, &derived::duplicate);
00058   }
00059 # endif  /* !ACE_LACKS_MEMBER_TEMPLATES */
00060 
00061   inline static void release_range(
00062       object_type ** begin, object_type ** end)
00063   {
00064     std::for_each(begin, end, &derived::release);
00065   }
00066 
00067   inline static object_type const * initialize_if_zero(object_type * & element)
00068   {
00069     if (element == 0)
00070     {
00071       element = derived::nil();
00072     }
00073     return element;
00074   }
00075 };
00076 
00077 template<typename object_t, typename object_t_var, bool dummy>
00078 struct object_reference_traits
00079   : public object_reference_traits_base<object_t, object_t_var>
00080   , public object_reference_traits_decorator<object_t, object_t_var, object_reference_traits<object_t,object_t_var,dummy> >
00081 {
00082   typedef object_t object_type;
00083   typedef object_type * value_type;
00084   typedef object_type const * const_value_type;
00085   typedef object_t_var object_type_var;
00086 };
00087 
00088 } // namespace details
00089 } // namespace CORBA
00090 
00091 TAO_END_VERSIONED_NAMESPACE_DECL
00092 
00093 #endif // guard_object_reference_traits_hpp

Generated on Tue Feb 2 17:37:52 2010 for TAO by  doxygen 1.4.7