From a369e3c8c53e3cc7bcef55936d68e6c8b8c9a660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Sun, 4 Jan 2015 02:29:15 +0100 Subject: [PATCH] Avoid instantiating iterator tags to allow iterators that define iterator_categories with forward declared tags. --- bench/detail/varray.hpp | 19 ++++++++++--------- include/boost/container/deque.hpp | 11 ++++++----- include/boost/container/detail/iterator.hpp | 2 ++ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/bench/detail/varray.hpp b/bench/detail/varray.hpp index a1d1e8c..a1489f8 100644 --- a/bench/detail/varray.hpp +++ b/bench/detail/varray.hpp @@ -878,9 +878,7 @@ public: template iterator insert(iterator position, Iterator first, Iterator last) { - typedef typename boost::container::iterator_traits::iterator_category category; - this->insert_dispatch(position, first, last, category()); - + this->insert_dispatch(position, first, last); return position; } @@ -961,8 +959,7 @@ public: template void assign(Iterator first, Iterator last) { - typedef typename boost::container::iterator_traits::iterator_category category; - this->assign_dispatch(first, last, category()); // may throw + this->assign_dispatch(first, last); // may throw } //! @pre count <= capacity() @@ -1698,7 +1695,8 @@ private: // @par Complexity // Linear O(N). template - void insert_dispatch(iterator position, Iterator first, Iterator last, std::random_access_iterator_tag) + typename iterator_enable_if_tag::type + insert_dispatch(iterator position, Iterator first, Iterator last) { errh::check_iterator_end_eq(*this, position); @@ -1725,7 +1723,8 @@ private: // @par Complexity // Linear O(N). template - void insert_dispatch(iterator position, Iterator first, Iterator last, Category const& /*not_random_access*/) + typename iterator_disable_if_tag::type + insert_dispatch(iterator position, Iterator first, Iterator last) { errh::check_iterator_end_eq(*this, position); @@ -1791,7 +1790,8 @@ private: // @par Complexity // Linear O(N). template - void assign_dispatch(Iterator first, Iterator last, std::random_access_iterator_tag const& /*not_random_access*/) + typename iterator_enable_if_tag::type + assign_dispatch(Iterator first, Iterator last) { namespace sv = varray_detail; @@ -1818,7 +1818,8 @@ private: // @par Complexity // Linear O(N). template - void assign_dispatch(Iterator first, Iterator last, Category const& /*not_random_access*/) + typename iterator_disable_if_tag::type + assign_dispatch(Iterator first, Iterator last) { namespace sv = varray_detail; diff --git a/include/boost/container/deque.hpp b/include/boost/container/deque.hpp index 3383a21..38cd613 100644 --- a/include/boost/container/deque.hpp +++ b/include/boost/container/deque.hpp @@ -605,8 +605,7 @@ class deque : protected deque_base ) : Base(a) { - typedef typename boost::container::iterator_traits::iterator_category ItCat; - this->priv_range_initialize(first, last, ItCat()); + this->priv_range_initialize(first, last); } #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) @@ -620,7 +619,7 @@ class deque : protected deque_base deque(std::initializer_list il, const allocator_type& a = allocator_type()) : Base(a) { - this->priv_range_initialize(il.begin(), il.end(), std::input_iterator_tag()); + this->priv_range_initialize(il.begin(), il.end()); } #endif @@ -1951,7 +1950,8 @@ class deque : protected deque_base } template - void priv_range_initialize(InIt first, InIt last, std::input_iterator_tag) + typename iterator_enable_if_tag::type + priv_range_initialize(InIt first, InIt last) { this->priv_initialize_map(0); BOOST_TRY { @@ -1966,7 +1966,8 @@ class deque : protected deque_base } template - void priv_range_initialize(FwdIt first, FwdIt last, std::forward_iterator_tag) + typename iterator_disable_if_tag::type + priv_range_initialize(FwdIt first, FwdIt last) { size_type n = 0; n = boost::container::iterator_distance(first, last); diff --git a/include/boost/container/detail/iterator.hpp b/include/boost/container/detail/iterator.hpp index c1ef787..d7053c8 100644 --- a/include/boost/container/detail/iterator.hpp +++ b/include/boost/container/detail/iterator.hpp @@ -26,6 +26,8 @@ using ::boost::intrusive::iterator_traits; using ::boost::intrusive::iterator_distance; using ::boost::intrusive::iterator_advance; using ::boost::intrusive::iterator; +using ::boost::intrusive::iterator_enable_if_tag; +using ::boost::intrusive::iterator_disable_if_tag; } //namespace container { } //namespace boost {