Boost logo

Boost-Commit :

From: dgregor_at_[hidden]
Date: 2008-08-20 22:59:34


Author: dgregor
Date: 2008-08-20 22:59:34 EDT (Wed, 20 Aug 2008)
New Revision: 48276
URL: http://svn.boost.org/trac/boost/changeset/48276

Log:
Conceptualized move_iterator
Text files modified:
   sandbox/committee/concepts/stdlib/clib-iterators.tex | 287 ++++++++++++++++++++++++++-------------
   1 files changed, 193 insertions(+), 94 deletions(-)

Modified: sandbox/committee/concepts/stdlib/clib-iterators.tex
==============================================================================
--- sandbox/committee/concepts/stdlib/clib-iterators.tex (original)
+++ sandbox/committee/concepts/stdlib/clib-iterators.tex 2008-08-20 22:59:34 EDT (Wed, 20 Aug 2008)
@@ -218,33 +218,50 @@
   @\addedConcepts{template<InsertionContainer Container>}@
     @\addedConcepts{concept_map Iterator<insert_iterator<Container> > \{ \}}@
 
- template <class Iterator> class move_iterator;
- template <class Iterator1, class Iterator2>
+ template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@> class move_iterator;
+ template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasEqualTo<Iter1, Iter2>}@
     bool operator==(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+ template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasEqualTo<Iter1, Iter2>}@
     bool operator!=(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter1, Iter2>}@
     bool operator<(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter2, Iter1>}@
     bool operator<=(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter2, Iter1>}@
     bool operator>(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter1, Iter2>}@
     bool operator>=(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
- typename move_iterator<Iterator>::difference_type operator-(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasMinus<Iter1, Iter2>}@
+ auto operator-(
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x,
+ const move_iterator<Iter@\removedConcepts{ator}@2>& y) -> decltype(x.base() - y.base());
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iterator>
     move_iterator<Iterator> operator+(
- typename move_iterator<Iterator>::difference_type n, const move_iterator<Iterator>& x);
- template <class Iterator>
- move_iterator<Iterator> make_move_iterator(const Iterator& i);
+ @\changedConcepts{typename move_iterator<Iterator>}{Iter}@::difference_type n, const move_iterator<Iterator>& x);
+ template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@>
+ move_iterator<Iter@\removedConcepts{ator}@> make_move_iterator(const Iterator& i);
+ @\addedConcepts{template<InputIterator Iter>}@
+ @\addedConcepts{concept_map InputIterator<move_iterator<Iter> > \{ \}}@
+ @\addedConcepts{template<ForwardIterator Iter>}@
+ @\addedConcepts{concept_map ForwardIterator<move_iterator<Iter> > \{ \}}@
+ @\addedConcepts{template<BidirectionalIterator Iter>}@
+ @\addedConcepts{concept_map BidirectionalIterator<move_iterator<Iter> > \{ \}}@
+ @\addedConcepts{template<RandomAccessIterator Iter>}@
+ @\addedConcepts{concept_map RandomAccessIterator<move_iterator<Iter> > \{ \}}@
 
   // \ref{stream.iterators}, stream iterators:
   template <class T, class charT = char, class traits = char_traits<charT>,
@@ -492,6 +509,8 @@
 
 \rSec3[reverse.iter.requirements]{\tcode{reverse_iterator}\ requirements}
 
+\editorial{Remove [reverse.iter.requirements]}
+
 \pnum
 \removedConcepts{The template parameter
 \mbox{\tcode{Iterator}}
@@ -1456,20 +1475,24 @@
 \index{move_iterator@\tcode{move_iterator}}%
 \begin{codeblock}
 namespace std {
- template <class Iterator>
+ template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@>
   class move_iterator {
   public:
     typedef Iterator iterator_type;
- typedef typename iterator_traits<Iterator>::difference_type difference_type;
+ typedef @\changedConcepts{typename iterator_traits<Iterator>}{Iter}@::difference_type difference_type;
     typedef Iterator pointer;
- typedef typename iterator_traits<Iterator>::value_type value_type;
- typedef typename iterator_traits<Iterator>::iterator_category iterator_category;
+ typedef @\changedConcepts{typename iterator_traits<Iterator>}{Iter}@::value_type value_type;
+ @\removedConcepts{typedef typename iterator_traits<Iterator>::iterator_category iterator_category;}@
     typedef value_type&& reference;
 
     move_iterator();
- explicit move_iterator(Iterator i);
- template <class U> move_iterator(const move_iterator<U>& u);
- template <class U> move_iterator& operator=(const move_iterator<U>& u);
+ explicit move_iterator(Iter@\removedConcepts{ator}@ i);
+ template <class U>
+ @\addedConcepts{requires HasConstructor<Iter, const U\&>}@
+ move_iterator(const move_iterator<U>& u);
+ template <class U>
+ @\addedConcepts{requires HasAssign<Iter, const U\&>}@
+ move_iterator& operator=(const move_iterator<U>& u);
 
     iterator_type base() const;
     reference operator*() const;
@@ -1477,58 +1500,78 @@
 
     move_iterator& operator++();
     move_iterator operator++(int);
- move_iterator& operator--();
- move_iterator operator--(int);
+ @\addedConcepts{requires BidirectionalIterator<Iter>}@ move_iterator& operator--();
+ @\addedConcepts{requires BidirectionalIterator<Iter>}@ move_iterator operator--(int);
 
- move_iterator operator+(difference_type n) const;
- move_iterator& operator+=(difference_type n);
- move_iterator operator-(difference_type n) const;
- move_iterator& operator-=(difference_type n);
- reference operator[](difference_type n) const;
+ @\addedConcepts{requires RandomAccessIterator<Iter>}@ move_iterator operator+(difference_type n) const;
+ @\addedConcepts{requires RandomAccessIterator<Iter>}@ move_iterator& operator+=(difference_type n);
+ @\addedConcepts{requires RandomAccessIterator<Iter>}@ move_iterator operator-(difference_type n) const;
+ @\addedConcepts{requires RandomAccessIterator<Iter>}@ move_iterator& operator-=(difference_type n);
+ @\addedConcepts{requires RandomAccessIterator<Iter>}@
+ @\unspec@ operator[](difference_type n) const;
 
   private:
- Iterator current; // \expos
+ Iter@\removedConcepts{ator}@ current; // \expos
   };
 
- template <class Iterator1, class Iterator2>
+ template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasEqualTo<Iter1, Iter2>}@
     bool operator==(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+ template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasEqualTo<Iter1, Iter2>}@
     bool operator!=(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter1, Iter2>}@
     bool operator<(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter2, Iter1>}@
     bool operator<=(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter2, Iter1>}@
     bool operator>(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator1, class Iterator2>
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter1, Iter2>}@
     bool operator>=(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
 
- template <class Iterator1, class Iterator2>
- typename move_iterator<Iterator>::difference_type operator-(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
- template <class Iterator>
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasMinus<Iter1, Iter2>}@
+ auto operator-(
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x,
+ const move_iterator<Iter@\removedConcepts{ator}@2>& y) -> decltype(x.base() - y.base());
+ template <@\changedConcepts{class}{RandomAccessIterator}@ Iterator>
     move_iterator<Iterator> operator+(
- typename move_iterator<Iterator>::difference_type n, const move_iterator<Iterator>& x);
- template <class Iterator>
- move_iterator<Iterator> make_move_iterator(const Iterator& i);
+ @\changedConcepts{typename move_iterator<Iterator>}{Iter}@::difference_type n, const move_iterator<Iterator>& x);
+ template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@>
+ move_iterator<Iter@\removedConcepts{ator}@> make_move_iterator(const Iterator& i);
+
+ @\addedConcepts{template<InputIterator Iter>}@
+ @\addedConcepts{concept_map InputIterator<move_iterator<Iter> > \{ \}}@
+ @\addedConcepts{template<ForwardIterator Iter>}@
+ @\addedConcepts{concept_map ForwardIterator<move_iterator<Iter> > \{ \}}@
+ @\addedConcepts{template<BidirectionalIterator Iter>}@
+ @\addedConcepts{concept_map BidirectionalIterator<move_iterator<Iter> > \{ \}}@
+ @\addedConcepts{template<RandomAccessIterator Iter>}@
+ @\addedConcepts{concept_map RandomAccessIterator<move_iterator<Iter> > \{ \}}@
 }
 \end{codeblock}
 
 \rSec3[move.iter.requirements]{\tcode{move_iterator}\ requirements}
 
+\editorial{Remove [move.iter.requirements]}
+
 \pnum
-The template parameter \tcode{Iterator} shall meet
-the requirements for an Input Iterator~(\ref{input.iterators}).
+\removedConcepts{The template parameter \mbox{\tcode{Iterator}} shall meet
+the requirements for an Input Iterator~(\mbox{\ref{input.iterators}}).
 Additionally, if any of the bidirectional or random access traversal
 functions are instantiated, the template parameter shall meet the
-requirements for a Bidirectional Iterator~(\ref{bidirectional.iterators})
-or a Random Access Iterator~(\ref{random.access.iterators}), respectively.
+requirements for a Bidirectional Iterator~(\mbox{\ref{bidirectional.iterators}})
+or a Random Access Iterator~(\mbox{\ref{random.access.iterators}}), respectively.}
 
 \rSec3[move.iter.ops]{\tcode{move_iterator}\ operations}
 
@@ -1546,7 +1589,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-explicit move_iterator(Iterator i};
+explicit move_iterator(Iter@\removedConcepts{ator}@ i};
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1556,7 +1599,9 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-template <class U> move_iterator(const move_iterator<U>& u);
+template <class U>
+ @\addedConcepts{requires HasConstructor<Iter, const U\&>}@
+ move_iterator(const move_iterator<U>& u);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1565,14 +1610,16 @@
 \tcode{current} with \tcode{u.base()}.
 
 \pnum
-\requires \tcode{U} shall be convertible to
-\tcode{Iterator}.
+\removedConcepts{\mbox{\requires} \mbox{\tcode{U}} shall be convertible to
+\mbox{\tcode{Iterator}}.}
 \end{itemdescr}
 
 \rSec4[move.iter.op=]{\tcode{move_iterator::operator=}}
 
 \begin{itemdecl}
-template <class U> move_iterator& operator=(const move_iterator<U>& u);
+template <class U>
+ @\addedConcepts{requires HasAssign<Iter, const U\&>}@
+ move_iterator& operator=(const move_iterator<U>& u);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1581,14 +1628,14 @@
 \tcode{current}.
 
 \pnum
-\requires \tcode{U} shall be convertible to
-\tcode{Iterator}.
+\removedConcepts{\mbox{\requires} \mbox{\tcode{U}} shall be convertible to
+\mbox{\tcode{Iterator}}.}
 \end{itemdescr}
 
 \rSec4[move.iter.op.conv]{\tcode{move_iterator}\ conversion}
 
 \begin{itemdecl}
-Iterator base() const;
+Iter@\removedConcepts{ator}@ base() const;
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1650,7 +1697,7 @@
 \rSec4[move.iter.op.decr]{\tcode{move_iterator::operator-{-}}}
 
 \begin{itemdecl}
-move_iterator& operator--();
+@\addedConcepts{requires BidirectionalIterator<Iter>}@ move_iterator& operator--();
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1662,7 +1709,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-move_iterator& operator--(int);
+@\addedConcepts{requires BidirectionalIterator<Iter>}@ move_iterator& operator--(int);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1678,7 +1725,7 @@
 \rSec4[move.iter.op.+]{\tcode{move_iterator::operator+}}
 
 \begin{itemdecl}
-move_iterator operator+(difference_type n) const;
+@\addedConcepts{requires RandomAccessIterator<Iter>}@ move_iterator operator+(difference_type n) const;
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1689,7 +1736,7 @@
 \rSec4[move.iter.op.+=]{\tcode{move_iterator::operator+=}}
 
 \begin{itemdecl}
-move_iterator& operator+=(difference_type n);
+@\addedConcepts{requires RandomAccessIterator<Iter>}@ move_iterator& operator+=(difference_type n);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1703,7 +1750,7 @@
 \rSec4[move.iter.op.-]{\tcode{move_iterator::operator-}}
 
 \begin{itemdecl}
-move_iterator operator-(difference_type n) const;
+@\addedConcepts{requires RandomAccessIterator<Iter>}@ move_iterator operator-(difference_type n) const;
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1714,7 +1761,7 @@
 \rSec4[move.iter.op.-=]{\tcode{move_iterator::operator-=}}
 
 \begin{itemdecl}
-move_iterator& operator-=(difference_type n);
+@\addedConcepts{requires RandomAccessIterator<Iter>}@ move_iterator& operator-=(difference_type n);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1728,7 +1775,8 @@
 \rSec4[move.iter.op.index]{\tcode{move_iterator::operator[]}}
 
 \begin{itemdecl}
-reference operator[](difference_type n) const;
+@\addedConcepts{requires RandomAccessIterator<Iter>}@
+ @\unspec@ operator[](difference_type n) const;
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1740,8 +1788,9 @@
 \rSec4[move.iter.op.comp]{\tcode{move_iterator}\ comparisons}
 
 \begin{itemdecl}
-template <class Iterator1, class Iterator2>
-bool operator==(const move_iterator<Iterator1>& x, const move_iterator<Itrator2>& y);
+template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasEqualTo<Iter1, Iter2>}@
+ bool operator==(const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1750,8 +1799,9 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-template <class Iterator1, class Iterator2>
-bool operator!=(const move_iterator<Iterator1>& x, const move_iterator<Itrator2>& y);
+template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasEqualTo<Iter1, Iter2>}@
+ bool operator!=(const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1760,8 +1810,9 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-template <class Iterator1, class Iterator2>
-bool operator<(const move_iterator<Iterator1>& x, const move_iterator<Itrator2>& y);
+template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter1, Iter2>}@
+ bool operator<(const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1770,8 +1821,9 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-template <class Iterator1, class Iterator2>
-bool operator<=(const move_iterator<Iterator1>& x, const move_iterator<Itrator2>& y);
+template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter2, Iter1>}@
+ bool operator<=(const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1780,8 +1832,9 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-template <class Iterator1, class Iterator2>
-bool operator>(const move_iterator<Iterator1>& x, const move_iterator<Itrator2>& y);
+template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter2, Iter1>}@
+ bool operator>(const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1790,8 +1843,9 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-template <class Iterator1, class Iterator2>
-bool operator>=(const move_iterator<Iterator1>& x, const move_iterator<Itrator2>& y);
+template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasLess<Iter1, Iter2>}@
+ bool operator>=(const move_iterator<Iter@\removedConcepts{ator}@1>& x, const move_iterator<Iter@\removedConcepts{ator}@2>& y);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1802,9 +1856,11 @@
 \rSec4[move.iter.nonmember]{\tcode{move_iterator}\ non-member functions}
 
 \begin{itemdecl}
-template <class Iterator1, class Iterator2>
- typename move_iterator<Iterator>::difference_type operator-(
- const move_iterator<Iterator1>& x, const move_iterator<Iterator2>& y);
+template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@1, @\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@2>
+ @\addedConcepts{requires HasMinus<Iter1, Iter2>}@
+ auto operator-(
+ const move_iterator<Iter@\removedConcepts{ator}@1>& x,
+ const move_iterator<Iter@\removedConcepts{ator}@2>& y) -> decltype(x.base() - y.base());
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1813,9 +1869,9 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-template <class Iterator>
- move_iterator<Iterator> operator+(
- typename move_iterator<Iterator>::difference_type n, const move_iterator<Iterator>& x);
+template <@\changedConcepts{class}{RandomAccessIterator}@ Iter@\removedConcepts{ator}@>
+ move_iterator<Iter@\removedConcepts{ator}@> operator+(
+ @\changedConcepts{typename move_iterator<Iterator>}{Iter}@::difference_type n, const move_iterator<Iter@\removedConcepts{ator}@>& x);
 \end{itemdecl}
 
 \begin{itemdescr}
@@ -1824,13 +1880,56 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-template <class Iterator>
-move_iterator<Iterator> make_move_iterator(const Iterator& i);
+template <@\changedConcepts{class}{InputIterator}@ Iter@\removedConcepts{ator}@>
+move_iterator<Iter@\removedConcepts{ator}@> make_move_iterator(const Iterator& i);
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\returns \tcode{move_iterator<Iter\removedConcepts{ator}>(i)}.
+\end{itemdescr}
+
+\rSec4[move.iter.maps]{Concept maps}
+\begin{itemdecl}
+@\addedConcepts{template<InputIterator Iter>}@
+ @\addedConcepts{concept_map InputIterator<move_iterator<Iter> > \{ \}}@
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
-\returns \tcode{move_iterator<Iterator>(i)}.
+\addedConcepts{\reallynote Declares that a \mbox{\tcode{move_iterator}} is an input iterator.}
+\end{itemdescr}
+
+\begin{itemdecl}
+@\addedConcepts{template<ForwardIterator Iter>}@
+ @\addedConcepts{concept_map ForwardIterator<move_iterator<Iter> > \{ \}}@
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\reallynote Declares that a \mbox{\tcode{move_iterator}} is a forward iterator if its underlying iterator is a forward iterator.}
+\end{itemdescr}
+
+\begin{itemdecl}
+@\addedConcepts{template<BidirectionalIterator Iter>}@
+ @\addedConcepts{concept_map BidirectionalIterator<move_iterator<Iter> > \{ \}}@
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\reallynote Declares that a \mbox{\tcode{move_iterator}} is a bidirectional iterator if its underlying iterator is a bidirectional iterator.}
+\end{itemdescr}
+
+\begin{itemdecl}
+@\addedConcepts{template<RandomAccessIterator Iter>}@
+ @\addedConcepts{concept_map RandomAccessIterator<move_iterator<Iter> > \{ \}}@
+\end{itemdecl}
+
+\begin{itemdescr}
+\begin{itemdescr}
+\pnum
+\addedConcepts{\reallynote Declares that a \mbox{\tcode{move_iterator}} is a random access iterator if its underlying iterator is a random access iterator.}
+\end{itemdescr}
 \end{itemdescr}
 
 \rSec1[stream.iterators]{Stream iterators}


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk