diff options
Diffstat (limited to 'TAO/tao/Array_Traits_T.h')
-rw-r--r-- | TAO/tao/Array_Traits_T.h | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/TAO/tao/Array_Traits_T.h b/TAO/tao/Array_Traits_T.h new file mode 100644 index 00000000000..76f9c5d5ea7 --- /dev/null +++ b/TAO/tao/Array_Traits_T.h @@ -0,0 +1,94 @@ +#ifndef guard_array_traits_hpp +#define guard_array_traits_hpp +/** + * @file + * + * @brief Implement the element manipulation traits for types with + * array-like semantics. + * + * $Id$ + * + * @author Carlos O'Ryan + */ + +#include <algorithm> +#include "tao/Array_VarOut_T.h" + +TAO_BEGIN_VERSIONED_NAMESPACE_DECL + +namespace TAO +{ +namespace details +{ + +template <typename T_forany> +struct array_traits +{ + typedef T_forany forany_type; + typedef typename T_forany::_array_type value_type; + typedef typename T_forany::_array_type const const_value_type; + typedef typename T_forany::_slice_type slice_type; + + inline static void copy (slice_type * _tao_to, const slice_type * _tao_from) + { + TAO::Array_Traits<forany_type>::copy (_tao_to, _tao_from); + } + + inline static void free (slice_type * value) + { + TAO::Array_Traits<forany_type>::free (value); + } + + inline static slice_type * alloc (void) + { + return TAO::Array_Traits<forany_type>::alloc (); + } + + inline static slice_type * dup( + const slice_type * value) + { + return TAO::Array_Traits<forany_type>::dup (value); + } + + inline static void zero_range( + value_type * begin, value_type * end) + { + std::for_each( + begin, end, &TAO::Array_Traits<forany_type>::zero); + } + + inline static void initialize_range( + value_type * begin, value_type * end) + { + std::for_each( + begin, end, &TAO::Array_Traits<forany_type>::zero); + } +# ifndef ACE_LACKS_MEMBER_TEMPLATES + // Allow MSVC++ >= 8 checked iterators to be used. + template <typename iter> + inline static void copy_range( + value_type * begin, value_type * end, iter dst) + { + for(value_type * i = begin; i != end; ++i, ++dst) + { + TAO::Array_Traits<forany_type>::copy(*dst, *i); + } + } +#else + inline static void copy_range( + value_type * begin, value_type * end, value_type *dst) + { + for(value_type * i = begin; i != end; ++i, ++dst) + { + TAO::Array_Traits<forany_type>::copy(*dst, *i); + } + } +# endif /* !ACE_LACKS_MEMBER_TEMPLATES */ +}; + +} // namespace details +} // namespace CORBA + +TAO_END_VERSIONED_NAMESPACE_DECL + +#endif // guard_array_traits_hpp |