fixed bug in inherit-category that Thomas found

[SVN r20160]
This commit is contained in:
Jeremy Siek 2003-09-22 16:48:40 +00:00
parent ac0c6461fb
commit 30ca43dd08
2 changed files with 14 additions and 10 deletions

View File

@ -819,7 +819,9 @@ enum iterator_access { readable_iterator = 1, writable_iterator = 2,
template <unsigned int access_bits, class TraversalTag>
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;
};
@ -842,7 +844,7 @@ from one of the original iterator tags according to the following
pseudo-code.</p>
<pre class="literal-block">
inherit-category(access, traversal-tag) =
if (access &amp; lvalue_iterator) {
if ((access &amp; readable_iterator) &amp;&amp; (access &amp; lvalue_iterator)) {
if (traversal-tag is convertible to random_access_traversal_tag)
return random_access_iterator_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) =
cat = iterator_traits&lt;Iterator&gt;::iterator_category;
if (cat == iterator_tag&lt;Access,Traversal&gt;)
return Access % readable_iterator;
return Access &amp; readable_iterator;
else if (cat is convertible to input_iterator_tag)
return true;
else
@ -894,7 +896,7 @@ is-readable(Iterator) =
is-writable(Iterator) =
cat = iterator_traits&lt;Iterator&gt;::iterator_category;
if (cat == iterator_tag&lt;Access,Traversal&gt;)
return Access % writable_iterator;
return Access &amp; writable_iterator;
else if (cat is convertible to forward_iterator_tag
or output_iterator_tag)
return true;
@ -904,7 +906,7 @@ is-writable(Iterator) =
is-swappable(Iterator) =
cat = iterator_traits&lt;Iterator&gt;::iterator_category;
if (cat == iterator_tag&lt;Access,Traversal&gt;)
return Access % swappable_iterator;
return Access &amp; swappable_iterator;
else if (cat is convertible to forward_iterator_tag) {
if (iterator_traits&lt;Iterator&gt;::reference is a const reference)
return false;

View File

@ -658,7 +658,9 @@ Addition to [lib.iterator.synopsis]
template <unsigned int access_bits, class TraversalTag>
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;
};
@ -683,7 +685,7 @@ pseudo-code.
::
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)
return random_access_iterator_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) =
cat = iterator_traits<Iterator>::iterator_category;
if (cat == iterator_tag<Access,Traversal>)
return Access % readable_iterator;
return Access & readable_iterator;
else if (cat is convertible to input_iterator_tag)
return true;
else
@ -738,7 +740,7 @@ deduced. The following pseudo-code describes the algorithm.
is-writable(Iterator) =
cat = iterator_traits<Iterator>::iterator_category;
if (cat == iterator_tag<Access,Traversal>)
return Access % writable_iterator;
return Access & writable_iterator;
else if (cat is convertible to forward_iterator_tag
or output_iterator_tag)
return true;
@ -748,7 +750,7 @@ deduced. The following pseudo-code describes the algorithm.
is-swappable(Iterator) =
cat = iterator_traits<Iterator>::iterator_category;
if (cat == iterator_tag<Access,Traversal>)
return Access % swappable_iterator;
return Access & swappable_iterator;
else if (cat is convertible to forward_iterator_tag) {
if (iterator_traits<Iterator>::reference is a const reference)
return false;