diff --git a/include/boost/iterator_adaptors.hpp b/include/boost/iterator_adaptors.hpp index 9a40dd2..6f313a6 100644 --- a/include/boost/iterator_adaptors.hpp +++ b/include/boost/iterator_adaptors.hpp @@ -390,8 +390,51 @@ namespace detail { i.policies().decrement(i.iter()); } +# ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION + template + struct iterator_defaults_select + { + template + struct traits + { + typedef typename boost::detail::iterator_traits::value_type value_type; + typedef typename boost::detail::iterator_traits::pointer pointer; + typedef typename boost::detail::iterator_traits::reference reference; + }; + }; + + template <> + struct iterator_defaults_select + { + template + struct traits + { + typedef Value value_type; + typedef Value* pointer; + typedef Value& reference; + }; + }; + + template + struct iterator_defaults + { + enum { is_ptr = boost::is_pointer::value }; + typedef iterator_defaults_select::template traits traits; + typedef typename traits::pointer pointer; + typedef typename traits::reference reference; + }; +# else + template + struct iterator_defaults : iterator_traits + { + typedef typename iterator_traits::pointer pointer; + typedef typename iterator_traits::reference reference; + }; + +# endif } // namespace detail + //============================================================================ //iterator_adaptor - Adapts a generic piece of data as an iterator. Adaptation // is especially easy if the data being adapted is itself an iterator @@ -778,52 +821,10 @@ struct reverse_iterator_policies : public default_iterator_policies { return y < x; } }; -#ifdef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION -namespace detail { - template - struct iterator_defaults_select - { - template - struct traits - { - typedef typename boost::detail::iterator_traits::value_type value_type; - typedef typename boost::detail::iterator_traits::pointer pointer; - typedef typename boost::detail::iterator_traits::reference reference; - }; - }; - - template <> - struct iterator_defaults_select - { - template - struct traits - { - typedef Value value_type; - typedef Value* pointer; - typedef Value& reference; - }; - }; - - template - struct iterator_defaults - { - enum { is_ptr = boost::is_pointer::value }; - typedef iterator_defaults_select::template traits traits; - typedef typename traits::pointer pointer; - typedef typename traits::reference reference; - }; -} -#endif - template ::value_type, -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - class Pointer = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_traits::pointer, - class Reference = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_traits::reference, -#else class Pointer = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_defaults::pointer, class Reference = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_defaults::reference, -#endif class Category = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_traits::iterator_category, class Distance = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_traits::difference_type > @@ -969,25 +970,32 @@ namespace detail { template struct non_bidirectional_category { +# if !defined(__MWERKS__) || __MWERKS__ > 0x4000 typedef typename reduce_to_base_class< std::forward_iterator_tag, typename iterator_traits::iterator_category >::type type; - + private: // For some reason, putting this assertion in filter_iterator_generator fails inexplicably under MSVC BOOST_STATIC_ASSERT((!boost::is_convertible::value)); +# else + // is_convertible doesn't work with MWERKS + typedef typename iterator_traits::iterator_category input_category; + typedef typename if_true<( + boost::is_same::value + || boost::is_same::value + )>::template then< + std::forward_iterator_tag, + input_category + >::type type; +# endif }; } template ::value_type, -#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - class Pointer = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_traits::pointer, - class Reference = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_traits::reference, -#else - class Pointer = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_defaults::pointer, class Reference = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_defaults::reference, -#endif + class Pointer = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_defaults::pointer, class Category = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::non_bidirectional_category::type, class Distance = BOOST_ARG_DEPENDENT_TYPENAME boost::detail::iterator_traits::difference_type >