mirror of
https://github.com/boostorg/iterator.git
synced 2025-07-21 16:42:09 +02:00
fixed bug in inherit-category that Thomas found
[SVN r20160]
This commit is contained in:
@ -819,7 +819,9 @@ enum iterator_access { readable_iterator = 1, writable_iterator = 2,
|
|||||||
|
|
||||||
template <unsigned int access_bits, class TraversalTag>
|
template <unsigned int access_bits, class TraversalTag>
|
||||||
struct iterator_tag : /* appropriate old category or categories */ {
|
struct iterator_tag : /* appropriate old category or categories */ {
|
||||||
static const iterator_access access = (iterator_access)access_bits;
|
static const iterator_access access =
|
||||||
|
(iterator_access)access_bits &
|
||||||
|
(readable_iterator | writable_iterator | swappable_iterator);
|
||||||
typedef TraversalTag traversal;
|
typedef TraversalTag traversal;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -842,7 +844,7 @@ from one of the original iterator tags according to the following
|
|||||||
pseudo-code.</p>
|
pseudo-code.</p>
|
||||||
<pre class="literal-block">
|
<pre class="literal-block">
|
||||||
inherit-category(access, traversal-tag) =
|
inherit-category(access, traversal-tag) =
|
||||||
if (access & lvalue_iterator) {
|
if ((access & readable_iterator) && (access & lvalue_iterator)) {
|
||||||
if (traversal-tag is convertible to random_access_traversal_tag)
|
if (traversal-tag is convertible to random_access_traversal_tag)
|
||||||
return random_access_iterator_tag;
|
return random_access_iterator_tag;
|
||||||
else if (traversal-tag is convertible to bidirectional_traversal_tag)
|
else if (traversal-tag is convertible to bidirectional_traversal_tag)
|
||||||
@ -885,7 +887,7 @@ deduced. The following pseudo-code describes the algorithm.</p>
|
|||||||
is-readable(Iterator) =
|
is-readable(Iterator) =
|
||||||
cat = iterator_traits<Iterator>::iterator_category;
|
cat = iterator_traits<Iterator>::iterator_category;
|
||||||
if (cat == iterator_tag<Access,Traversal>)
|
if (cat == iterator_tag<Access,Traversal>)
|
||||||
return Access % readable_iterator;
|
return Access & readable_iterator;
|
||||||
else if (cat is convertible to input_iterator_tag)
|
else if (cat is convertible to input_iterator_tag)
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
@ -894,7 +896,7 @@ is-readable(Iterator) =
|
|||||||
is-writable(Iterator) =
|
is-writable(Iterator) =
|
||||||
cat = iterator_traits<Iterator>::iterator_category;
|
cat = iterator_traits<Iterator>::iterator_category;
|
||||||
if (cat == iterator_tag<Access,Traversal>)
|
if (cat == iterator_tag<Access,Traversal>)
|
||||||
return Access % writable_iterator;
|
return Access & writable_iterator;
|
||||||
else if (cat is convertible to forward_iterator_tag
|
else if (cat is convertible to forward_iterator_tag
|
||||||
or output_iterator_tag)
|
or output_iterator_tag)
|
||||||
return true;
|
return true;
|
||||||
@ -904,7 +906,7 @@ is-writable(Iterator) =
|
|||||||
is-swappable(Iterator) =
|
is-swappable(Iterator) =
|
||||||
cat = iterator_traits<Iterator>::iterator_category;
|
cat = iterator_traits<Iterator>::iterator_category;
|
||||||
if (cat == iterator_tag<Access,Traversal>)
|
if (cat == iterator_tag<Access,Traversal>)
|
||||||
return Access % swappable_iterator;
|
return Access & swappable_iterator;
|
||||||
else if (cat is convertible to forward_iterator_tag) {
|
else if (cat is convertible to forward_iterator_tag) {
|
||||||
if (iterator_traits<Iterator>::reference is a const reference)
|
if (iterator_traits<Iterator>::reference is a const reference)
|
||||||
return false;
|
return false;
|
||||||
|
@ -658,7 +658,9 @@ Addition to [lib.iterator.synopsis]
|
|||||||
|
|
||||||
template <unsigned int access_bits, class TraversalTag>
|
template <unsigned int access_bits, class TraversalTag>
|
||||||
struct iterator_tag : /* appropriate old category or categories */ {
|
struct iterator_tag : /* appropriate old category or categories */ {
|
||||||
static const iterator_access access = (iterator_access)access_bits;
|
static const iterator_access access =
|
||||||
|
(iterator_access)access_bits &
|
||||||
|
(readable_iterator | writable_iterator | swappable_iterator);
|
||||||
typedef TraversalTag traversal;
|
typedef TraversalTag traversal;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -683,7 +685,7 @@ pseudo-code.
|
|||||||
::
|
::
|
||||||
|
|
||||||
inherit-category(access, traversal-tag) =
|
inherit-category(access, traversal-tag) =
|
||||||
if (access & lvalue_iterator) {
|
if ((access & readable_iterator) && (access & lvalue_iterator)) {
|
||||||
if (traversal-tag is convertible to random_access_traversal_tag)
|
if (traversal-tag is convertible to random_access_traversal_tag)
|
||||||
return random_access_iterator_tag;
|
return random_access_iterator_tag;
|
||||||
else if (traversal-tag is convertible to bidirectional_traversal_tag)
|
else if (traversal-tag is convertible to bidirectional_traversal_tag)
|
||||||
@ -729,7 +731,7 @@ deduced. The following pseudo-code describes the algorithm.
|
|||||||
is-readable(Iterator) =
|
is-readable(Iterator) =
|
||||||
cat = iterator_traits<Iterator>::iterator_category;
|
cat = iterator_traits<Iterator>::iterator_category;
|
||||||
if (cat == iterator_tag<Access,Traversal>)
|
if (cat == iterator_tag<Access,Traversal>)
|
||||||
return Access % readable_iterator;
|
return Access & readable_iterator;
|
||||||
else if (cat is convertible to input_iterator_tag)
|
else if (cat is convertible to input_iterator_tag)
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
@ -738,7 +740,7 @@ deduced. The following pseudo-code describes the algorithm.
|
|||||||
is-writable(Iterator) =
|
is-writable(Iterator) =
|
||||||
cat = iterator_traits<Iterator>::iterator_category;
|
cat = iterator_traits<Iterator>::iterator_category;
|
||||||
if (cat == iterator_tag<Access,Traversal>)
|
if (cat == iterator_tag<Access,Traversal>)
|
||||||
return Access % writable_iterator;
|
return Access & writable_iterator;
|
||||||
else if (cat is convertible to forward_iterator_tag
|
else if (cat is convertible to forward_iterator_tag
|
||||||
or output_iterator_tag)
|
or output_iterator_tag)
|
||||||
return true;
|
return true;
|
||||||
@ -748,7 +750,7 @@ deduced. The following pseudo-code describes the algorithm.
|
|||||||
is-swappable(Iterator) =
|
is-swappable(Iterator) =
|
||||||
cat = iterator_traits<Iterator>::iterator_category;
|
cat = iterator_traits<Iterator>::iterator_category;
|
||||||
if (cat == iterator_tag<Access,Traversal>)
|
if (cat == iterator_tag<Access,Traversal>)
|
||||||
return Access % swappable_iterator;
|
return Access & swappable_iterator;
|
||||||
else if (cat is convertible to forward_iterator_tag) {
|
else if (cat is convertible to forward_iterator_tag) {
|
||||||
if (iterator_traits<Iterator>::reference is a const reference)
|
if (iterator_traits<Iterator>::reference is a const reference)
|
||||||
return false;
|
return false;
|
||||||
|
Reference in New Issue
Block a user