From 20f188d971581e4d0c74df06e0e1d85baf9453d2 Mon Sep 17 00:00:00 2001 From: Dave Abrahams Date: Tue, 23 Sep 2003 22:58:59 +0000 Subject: [PATCH] progress [SVN r20167] --- include/boost/iterator/detail/categories.hpp | 78 +++++++++---------- .../boost/iterator/iterator_categories.hpp | 12 ++- 2 files changed, 46 insertions(+), 44 deletions(-) diff --git a/include/boost/iterator/detail/categories.hpp b/include/boost/iterator/detail/categories.hpp index 84e0936..167100a 100644 --- a/include/boost/iterator/detail/categories.hpp +++ b/include/boost/iterator/detail/categories.hpp @@ -21,6 +21,7 @@ # include # include # include +# include # include # include @@ -84,7 +85,7 @@ namespace boost namespace detail { template - access_c : mpl::integral_c + struct access_c : mpl::integral_c {}; @@ -226,22 +227,28 @@ namespace boost # endif // ndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION - template - struct known_tag - : mpl::apply_if, mpl::identity, Else> + // If TraversalTag is convertible to Known, return it, otherwise + // return the result of invoking NullaryElse + template + struct known_traversal_tag + : mpl::apply_if< + is_convertible + , mpl::identity + , NullaryElse + > {}; template struct max_known_traversal_tag - : known_tag< + : known_traversal_tag< Tag, random_access_traversal_tag - , known_tag< + , known_traversal_tag< Tag, bidirectional_traversal_tag - , known_tag< + , known_traversal_tag< Tag, forward_traversal_tag - , known_tag< + , known_traversal_tag< Tag, single_pass_traversal_tag - , known_tag< + , known_traversal_tag< Tag, incrementable_traversal_tag , error_iterator_tag > @@ -251,24 +258,34 @@ namespace boost > {}; + template + struct known_access_tag + : mpl::apply_if_c< + ((AccessTag::value & Known) == Known) + , mpl::identity > + , NullaryElse + > + {}; + + // Doesn't cope with these odd combinations: readable+swappable, // writable+swappable. That doesn't matter for the sake of // new-style tag base computation, which is all it's used for // anyway. template struct max_known_access_tag - : known_tag< - Tag, writable_lvalue_iterator_tag - , known_tag< - Tag, readable_lvalue_iterator_tag - , known_tag< - Tag, readable_writable_iterator_tag - , known_tag< - Tag, writable_iterator_tag - , known_tag< - Tag, readable_iterator_tag - , mpl::apply_if< - is_tag + : known_access_tag< + Tag, (writable_iterator|readable_iterator|swappable_iterator|lvalue_iterator) + , known_access_tag< + Tag, (readable_iterator|lvalue_iterator) + , known_access_tag< + Tag, (writable_iterator|readable_iterator|swappable_iterator) + , known_access_tag< + Tag, writable_iterator + , known_access_tag< + Tag, readable_iterator + , mpl::apply_if_c< + (swappable_iterator & Tag::value) , mpl::identity , error_iterator_tag > @@ -309,25 +326,6 @@ namespace boost template <> struct minimum_category { typedef minimum_category type; }; # endif - // - // Tag classification for use in iterator_adaptor - // - template - struct is_access_tag - : mpl::or_< - is_tag - , mpl::or_< - is_tag - , is_tag - > - > - {}; - - template - struct is_traversal_tag - : is_tag - {}; - } // namespace detail } // namespace boost diff --git a/include/boost/iterator/iterator_categories.hpp b/include/boost/iterator/iterator_categories.hpp index e7e270b..6e14f79 100644 --- a/include/boost/iterator/iterator_categories.hpp +++ b/include/boost/iterator/iterator_categories.hpp @@ -237,12 +237,14 @@ namespace boost { typedef typename NewCategoryTag::traversal type; }; - template + template struct new_tag_to_access { typedef typename NewCategoryTag::access_type type; - } + }; #if 0 // what was this all about? + template + struct new_tag_to_access : mpl::apply_if< python::detail::is_reference_to_const , remove_access_writability @@ -300,7 +302,9 @@ namespace boost { // writability at the level of input iterator/output iterator. template <> struct iterator_tag_base< - readable_lvalue_iterator_tag,single_pass_traversal_tag> + readable_iterator|lvalue_iterator + , single_pass_traversal_tag + > { typedef std::input_iterator_tag type; }; @@ -369,7 +373,7 @@ namespace boost { template struct iterator_tag : detail::iterator_tag_base< - typename detail::max_known_access_tag::type + typename detail::max_known_access_tag >::type::value , typename detail::max_known_traversal_tag::type >::type {