diff --git a/include/boost/iterator/iterator_archetypes.hpp b/include/boost/iterator/iterator_archetypes.hpp index 9ebac63..b0ab188 100644 --- a/include/boost/iterator/iterator_archetypes.hpp +++ b/include/boost/iterator/iterator_archetypes.hpp @@ -10,6 +10,9 @@ #include #include #include +#include + +#include #include #include @@ -25,8 +28,6 @@ #include #include -#include - #include namespace boost { @@ -117,28 +118,29 @@ namespace detail template struct operator_brackets - : mpl::apply_if< - is_convertible - , mpl::apply_if< - iterator_archetypes::has_access< - AccessCategory - , iterator_archetypes::writable_iterator_t - > - , mpl::identity > - , mpl::if_< + : mpl::aux::msvc_eti_base< + typename mpl::apply_if< + is_convertible + , mpl::apply_if< iterator_archetypes::has_access< AccessCategory - , iterator_archetypes::readable_iterator_t + , iterator_archetypes::writable_iterator_t + > + , mpl::identity > + , mpl::if_< + iterator_archetypes::has_access< + AccessCategory + , iterator_archetypes::readable_iterator_t + > + , readable_operator_brackets + , no_operator_brackets > - , readable_operator_brackets - , no_operator_brackets > - > - , mpl::identity + , mpl::identity + >::type >::type - { - }; - + {}; + template struct traversal_archetype_impl { @@ -376,54 +378,71 @@ struct traversal_archetype_base { }; +namespace detail +{ + template + struct iterator_archetype_base + : iterator_access_archetype + , traversal_archetype_base + { + typedef iterator_access_archetype access; + + typedef typename detail::facade_iterator_category< + TraversalCategory + , typename mpl::apply_if< + iterator_archetypes::has_access< + AccessCategory, iterator_archetypes::writable_iterator_t + > + , remove_const + , add_const + >::type + , typename access::reference + >::type iterator_category; + + // Needed for some broken libraries (see below) + typedef boost::iterator< + iterator_category + , Value + , typename traversal_archetype_base< + Value, AccessCategory, TraversalCategory + >::difference_type + , typename access::pointer + , typename access::reference + > workaround_iterator_base; + }; +} + template struct iterator_archetype - : public traversal_archetype_base - , public iterator_access_archetype + : public detail::iterator_archetype_base // These broken libraries require derivation from std::iterator // (or related magic) in order to handle iter_swap and other // iterator operations # if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, < 310) \ || BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(0x20101)) - - , public std::iterator< - iterator_tag - , typename iterator_access_archetype::value_type - , typename traversal_archetype_base< - Value, AccessCategory, TraversalCategory - >::difference_type - > + , public detail::iterator_archetype_base< + Value, AccessCategory, TraversalCategory + >::workaround_iterator_base # endif { - // Derivation from std::iterator above caused ambiguity, so now - // we have to declare all the types here. + // Derivation from std::iterator above caused references to nested + // types to be ambiguous, so now we have to redeclare them all + // here. # if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, < 310) \ || BOOST_WORKAROUND(_RWSTD_VER, BOOST_TESTED_AT(0x20101)) - typedef typename iterator_access_archetype::value_type value_type; - - typedef typename iterator_access_archetype::pointer pointer; - - typedef typename traversal_archetype_base< - Value, AccessCategory, TraversalCategory - >::difference_type difference_type; + typedef detail::iterator_archetype_base< + Value,AccessCategory,TraversalCategory + > base; + + typedef typename base::value_type value_type; + typedef typename base::reference reference; + typedef typename base::pointer pointer; + typedef typename base::difference_type difference_type; + typedef typename base::iterator_category iterator_category; # endif - typedef typename iterator_access_archetype::reference reference; - - typedef typename detail::facade_iterator_category< - TraversalCategory - , typename mpl::apply_if< - iterator_archetypes::has_access< - AccessCategory, iterator_archetypes::writable_iterator_t - > - , remove_const - , add_const - >::type - , reference - >::type iterator_category; - iterator_archetype(); iterator_archetype(iterator_archetype const&);