Go to the documentation of this file.00001 #ifndef guard_valuetype_traits_hpp
00002 #define guard_valuetype_traits_hpp
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #include "Valuetype_Traits_Base_T.h"
00013 #include "ace/OS_NS_string.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 valuetype_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 ACE_OS::memset (begin, 0, (end - begin) * sizeof (object_type*));
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 # if !defined (ACE_LACKS_MEMBER_TEMPLATES)
00046
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
00060
00061 # if !defined (ACE_LACKS_MEMBER_TEMPLATES)
00062
00063 template <typename iter>
00064 inline static void copy_swap_range(
00065 object_type ** begin, object_type ** end, iter dst)
00066 {
00067 std::swap_ranges(begin, end, dst);
00068 }
00069 # else
00070 inline static void copy_swap_range(
00071 object_type ** begin, object_type ** end, object_type ** dst)
00072 {
00073 std::swap_ranges(begin, end, dst);
00074 }
00075 # endif
00076
00077 inline static void release_range(
00078 object_type ** begin, object_type ** end)
00079 {
00080 std::for_each(begin, end, &derived::release);
00081 }
00082
00083 inline static object_type const * initialize_if_zero(object_type * & element)
00084 {
00085 if (element == 0)
00086 {
00087 element = derived::nil();
00088 }
00089 return element;
00090 }
00091 };
00092
00093 template<typename object_t, typename object_t_var, bool dummy>
00094 struct valuetype_traits
00095 : public valuetype_traits_base<object_t, object_t_var>
00096 , public valuetype_traits_decorator<object_t, object_t_var, valuetype_traits<object_t,object_t_var,dummy> >
00097 {
00098 typedef object_t object_type;
00099 typedef object_type * value_type;
00100 typedef object_type const * const_value_type;
00101 typedef object_t_var object_type_var;
00102 };
00103
00104 }
00105 }
00106
00107 TAO_END_VERSIONED_NAMESPACE_DECL
00108
00109 #endif // guard_valuetype_traits_hpp