updated assign method - preparation for input iterator fix

[SVN r2665]
This commit is contained in:
Jan Gaspar
2005-07-25 15:40:28 +00:00
parent 30c83f475d
commit 8bb667bf49
4 changed files with 73 additions and 51 deletions

View File

@@ -353,7 +353,7 @@ public:
*/
template <class InputIterator>
void insert(iterator pos, InputIterator first, InputIterator last) {
insert(pos, first, last, BOOST_DEDUCED_TYPENAME cb_details::iterator_category_traits<InputIterator>::tag());
insert(pos, first, last, BOOST_DEDUCED_TYPENAME cb_details::iterator_cat_traits<InputIterator>::tag());
}
//!! See the circular_buffer source documentation.
@@ -388,7 +388,7 @@ public:
*/
template <class InputIterator>
void rinsert(iterator pos, InputIterator first, InputIterator last) {
rinsert(pos, first, last, BOOST_DEDUCED_TYPENAME cb_details::iterator_category_traits<InputIterator>::tag());
rinsert(pos, first, last, BOOST_DEDUCED_TYPENAME cb_details::iterator_cat_traits<InputIterator>::tag());
}
//!! See the circular_buffer source documentation.
@@ -501,13 +501,13 @@ private:
//! Helper insert method.
template <class InputIterator>
void insert(iterator pos, InputIterator n, InputIterator item, cb_details::int_iterator_tag) {
void insert(iterator pos, InputIterator n, InputIterator item, cb_details::int_tag) {
insert(pos, (size_type)n, item);
}
//! Helper insert method.
template <class InputIterator>
void insert(iterator pos, InputIterator first, InputIterator last, std::input_iterator_tag) {
void insert(iterator pos, InputIterator first, InputIterator last, cb_details::iterator_tag) {
size_type index = pos - begin();
check_low_capacity(std::distance(first, last));
circular_buffer<T, Alloc>::insert(begin() + index, first, last);
@@ -515,13 +515,13 @@ private:
//! Helper rinsert method.
template <class InputIterator>
void rinsert(iterator pos, InputIterator n, InputIterator item, cb_details::int_iterator_tag) {
void rinsert(iterator pos, InputIterator n, InputIterator item, cb_details::int_tag) {
rinsert(pos, (size_type)n, item);
}
//! Helper rinsert method.
template <class InputIterator>
void rinsert(iterator pos, InputIterator first, InputIterator last, std::input_iterator_tag) {
void rinsert(iterator pos, InputIterator first, InputIterator last, cb_details::iterator_tag) {
size_type index = pos - begin();
check_low_capacity(std::distance(first, last));
circular_buffer<T, Alloc>::rinsert(begin() + index, first, last);

View File

@@ -557,7 +557,7 @@ public:
*/
template <class InputIterator>
void assign(InputIterator first, InputIterator last) {
assign(first, last, BOOST_DEDUCED_TYPENAME cb_details::iterator_category_traits<InputIterator>::tag());
assign(first, last, BOOST_DEDUCED_TYPENAME cb_details::iterator_cat_traits<InputIterator>::tag());
}
//! Swap the contents of two circular buffers.
@@ -774,7 +774,7 @@ public:
template <class InputIterator>
void insert(iterator pos, InputIterator first, InputIterator last) {
BOOST_CB_ASSERT(pos.is_valid()); // check for uninitialized or invalidated iterator
insert(pos, first, last, BOOST_DEDUCED_TYPENAME cb_details::iterator_category_traits<InputIterator>::tag());
insert(pos, first, last, BOOST_DEDUCED_TYPENAME cb_details::iterator_cat_traits<InputIterator>::tag());
}
//! Insert an <code>item</code> before the given position.
@@ -874,7 +874,7 @@ public:
template <class InputIterator>
void rinsert(iterator pos, InputIterator first, InputIterator last) {
BOOST_CB_ASSERT(pos.is_valid()); // check for uninitialized or invalidated iterator
rinsert(pos, first, last, BOOST_DEDUCED_TYPENAME cb_details::iterator_category_traits<InputIterator>::tag());
rinsert(pos, first, last, BOOST_DEDUCED_TYPENAME cb_details::iterator_cat_traits<InputIterator>::tag());
}
// Erase
@@ -1016,29 +1016,29 @@ private:
}
//! Increment the pointer.
template <class Pointer0>
void increment(Pointer0& p) const {
template <class Pointer>
void increment(Pointer& p) const {
if (++p == m_end)
p = m_buff;
}
//! Decrement the pointer.
template <class Pointer0>
void decrement(Pointer0& p) const {
template <class Pointer>
void decrement(Pointer& p) const {
if (p == m_buff)
p = m_end;
--p;
}
//! Add <code>n</code> to the pointer.
template <class Pointer0>
Pointer0 add(Pointer0 p, difference_type n) const {
template <class Pointer>
Pointer add(Pointer p, difference_type n) const {
return p + (n < (m_end - p) ? n : n - capacity());
}
//! Subtract <code>n</code> from the pointer.
template <class Pointer0>
Pointer0 sub(Pointer0 p, difference_type n) const {
template <class Pointer>
Pointer sub(Pointer p, difference_type n) const {
return p - (n > (p - m_buff) ? n - capacity() : n);
}
@@ -1124,17 +1124,29 @@ private:
}
//! Specialized assign method.
template <class InputIterator>
void assign(InputIterator n, InputIterator item, cb_details::int_iterator_tag) {
template <class IntegralType>
void assign(IntegralType n, IntegralType item, cb_details::int_tag) {
assign((size_type)n, item);
}
//! Specialized assign method.
template <class Iterator>
void assign(Iterator first, Iterator last, cb_details::iterator_tag) {
BOOST_CB_IS_CONVERTIBLE(Iterator, value_type);
assign(first, last, BOOST_DEDUCED_TYPENAME BOOST_ITERATOR_CATEGORY<Iterator>::type());
}
//! Specialized assign method.
template <class InputIterator>
void assign(InputIterator first, InputIterator last, std::input_iterator_tag) {
BOOST_CB_IS_CONVERTIBLE(InputIterator, value_type);
}
//! Specialized assign method.
template <class ForwardIterator>
void assign(ForwardIterator first, ForwardIterator last, std::forward_iterator_tag) {
BOOST_CB_ASSERT(std::distance(first, last) >= 0); // check for wrong range
do_assign(std::distance(first, last), assign_range<InputIterator>(first, last, m_alloc));
do_assign(std::distance(first, last), assign_range<ForwardIterator>(first, last, m_alloc));
}
//! Helper assign method.
@@ -1161,13 +1173,13 @@ private:
//! Specialized insert method.
template <class InputIterator>
void insert(iterator pos, InputIterator n, InputIterator item, cb_details::int_iterator_tag) {
void insert(iterator pos, InputIterator n, InputIterator item, cb_details::int_tag) {
insert(pos, (size_type)n, item);
}
//! Specialized insert method.
template <class InputIterator>
void insert(iterator pos, InputIterator first, InputIterator last, std::input_iterator_tag) {
void insert(iterator pos, InputIterator first, InputIterator last, cb_details::iterator_tag) {
BOOST_CB_IS_CONVERTIBLE(InputIterator, value_type);
BOOST_CB_ASSERT(std::distance(first, last) >= 0); // check for wrong range
difference_type n = std::distance(first, last);
@@ -1229,13 +1241,13 @@ private:
//! Specialized rinsert method.
template <class InputIterator>
void rinsert(iterator pos, InputIterator n, InputIterator item, cb_details::int_iterator_tag) {
void rinsert(iterator pos, InputIterator n, InputIterator item, cb_details::int_tag) {
rinsert(pos, (size_type)n, item);
}
//! Specialized rinsert method.
template <class InputIterator>
void rinsert(iterator pos, InputIterator first, InputIterator last, std::input_iterator_tag) {
void rinsert(iterator pos, InputIterator first, InputIterator last, cb_details::iterator_tag) {
BOOST_CB_IS_CONVERTIBLE(InputIterator, value_type);
BOOST_CB_ASSERT(std::distance(first, last) >= 0); // check for wrong range
rinsert_n_item(pos, std::distance(first, last), iterator_wrapper<InputIterator>(first));

View File

@@ -130,11 +130,11 @@ public:
}
//! Invalidate every iterator conforming to the condition.
template <class Iterator0>
void invalidate_iterators(const Iterator0& it) {
template <class Iterator>
void invalidate_iterators(const Iterator& it) {
const iterator_base* previous = 0;
for (const iterator_base* p = m_iterators; p != 0; p = p->next()) {
if (((Iterator0*)p)->m_it == it.m_it) {
if (((Iterator*)p)->m_it == it.m_it) {
p->invalidate();
remove(p, previous);
continue;

View File

@@ -25,47 +25,57 @@ namespace cb_details {
const int UNINITIALIZED = 0xcc;
/*!
\struct int_iterator_tag
\brief Identifying tag for integer types (not for iterators).
\struct iterator_tag
\brief Identifying tag for iterator types.
*/
struct int_iterator_tag {
struct iterator_tag {
#if BOOST_WORKAROUND(__BORLANDC__, < 0x6000)
char dummy_; // BCB: by default empty structure has 8 bytes
#endif
};
/*!
\struct iterator_category
\brief Defines iterator category.
\struct int_tag
\brief Identifying tag for integer types.
*/
template <bool>
struct iterator_category {
//! Represents iterators.
typedef std::input_iterator_tag iterator_category_tag;
};
template <>
struct iterator_category<true> {
//! Represents integral types (not iterators).
typedef int_iterator_tag iterator_category_tag;
struct int_tag {
#if BOOST_WORKAROUND(__BORLANDC__, < 0x6000)
char dummy_; // BCB: by default empty structure has 8 bytes
#endif
};
/*!
\struct iterator_category_traits
\struct iterator_cat
\brief Defines iterator category.
*/
template <bool>
struct iterator_cat {
//! Represents iterators.
typedef iterator_tag iterator_cat_tag;
};
template <>
struct iterator_cat<true> {
//! Represents integral types (not iterators).
typedef int_tag iterator_cat_tag;
};
/*!
\struct iterator_cat_traits
\brief Defines the iterator category tag for the given iterator.
*/
template <class Iterator>
struct iterator_category_traits {
struct iterator_cat_traits {
//! Iterator category tag type.
/*!
Depending on the template parameter the <code>tag</code> distinguishes
between iterators and non-iterators. If the template parameter
is an iterator, the <code>tag</code> is typedef for <code>std::input_iterator_tag</code>.
is an iterator, the <code>tag</code> is typedef for <code>iterator_tag</code>.
If the parameter is not an iterator, the <code>tag</code> is typedef for
<code>int_iterator_tag</code>.
<code>int_tag</code>.
*/
typedef typename iterator_category<
is_integral<Iterator>::value>::iterator_category_tag tag;
typedef typename iterator_cat<
is_integral<Iterator>::value>::iterator_cat_tag tag;
};
template <class Traits> struct nonconst_traits;
@@ -110,10 +120,10 @@ struct nonconst_traits {
\struct helper_pointer
\brief Helper pointer used in the iterator.
*/
template <class Traits0>
template <class Traits>
struct helper_pointer {
bool m_end;
typename Traits0::pointer m_it;
typename Traits::pointer m_it;
};
/*!