From 5fd440c1d0ace58431bcc74e168f7c2522e3a3b8 Mon Sep 17 00:00:00 2001 From: Jeremy Siek Date: Thu, 24 Oct 2002 18:56:16 +0000 Subject: [PATCH] change to new/old category recognition code [SVN r613] --- .../boost/iterator/iterator_categories.hpp | 70 ++++++++++++++++++- include/boost/iterator/iterator_concepts.hpp | 21 ++---- test/concept_tests.cpp | 17 +++-- 3 files changed, 84 insertions(+), 24 deletions(-) diff --git a/include/boost/iterator/iterator_categories.hpp b/include/boost/iterator/iterator_categories.hpp index ae2217d..62b1c31 100644 --- a/include/boost/iterator/iterator_categories.hpp +++ b/include/boost/iterator/iterator_categories.hpp @@ -12,7 +12,8 @@ #include #include #include -#include +#include +#include #include namespace boost { @@ -119,6 +120,7 @@ namespace boost { >::type type; }; +#if 0 struct return_category_from_old_traits { template class bind { typedef boost::detail::iterator_traits OldTraits; @@ -157,9 +159,25 @@ namespace boost { public: typedef typename Choice:: template bind::type type; }; +#else + + + template + type_traits::yes_type is_new_iter_cat(T*, typename T::traversal* = 0) { } + + type_traits::no_type is_new_iter_cat(...) { } + + template + struct is_new_iterator_tag + { + static Tag* t; + enum { value = sizeof(is_new_iter_cat(t)) == sizeof(type_traits::yes_type) }; + }; +#endif } // namespace detail +#if 0 template struct return_category { typedef typename detail::choose_return_category::type type; @@ -170,6 +188,56 @@ namespace boost { struct traversal_category { typedef typename detail::choose_traversal_category::type type; }; +#else + + namespace detail { + + template + struct get_return_category { + typedef typename NewCategoryTag::returns type; + }; + template + struct get_traversal_category { + typedef typename NewCategoryTag::traversal type; + }; + + template + struct return_category_tag + { + typedef typename + mpl::apply_if< + is_new_iterator_tag + , get_return_category + , iter_category_to_return + >::type type; + }; + template + struct traversal_category_tag + { + typedef typename + mpl::apply_if< + is_new_iterator_tag + , get_traversal_category + , iter_category_to_return + >::type type; + }; + + } // 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; + }; + + template + struct traversal_category { + typedef typename detail::traversal_category_tag< + typename detail::iterator_traits::iterator_category + , typename detail::iterator_traits::value_type>::type type; + }; +#endif #if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) diff --git a/include/boost/iterator/iterator_concepts.hpp b/include/boost/iterator/iterator_concepts.hpp index 349244d..743b111 100644 --- a/include/boost/iterator/iterator_concepts.hpp +++ b/include/boost/iterator/iterator_concepts.hpp @@ -26,8 +26,7 @@ namespace boost_concepts { public: typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::reference reference; - typedef typename std::iterator_traits::iterator_category iterator_category; - typedef typename iterator_category::returns return_category; + typedef typename boost::return_category::type return_category; void constraints() { boost::function_requires< boost::SGIAssignableConcept >(); @@ -48,8 +47,7 @@ namespace boost_concepts { template class WritableIteratorConcept { public: - typedef typename std::iterator_traits::iterator_category iterator_category; - typedef typename iterator_category::returns return_category; + typedef typename boost::return_category::type return_category; void constraints() { boost::function_requires< boost::SGIAssignableConcept >(); @@ -71,8 +69,7 @@ namespace boost_concepts { public: typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::reference reference; - typedef typename std::iterator_traits::iterator_category iterator_category; - typedef typename iterator_category::returns return_category; + typedef typename boost::return_category::type return_category; void constraints() { boost::function_requires< ReadableIteratorConcept >(); @@ -94,8 +91,7 @@ namespace boost_concepts { public: typedef typename std::iterator_traits::value_type value_type; typedef typename std::iterator_traits::reference reference; - typedef typename std::iterator_traits::iterator_category iterator_category; - typedef typename iterator_category::returns return_category; + typedef typename boost::return_category::type return_category; void constraints() { boost::function_requires< ReadableIteratorConcept >(); @@ -119,8 +115,7 @@ namespace boost_concepts { template class ForwardTraversalConcept { public: - typedef typename std::iterator_traits::iterator_category iterator_category; - typedef typename iterator_category::traversal traversal_category; + typedef typename boost::traversal_category::type traversal_category; void constraints() { boost::function_requires< boost::SGIAssignableConcept >(); @@ -139,8 +134,7 @@ namespace boost_concepts { template class BidirectionalTraversalConcept { public: - typedef typename std::iterator_traits::iterator_category iterator_category; - typedef typename iterator_category::traversal traversal_category; + typedef typename boost::traversal_category::type traversal_category; void constraints() { boost::function_requires< ForwardTraversalConcept >(); @@ -157,8 +151,7 @@ namespace boost_concepts { template class RandomAccessTraversalConcept { public: - typedef typename std::iterator_traits::iterator_category iterator_category; - typedef typename iterator_category::traversal traversal_category; + typedef typename boost::traversal_category::type traversal_category; typedef typename std::iterator_traits::difference_type difference_type; diff --git a/test/concept_tests.cpp b/test/concept_tests.cpp index 1f67021..92e9162 100644 --- a/test/concept_tests.cpp +++ b/test/concept_tests.cpp @@ -6,14 +6,13 @@ #include #include +#include // remove struct new_iterator - : public boost::iterator, - public boost::new_iterator_base + : public boost::iterator< boost::iterator_tag< + boost::mutable_lvalue_iterator_tag + , boost::random_access_traversal_tag>, int> { - typedef boost::random_access_traversal_tag traversal_category; - typedef boost::mutable_lvalue_iterator_tag return_category; - int& operator*() const { return *m_x; } new_iterator& operator++() { return *this; } new_iterator operator++(int) { return *this; } @@ -58,22 +57,22 @@ main() boost::function_requires< boost_concepts::MutableLvalueIteratorConcept >(); boost::function_requires< - boost_concepts::RandomAccessIteratorConcept >(); + boost_concepts::RandomAccessTraversalConcept >(); boost::function_requires< boost_concepts::ConstantLvalueIteratorConcept >(); boost::function_requires< - boost_concepts::RandomAccessIteratorConcept >(); + boost_concepts::RandomAccessTraversalConcept >(); #endif boost::function_requires< boost_concepts::MutableLvalueIteratorConcept >(); boost::function_requires< - boost_concepts::RandomAccessIteratorConcept >(); + boost_concepts::RandomAccessTraversalConcept >(); boost::function_requires< boost_concepts::MutableLvalueIteratorConcept >(); boost::function_requires< - boost_concepts::RandomAccessIteratorConcept >(); + boost_concepts::RandomAccessTraversalConcept >(); return 0; }