From 962677e3051d85a52ad2aff4c2c11f20f31c6730 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Thu, 26 Dec 2002 00:22:34 +0000 Subject: [PATCH] Cleaned up flotsam and jetsam, simplified [SVN r795] --- .../boost/iterator/iterator_categories.hpp | 236 +++++++----------- 1 file changed, 92 insertions(+), 144 deletions(-) diff --git a/include/boost/iterator/iterator_categories.hpp b/include/boost/iterator/iterator_categories.hpp index 4a74022..fce5886 100644 --- a/include/boost/iterator/iterator_categories.hpp +++ b/include/boost/iterator/iterator_categories.hpp @@ -13,12 +13,13 @@ #include #include #include -#include #include #include #include #include #include +#include +#include #include namespace boost { @@ -68,107 +69,59 @@ namespace boost { // traversal_category. struct new_iterator_base { }; - namespace detail { - - struct return_category_from_nested_type { - template struct bind { - typedef typename Iterator::return_category type; - }; - }; - - struct traversal_category_from_nested_type { - template struct bind { - typedef typename Iterator::traversal_category type; - }; - }; + namespace detail + { template - struct choose_lvalue_return { - typedef typename ct_if::value, - boost::constant_lvalue_iterator_tag, - boost::mutable_lvalue_iterator_tag>::type type; + struct choose_lvalue_return + : mpl::if_< + is_const + , boost::constant_lvalue_iterator_tag + , boost::mutable_lvalue_iterator_tag> + { }; template - struct iter_category_to_return { - typedef typename ct_if< - is_convertible::value, - typename choose_lvalue_return::type, - typename ct_if< - is_convertible::value, - boost::readable_iterator_tag, - typename ct_if< - is_convertible::value, - boost::writable_iterator_tag, - boost::error_iterator_tag - >::type - >::type - >::type type; + struct iter_category_to_return + : mpl::if_< + is_convertible + , typename choose_lvalue_return::type + , typename mpl::if_< + is_convertible + , boost::readable_iterator_tag + , typename mpl::if_< + is_convertible + , boost::writable_iterator_tag + , boost::error_iterator_tag + >::type + >::type + > + { }; template - struct iter_category_to_traversal { - typedef typename ct_if< - is_convertible::value, - random_access_traversal_tag, - typename ct_if< - is_convertible::value, - bidirectional_traversal_tag, - typename ct_if< - is_convertible::value, - forward_traversal_tag, - typename ct_if< - is_convertible::value, - input_traversal_tag, - output_traversal_tag - >::type + struct iter_category_to_traversal + : mpl::if_< + is_convertible + , random_access_traversal_tag + , typename mpl::if_< + is_convertible + , bidirectional_traversal_tag + , typename mpl::if_< + is_convertible + , forward_traversal_tag + , typename mpl::if_< + is_convertible + , input_traversal_tag + , output_traversal_tag + >::type + >::type >::type - >::type - >::type type; + > + { }; -#if 0 - struct return_category_from_old_traits { - template class bind { - typedef boost::detail::iterator_traits OldTraits; - typedef typename OldTraits::iterator_category Cat; - typedef typename OldTraits::value_type value_type; - public: - typedef typename iter_category_to_return::type type; - }; - }; - - struct traversal_category_from_old_traits { - template class bind { - typedef boost::detail::iterator_traits OldTraits; - typedef typename OldTraits::iterator_category Cat; - public: - typedef typename iter_category_to_traversal::type type; - }; - }; - - template - class choose_return_category { - typedef typename ct_if::value, - return_category_from_nested_type, - return_category_from_old_traits>::type Choice; - public: - typedef typename Choice:: template bind::type type; - }; - - template - class choose_traversal_category { - typedef typename ct_if::value, - traversal_category_from_nested_type, - traversal_category_from_old_traits>::type Choice; - public: - typedef typename Choice:: template bind::type type; - }; -#else - BOOST_MPL_HAS_XXX_TRAIT_DEF(traversal) template @@ -180,23 +133,8 @@ namespace boost { , mpl::bool_c >::type { }; -#endif - } // namespace detail -#if 0 - template - struct return_category { - typedef typename detail::choose_return_category::type type; - }; - - - template - struct traversal_category { - typedef typename detail::choose_traversal_category::type type; - }; -#else - namespace detail { template @@ -231,28 +169,29 @@ namespace boost { } // namespace detail template - struct return_category { - typedef typename detail::return_category_tag< - typename detail::iterator_traits::iterator_category - , typename detail::iterator_traits::value_type>::type type; - }; + struct return_category + : detail::return_category_tag< + typename detail::iterator_traits::iterator_category + , typename detail::iterator_traits::value_type> + {}; template - struct traversal_category { - typedef typename detail::traversal_category_tag< - typename detail::iterator_traits::iterator_category - , typename detail::iterator_traits::value_type>::type type; + struct traversal_category + : detail::traversal_category_tag< + typename detail::iterator_traits::iterator_category + , typename detail::iterator_traits::value_type> + { }; -#endif #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) template struct return_category + : mpl::if_< + is_const + , constant_lvalue_iterator_tag + , mutable_lvalue_iterator_tag> { - typedef typename ct_if::value, - constant_lvalue_iterator_tag, - mutable_lvalue_iterator_tag>::type type; }; template @@ -264,34 +203,43 @@ namespace boost { #endif template - struct cvt_iterator_category { - typedef - typename mpl::if_c< - (is_convertible::value || is_convertible::value) - , typename mpl::if_c< - is_convertible::value - , std::random_access_iterator_tag - , typename mpl::if_< - is_convertible - , std::bidirectional_iterator_tag - , typename mpl::if_< - is_convertible - , std::forward_iterator_tag - , error_iterator_tag + struct cvt_iterator_category + : mpl::if_< + mpl::logical_or< + is_convertible + , is_convertible + > + , typename mpl::if_< + is_convertible + , std::random_access_iterator_tag + , typename mpl::if_< + is_convertible + , std::bidirectional_iterator_tag + , typename mpl::if_< + is_convertible + , std::forward_iterator_tag + , error_iterator_tag + >::type >::type >::type - >::type, - typename mpl::if_c< - (is_convertible::value && is_convertible::value) - , std::input_iterator_tag - , typename mpl::if_c< - (is_convertible::value - && is_convertible::value) - , std::output_iterator_tag - , error_iterator_tag - >::type - >::type - >::type type; + + , typename mpl::if_< + mpl::logical_and< + is_convertible + , is_convertible + > + , std::input_iterator_tag + , typename mpl::if_< + mpl::logical_and< + is_convertible + , is_convertible + > + , std::output_iterator_tag + , error_iterator_tag + >::type + >::type + > + { }; template