Avoid instantiating iterator tags to allow iterators that define iterator_categories with forward declared tags.

This commit is contained in:
Ion Gaztañaga
2015-01-04 02:29:15 +01:00
parent 493f19f2a9
commit a369e3c8c5
3 changed files with 18 additions and 14 deletions

View File

@@ -878,9 +878,7 @@ public:
template <typename Iterator> template <typename Iterator>
iterator insert(iterator position, Iterator first, Iterator last) iterator insert(iterator position, Iterator first, Iterator last)
{ {
typedef typename boost::container::iterator_traits<Iterator>::iterator_category category; this->insert_dispatch(position, first, last);
this->insert_dispatch(position, first, last, category());
return position; return position;
} }
@@ -961,8 +959,7 @@ public:
template <typename Iterator> template <typename Iterator>
void assign(Iterator first, Iterator last) void assign(Iterator first, Iterator last)
{ {
typedef typename boost::container::iterator_traits<Iterator>::iterator_category category; this->assign_dispatch(first, last); // may throw
this->assign_dispatch(first, last, category()); // may throw
} }
//! @pre <tt>count <= capacity()</tt> //! @pre <tt>count <= capacity()</tt>
@@ -1698,7 +1695,8 @@ private:
// @par Complexity // @par Complexity
// Linear O(N). // Linear O(N).
template <typename Iterator> template <typename Iterator>
void insert_dispatch(iterator position, Iterator first, Iterator last, std::random_access_iterator_tag) typename iterator_enable_if_tag<Iterator, std::random_access_iterator_tag>::type
insert_dispatch(iterator position, Iterator first, Iterator last)
{ {
errh::check_iterator_end_eq(*this, position); errh::check_iterator_end_eq(*this, position);
@@ -1725,7 +1723,8 @@ private:
// @par Complexity // @par Complexity
// Linear O(N). // Linear O(N).
template <typename Iterator, typename Category> template <typename Iterator, typename Category>
void insert_dispatch(iterator position, Iterator first, Iterator last, Category const& /*not_random_access*/) typename iterator_disable_if_tag<Iterator, std::random_access_iterator_tag>::type
insert_dispatch(iterator position, Iterator first, Iterator last)
{ {
errh::check_iterator_end_eq(*this, position); errh::check_iterator_end_eq(*this, position);
@@ -1791,7 +1790,8 @@ private:
// @par Complexity // @par Complexity
// Linear O(N). // Linear O(N).
template <typename Iterator> template <typename Iterator>
void assign_dispatch(Iterator first, Iterator last, std::random_access_iterator_tag const& /*not_random_access*/) typename iterator_enable_if_tag<Iterator, std::random_access_iterator_tag>::type
assign_dispatch(Iterator first, Iterator last)
{ {
namespace sv = varray_detail; namespace sv = varray_detail;
@@ -1818,7 +1818,8 @@ private:
// @par Complexity // @par Complexity
// Linear O(N). // Linear O(N).
template <typename Iterator, typename Category> template <typename Iterator, typename Category>
void assign_dispatch(Iterator first, Iterator last, Category const& /*not_random_access*/) typename iterator_disable_if_tag<Iterator, std::random_access_iterator_tag>::type
assign_dispatch(Iterator first, Iterator last)
{ {
namespace sv = varray_detail; namespace sv = varray_detail;

View File

@@ -605,8 +605,7 @@ class deque : protected deque_base<Allocator>
) )
: Base(a) : Base(a)
{ {
typedef typename boost::container::iterator_traits<InIt>::iterator_category ItCat; this->priv_range_initialize(first, last);
this->priv_range_initialize(first, last, ItCat());
} }
#if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST)
@@ -620,7 +619,7 @@ class deque : protected deque_base<Allocator>
deque(std::initializer_list<value_type> il, const allocator_type& a = allocator_type()) deque(std::initializer_list<value_type> il, const allocator_type& a = allocator_type())
: Base(a) : Base(a)
{ {
this->priv_range_initialize(il.begin(), il.end(), std::input_iterator_tag()); this->priv_range_initialize(il.begin(), il.end());
} }
#endif #endif
@@ -1951,7 +1950,8 @@ class deque : protected deque_base<Allocator>
} }
template <class InIt> template <class InIt>
void priv_range_initialize(InIt first, InIt last, std::input_iterator_tag) typename iterator_enable_if_tag<InIt, std::input_iterator_tag>::type
priv_range_initialize(InIt first, InIt last)
{ {
this->priv_initialize_map(0); this->priv_initialize_map(0);
BOOST_TRY { BOOST_TRY {
@@ -1966,7 +1966,8 @@ class deque : protected deque_base<Allocator>
} }
template <class FwdIt> template <class FwdIt>
void priv_range_initialize(FwdIt first, FwdIt last, std::forward_iterator_tag) typename iterator_disable_if_tag<FwdIt, std::input_iterator_tag>::type
priv_range_initialize(FwdIt first, FwdIt last)
{ {
size_type n = 0; size_type n = 0;
n = boost::container::iterator_distance(first, last); n = boost::container::iterator_distance(first, last);

View File

@@ -26,6 +26,8 @@ using ::boost::intrusive::iterator_traits;
using ::boost::intrusive::iterator_distance; using ::boost::intrusive::iterator_distance;
using ::boost::intrusive::iterator_advance; using ::boost::intrusive::iterator_advance;
using ::boost::intrusive::iterator; using ::boost::intrusive::iterator;
using ::boost::intrusive::iterator_enable_if_tag;
using ::boost::intrusive::iterator_disable_if_tag;
} //namespace container { } //namespace container {
} //namespace boost { } //namespace boost {