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> 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 &amp; lvalue_iterator) { if ((access &amp; readable_iterator) &amp;&amp; (access &amp; 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&lt;Iterator&gt;::iterator_category; cat = iterator_traits&lt;Iterator&gt;::iterator_category;
if (cat == iterator_tag&lt;Access,Traversal&gt;) 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) 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&lt;Iterator&gt;::iterator_category; cat = iterator_traits&lt;Iterator&gt;::iterator_category;
if (cat == iterator_tag&lt;Access,Traversal&gt;) 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 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&lt;Iterator&gt;::iterator_category; cat = iterator_traits&lt;Iterator&gt;::iterator_category;
if (cat == iterator_tag&lt;Access,Traversal&gt;) 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) { else if (cat is convertible to forward_iterator_tag) {
if (iterator_traits&lt;Iterator&gt;::reference is a const reference) if (iterator_traits&lt;Iterator&gt;::reference is a const reference)
return false; return false;

View File

@ -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;