diff --git a/include/boost/python/suite/indexing/iterator_traits.hpp b/include/boost/python/suite/indexing/iterator_traits.hpp index dc487f6c..00b003c7 100755 --- a/include/boost/python/suite/indexing/iterator_traits.hpp +++ b/include/boost/python/suite/indexing/iterator_traits.hpp @@ -27,6 +27,7 @@ #include #include #include +#include namespace boost { namespace python { namespace indexing { #if !BOOST_MSVC @@ -58,10 +59,10 @@ namespace boost { namespace python { namespace indexing { typedef ::boost::detail::iterator_traits std_traits; public: - typedef Iterator iterator; - typedef typename std_traits::value_type value_type; - typedef typename std_traits::reference reference; - typedef typename std_traits::difference_type difference_type; + typedef Iterator iterator; + typedef BOOST_DEDUCED_TYPENAME std_traits::value_type value_type; + typedef BOOST_DEDUCED_TYPENAME std_traits::reference reference; + typedef BOOST_DEDUCED_TYPENAME std_traits::difference_type difference_type; BOOST_STATIC_CONSTANT (bool, has_copyable_iter = false); BOOST_STATIC_CONSTANT (bool, is_reorderable = false); @@ -94,67 +95,10 @@ namespace boost { namespace python { namespace indexing { }; namespace iterator_detail { - typedef char input_sizer[1]; - typedef char forward_sizer[2]; - typedef char bidirectional_sizer[3]; - typedef char random_access_sizer[4]; - -#if BOOST_WORKAROUND(__EDG_VERSION__, <= 238) - // Fix tested on "MIPSpro Compilers: Version 7.3.1.3m", where the - // overload resolution variant causes an "ambiguous by inheritance" - // error without even instantiating traits_by_category - - template struct is_random_access { - static bool const value = ::boost::is_convertible< - Category, std::random_access_iterator_tag>::value; - }; - - template struct is_bidirectional { - static bool const value = ::boost::is_convertible< - Category, std::bidirectional_iterator_tag>::value; - }; - - template struct is_forward { - static bool const value = ::boost::is_convertible< - Category, std::forward_iterator_tag>::value; - }; - - template struct is_input { - static bool const value = ::boost::is_convertible< - Category, std::input_iterator_tag>::value; - }; - - template struct sizer_struct { - BOOST_STATIC_CONSTANT (size_t, value = - (is_random_access::value - ? sizeof (random_access_sizer) - : (is_bidirectional::value - ? sizeof (bidirectional_sizer) - : (is_forward::value - ? sizeof (forward_sizer) - : (is_input::value - ? sizeof (input_sizer) - : 0))))); - }; - -#else - - input_sizer &sizer_fn (std::input_iterator_tag const &); - forward_sizer &sizer_fn (std::forward_iterator_tag const &); - bidirectional_sizer &sizer_fn (std::bidirectional_iterator_tag const &); - random_access_sizer &sizer_fn (std::random_access_iterator_tag const &); - - template struct sizer_struct { - BOOST_STATIC_CONSTANT (size_t, value = - sizeof (sizer_fn (Category()))); - }; - -#endif - - template struct traits_by_size { }; + template struct traits_by_category { }; template<> - struct traits_by_size { + struct traits_by_category { template struct traits { typedef input_iterator_traits type; @@ -162,7 +106,7 @@ namespace boost { namespace python { namespace indexing { }; template<> - struct traits_by_size { + struct traits_by_category { template struct traits { typedef forward_iterator_traits type; @@ -170,7 +114,7 @@ namespace boost { namespace python { namespace indexing { }; template<> - struct traits_by_size { + struct traits_by_category { template struct traits { typedef bidirectional_iterator_traits type; @@ -178,7 +122,7 @@ namespace boost { namespace python { namespace indexing { }; template<> - struct traits_by_size { + struct traits_by_category { template struct traits { typedef random_access_iterator_traits type; @@ -186,21 +130,22 @@ namespace boost { namespace python { namespace indexing { }; template - class traits_by_category { - typedef typename BOOST_ITERATOR_CATEGORY::type category; + class deduced_traits { + typedef BOOST_DEDUCED_TYPENAME BOOST_ITERATOR_CATEGORY< + Iterator>::type category; - BOOST_STATIC_CONSTANT ( - size_t, size = sizer_struct::value); + typedef BOOST_DEDUCED_TYPENAME ::boost::detail::std_category < + category>::type max_category; public: - typedef typename traits_by_size + typedef typename traits_by_category ::template traits::type type; }; } template struct iterator_traits - : public iterator_detail::traits_by_category::type + : public iterator_detail::deduced_traits::type { }; } } }