Boost logo

Boost-Commit :

From: dgregor_at_[hidden]
Date: 2008-06-09 16:45:53


Author: dgregor
Date: 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
New Revision: 46282
URL: http://svn.boost.org/trac/boost/changeset/46282

Log:
Big update based on LWG feedback in Sophia-Antipolis
Added:
   sandbox/committee/concepts/issues/issues/issue39.xml (contents, props changed)
   sandbox/committee/concepts/issues/issues/issue40.xml (contents, props changed)
   sandbox/committee/concepts/issues/issues/issue41.xml (contents, props changed)
   sandbox/committee/concepts/issues/issues/issue42.xml (contents, props changed)
Text files modified:
   sandbox/committee/concepts/issues/issues/concepts-template.xml | 2
   sandbox/committee/concepts/issues/issues/issue35.xml | 36 ++
   sandbox/committee/concepts/issues/issues/issue36.xml | 2
   sandbox/committee/concepts/issues/issues/issue8.xml | 5
   sandbox/committee/concepts/stdlib/Makefile | 36 +-
   sandbox/committee/concepts/stdlib/clib-algorithms.tex | 480 ++++++++++++++++-----------------------
   sandbox/committee/concepts/stdlib/clib-concepts.tex | 5
   sandbox/committee/concepts/stdlib/macros.tex | 2
   sandbox/committee/concepts/wording/wording.tex | 2
   9 files changed, 250 insertions(+), 320 deletions(-)

Modified: sandbox/committee/concepts/issues/issues/concepts-template.xml
==============================================================================
--- sandbox/committee/concepts/issues/issues/concepts-template.xml (original)
+++ sandbox/committee/concepts/issues/issues/concepts-template.xml 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -7,7 +7,7 @@
 <title>Your Title</title>
 <section><sref ref="00.0.0"/></section>
 <submitter>Your Name</submitter>
-<date>25 Mar 2008</date>
+<date>9 Jun 2008</date>
 
 <discussion>
   <p>

Modified: sandbox/committee/concepts/issues/issues/issue35.xml
==============================================================================
--- sandbox/committee/concepts/issues/issues/issue35.xml (original)
+++ sandbox/committee/concepts/issues/issues/issue35.xml 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -16,27 +16,47 @@
   of different types. For example, it couldn't be used for the proxy
   references coming from two different iterator types in
   the <code>swap_ranges</code> algorithm.</p>
+
 </discussion>
 
 <resolution>
+ <p>Add a new paragraph to [concept.operator] after paragraph 23:</p>
+
+ <pre>
+<ins>auto concept HasSwap&lt;typename T, typename U&gt; {</ins>
+ <ins>void swap(T, U);</ins>
+<ins>}</ins>
+ </pre>
+
+ <ol start="24">
+ <li><ins><i>Note</i>: describes types for which values of those types
+ can be swapped.</ins></li>
+ </ol>
+
   <p>Modify the definition of <code>Swappable</code> in
   [concept.copymove] as follows:</p>
 
   <pre>
-auto concept Swappable&lt;typename T<ins>, typename U = T</ins>&gt; {
- void swap(T&amp;<ins>&amp;</ins>, <del>T</del><ins>U</ins>&amp;<ins>&amp;</ins>);
-}
+auto concept Swappable&lt;typename T&gt; <ins>: HasSwap&lt;T, T&gt;</ins> { }
   </pre>
   <ol start="11">
- <li><i>Note</i>: describes types for which <del>two</del> values of <del>that</del><ins>those</ins> type<ins>s</ins>
+ <li><i>Note</i>: describes types for which values of that type
     can be swapped.</li>
+
+ <li><ins><i>Postconditions</i>: after executing <code>swap(s,
+ t)</code>, <code>t</code> has the value originally held
+ by <code>s</code> and <code>s</code> has the value originally
+ held by <code>t</code>.</ins></li>
   </ol>
 
   <p>The synopsis in [utility.concepts] will need to be updated
- accordingly:</p>
+ accordingly.</p>
 
- <pre>
-auto concept Swappable&lt;typename T<ins>, typename U = T</ins>&gt; <i>see below</i>;
- </pre>
+ <p>Note: the proposed resolution changed at Sophia-Antipolis, to
+ create a new two-argument <code>HasSwap</code> and
+ make <code>Swappable</code> refine that concept. Also, we have
+ removed the reference from <code>swap</code>'s arguments; the
+ appropriate kind of reference will be provided by the user
+ of <code>HasSwap</code> or <code>Swappable</code>.</p>
 </resolution>
 </issue>

Modified: sandbox/committee/concepts/issues/issues/issue36.xml
==============================================================================
--- sandbox/committee/concepts/issues/issues/issue36.xml (original)
+++ sandbox/committee/concepts/issues/issues/issue36.xml 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -4,7 +4,7 @@
 ] >
 
 <issue num="36" status="Open">
-<title><code>HasCopyAssign</code> should be named <code>HasAssign</code></title>
+<title><code>HasCopyAssign</code> should be named <code>HasAssignment</code></title>
 <section><sref ref="[concept.operator]"/></section>
 <submitter>Howard Hinnant</submitter>
 <date>29 May 2008</date>

Added: sandbox/committee/concepts/issues/issues/issue39.xml
==============================================================================
--- (empty file)
+++ sandbox/committee/concepts/issues/issues/issue39.xml 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -0,0 +1,33 @@
+<?xml version='1.0' encoding='iso-8859-1' standalone='no'?>
+<!DOCTYPE issue SYSTEM "lwg-issue.dtd" [
+ <!ENTITY nbsp "&#160;">
+] >
+
+<issue num="39" status="New">
+<title>Some uses of the MutableXXXIterator concepts are unnecessary</title>
+<section><sref ref="[algorithms]"/></section>
+<submitter>LWG</submitter>
+<date>9 Jun 2008</date>
+
+<discussion>
+ <p>Some algorithms that use the MutableXXXIterator concepts
+ (e.g., <code>MutableForwardIterator</code>) don't actually need the
+ Mutable variant of the concept, because they don't depend on that
+ form of assignability. Generally, these algorithms output some other
+ type, and don't move elements within the sequence. For example, this
+ is the <code>replace</code> algorithm:</p>
+
+ <pre>
+template&lt;MutableForwardIterator Iter, class T&gt;
+ requires HasEqualTo&lt;Iter::reference, T&gt; &amp;&amp; HasCopyAssign&lt;Iter::reference, T&gt;
+ void replace(Iter first, Iter last,
+ const T&amp; old_value, const T&amp; new_value);
+ </pre>
+
+ <p>The <code>MutableForwardIterator</code> concept requirement could
+ be changed to <code>ForwardIterator</code> without breaking any
+ code. This makes it possible, for example, to pass a sequence of
+ move-only types into <code>replace</code>.</p>
+</discussion>
+
+</issue>

Added: sandbox/committee/concepts/issues/issues/issue40.xml
==============================================================================
--- (empty file)
+++ sandbox/committee/concepts/issues/issues/issue40.xml 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -0,0 +1,88 @@
+<?xml version='1.0' encoding='iso-8859-1' standalone='no'?>
+<!DOCTYPE issue SYSTEM "lwg-issue.dtd" [
+ <!ENTITY nbsp "&#160;">
+] >
+
+<issue num="40" status="New">
+<title>HasXXX concepts should not default second parameter when there is an XXXable concept</title>
+<section><sref ref="[utility.concepts]"/></section>
+<submitter>LWG</submitter>
+<date>9 Jun 2008</date>
+
+<discussion>
+ <p>In several cases, we have two-parameter <code>HasXXX</code>
+ concepts that detect the presence of a binary operator or function
+ (e.g., <code>&lt;</code>, <code>swap</code>, <code>==</code>) along
+ with a semantic version <code>XXXable</code> that is a
+ single-parameter refinement of that concept. For example, the pair
+ of concepts <code>HasEqualTo</code>
+ and <code>EqualityComparable</code>. Since we know of no cases where
+ one would need to use the <code>HasXXX</code> form of the concept
+ with only one parameter (all such cases use the <code>XXXable</code>
+ form), we should remove the default argument in
+ the <code>HasXXX</code> version to discourage its use with symmetric
+ types.</p>
+</discussion>
+
+<resolution>
+ <p>In [concept.comparison], modify paragraph 1 as follows:</p>
+
+ <pre>
+auto concept LessThanComparable&lt;typename T&gt; : HasLess&lt;T<ins>, T</ins>&gt; {
+ bool operator&gt;(T const&amp; a, T const&amp; b) { return b &lt; a; }
+ bool operator&lt;=(T const&amp; a, T const&amp; b) { return !(b &lt; a); }
+ bool operator&gt;=(T const&amp; a, T const&amp; b) { return !(a &lt; b); }
+ // ...
+}
+ </pre>
+
+ <p>In [concept.comparison], modify paragraph 2 as follows:</p>
+
+ <pre>
+auto concept EqualityComparable&lt;typename T&gt; : HasEqualTo&lt;T<ins>, T</ins>&gt; {
+ bool operator!=(T const&amp; a, T const&amp; b) { return !(a == b); }
+ // ...
+}
+ </pre>
+
+ <p>In [concept.copymove], modify paragraph 7 as follows:</p>
+ <pre>
+auto concept MoveAssignable&lt;typename T&gt; : HasMoveAssign&lt;T<ins>, T</ins>&gt; { }
+ </pre>
+
+ <p>In [concept.operator], modify paragraph 8 as follows:</p>
+
+ <pre>
+auto concept HasLess&lt;typename T, typename U<del> = T</del>&gt; {
+ bool operator&lt;(T const&amp; a, U const&amp; b);
+}
+ </pre>
+
+ <p>In [concept.operator], modify paragraph 9 as follows:</p>
+
+ <pre>
+auto concept HasEqualTo&lt;typename T, typename U<del> = T</del>&gt; {
+ bool operator==(T const&amp; a, U const&amp; b);
+}
+ </pre>
+
+ <p>In [concept.operator], modify paragraph 22 as follows:</p>
+
+ <pre>
+auto concept HasMoveAssign&lt;typename T, typename U<del> = T</del>&gt; {
+ typename result_type;
+ result_type T::operator=(U&amp;&amp;);
+}
+ </pre>
+
+ <p>In [concept.operator], modify paragraph 23 as follows:</p>
+
+ <pre>
+auto concept HasCopyAssign&lt;typename T, typename U<del> = T</del>&gt; : HasMoveAssign&lt;T, U&gt; {
+ result_type T::operator=(const U&amp;);
+}
+ </pre>
+
+ <p>Modify the synopsis in [utility.concepts] accordingly.</p>
+</resolution>
+</issue>

Added: sandbox/committee/concepts/issues/issues/issue41.xml
==============================================================================
--- (empty file)
+++ sandbox/committee/concepts/issues/issues/issue41.xml 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -0,0 +1,49 @@
+<?xml version='1.0' encoding='iso-8859-1' standalone='no'?>
+<!DOCTYPE issue SYSTEM "lwg-issue.dtd" [
+ <!ENTITY nbsp "&#160;">
+] >
+
+<issue num="41" status="New">
+<title><code>MoveConstructible</code> constructor should be <code>explicit</code></title>
+<section><sref ref="[concept.copymove]"/></section>
+<submitter>LWG</submitter>
+<date>9 Jun 2008</date>
+
+<discussion>
+ <p>Users are permitted to use types with explicit copy and move
+ constructors with the C++98 standard library. To support this use
+ case with concepts, the constructor requirements
+ in <code>MoveConstructible</code> and <code>CopyConstructible</code>
+ need to be <code>explicit</code>.</p>
+</discussion>
+
+<resolution>
+ <p>Modify [concept.copymove] paragraphs 1-3 as follows:</p>
+ <pre>
+auto concept MoveConstructible&lt;typename T&gt; <del>: HasConstructor&lt;T, T&amp;&amp;&gt;</del> {
+ <ins>explicit T::T(T&amp;&amp);</ins>
+}
+ </pre>
+ <ol>
+ <li><i>Note</i>: describes types that can move-construct an object
+ from a value of the same type, possibly altering that value.</li>
+ </ol>
+ <pre>
+T::T(T&amp;&amp; rv); <del>// note: inherited from HasConstructor&lt;T, T&amp;&amp;&gt;</del>
+ </pre>
+ <ol start="2">
+ <li><i>Postcondition</i>: the constructed <code>T</code> object is equivalent to the value of <code>rv</code> before the construction. [ <i>Note</i>: there is no
+ requirement on the value of <code>rv</code> after the construction. - <i>end note</i> ]</li>
+ </ol>
+
+ <pre>
+auto concept CopyConstructible&lt;typename T&gt; : MoveConstructible&lt;T&gt;<del>, HasConstructor&lt;T, const T&amp;</del>&gt; {
+ <ins>T::T(const T&amp;);</ins>
+
+ axiom CopyPreservation(T x) {
+ T(x) == x;
+ }
+}
+ </pre>
+</resolution>
+</issue>

Added: sandbox/committee/concepts/issues/issues/issue42.xml
==============================================================================
--- (empty file)
+++ sandbox/committee/concepts/issues/issues/issue42.xml 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -0,0 +1,19 @@
+<?xml version='1.0' encoding='iso-8859-1' standalone='no'?>
+<!DOCTYPE issue SYSTEM "lwg-issue.dtd" [
+ <!ENTITY nbsp "&#160;">
+] >
+
+<issue num="42" status="New">
+<title><code>HasCopyAssign</code> should be named <code>HasCopyAssignment</code></title>
+<section><sref ref="[concept.operator]"/></section>
+<submitter>LWG</submitter>
+<date>9 Jun 2008</date>
+
+<discussion>
+ <p>To match the naming scheme of the other operator
+ concepts, <code>HasCopyAssign</code> should be
+ named <code>HasCopyAssignment</code> and <code>HasMoveAssign</code>
+ should be named <code>HasMoveAssignment</code>.
+ </p>
+</discussion>
+</issue>

Modified: sandbox/committee/concepts/issues/issues/issue8.xml
==============================================================================
--- sandbox/committee/concepts/issues/issues/issue8.xml (original)
+++ sandbox/committee/concepts/issues/issues/issue8.xml 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -3,7 +3,7 @@
   <!ENTITY nbsp "&#160;">
 ] >
 
-<issue num="8" status="New">
+<issue num="8" status="Dup">
   <title><tt>Swappable</tt> and rvalue references</title>
 <section><sref ref="[concept.copymove]"/></section>
 <submitter>LWG</submitter>
@@ -22,4 +22,7 @@
     signatures that default to the first.</p>
 </discussion>
 
+<resolution>
+ <p>Superceded by issue <iref ref="35"/>.</p>
+</resolution>
 </issue>

Modified: sandbox/committee/concepts/stdlib/Makefile
==============================================================================
--- sandbox/committee/concepts/stdlib/Makefile (original)
+++ sandbox/committee/concepts/stdlib/Makefile 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -41,23 +41,25 @@
 
 .tex.pdf:
         @$(PDFLATEX) $*
- @if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null ); \
- then $(PDFLATEX) $* ; else :; fi
- @ if ( grep 'Writing index file' $*.log > /dev/null ); \
- then makeindex $* ; $(PDFLATEX) $* ; fi
- @-if ( grep 'LaTeX Warning: Citation' $*.log > /dev/null ); then \
- bibtex $* ; \
- $(PDFLATEX) $* ; \
- fi
- @if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null || \
- grep 'LaTeX Warning: Citation' $*.log > /dev/null); \
- then $(PDFLATEX) $* ; else :; fi
- @if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null || \
- grep 'LaTeX Warning: Citation' $*.log > /dev/null); \
- then $(PDFLATEX) $* ; else :; fi
- @if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null || \
- grep 'LaTeX Warning: Citation' $*.log > /dev/null); \
- then $(PDFLATEX) $* ; else :; fi
+
+
+# @if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null ); \
+# then $(PDFLATEX) $* ; else :; fi
+# @ if ( grep 'Writing index file' $*.log > /dev/null ); \
+# then makeindex $* ; $(PDFLATEX) $* ; fi
+# @-if ( grep 'LaTeX Warning: Citation' $*.log > /dev/null ); then \
+# bibtex $* ; \
+# $(PDFLATEX) $* ; \
+# fi
+# @if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null || \
+# grep 'LaTeX Warning: Citation' $*.log > /dev/null); \
+# then $(PDFLATEX) $* ; else :; fi
+# @if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null || \
+# grep 'LaTeX Warning: Citation' $*.log > /dev/null); \
+# then $(PDFLATEX) $* ; else :; fi
+# @if ( grep 'LaTeX Warning: Label(s) may' $*.log > /dev/null || \
+# grep 'LaTeX Warning: Citation' $*.log > /dev/null); \
+# then $(PDFLATEX) $* ; else :; fi
 
 
 #

Modified: sandbox/committee/concepts/stdlib/clib-algorithms.tex
==============================================================================
--- sandbox/committee/concepts/stdlib/clib-algorithms.tex (original)
+++ sandbox/committee/concepts/stdlib/clib-algorithms.tex 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -51,7 +51,7 @@
 \begin{center}
 \huge
 Concepts for the C++0x Standard Library: Algorithms \\
-(Revision 2)
+(Revision 3)
 
 \vspace{0.5in}
 
@@ -62,25 +62,27 @@
 \end{center}
 
 \vspace{1in}
-\par\noindent Document number: N2625=08-0135\vspace{-6pt}
-\par\noindent Revises document number: N2573=08-0083\vspace{-6pt}
+\par\noindent Document number: DRAFT\vspace{-6pt}
+\par\noindent Revises document number: N2625=08-0135\vspace{-6pt}
 \par\noindent Date: \today\vspace{-6pt}
 \par\noindent Project: Programming Language \Cpp{}, Library Working Group\vspace{-6pt}
 \par\noindent Reply-to: Douglas Gregor $<$\href{mailto:dgregor_at_[hidden]}{dgregor_at_[hidden]}$>$\vspace{-6pt}
 
 \section*{Introduction}
 \libintrotext{Chapter 25}
-\section*{Changes from N2084}
+\section*{Changes from N2625}
 \begin{itemize}
-\item Updated algorithm requirements to new concept syntax.
-\item Updated algorithm requirements to use the new iterator and
- utility concepts, including the relaxed iterator requirements in
- N2323 and the move concepts of N2322.
-\item Added new algorithms \tcode{move}, \tcode{move_backward},
- \tcode{is_sorted}, \tcode{is_sorted_until}, \tcode{is_heap},
- \tcode{is_heap_until}, \tcode{minmax} and \tcode{minmax_element},
- and the variadic \tcode{min}, \tcode{max}, and \tcode{minmax} overloads
- from N2551.
+\item Replace uses of \tcode{Integral} with \tcode{IntegralLike}.
+\item Changed several iterator \tcode{value_type} associated types to \tcode{reference} associated types, in the following algorithms:
+ \begin{itemize}
+ \item \tcode{remove_copy}, \tcode{remove_copy_if}
+ \item \tcode{unique_copy}
+ \item \tcode{reverse_copy}
+ \item \tcode{replace_copy}, \tcode{replace_copy_if}
+ \end{itemize}
+\item Changed \tcode{adjacent_find}'s \tcode{HasEqualTo} requirement
+ to use \tcode{EqualityComparable}.
+\item Fixed types in the parameter types of \tcode{mismatch}
 \end{itemize}
 
 \end{titlepage}
@@ -178,10 +180,10 @@
   template<InputIterator Iter1, InputIterator Iter2>
     requires HasEqualTo<Iter1::reference, Iter2::reference>
     pair<Iter1, Iter2> mismatch(Iter1 @\farg{first1}@, Iter1 @\farg{last1}@,
- Iter @\farg{first2}@);
+ Iter2 @\farg{first2}@);
   template<InputIterator Iter1, InputIterator Iter2,
            Predicate<auto, Iter1::reference, Iter2::reference> Pred>
- pair<Iter1, Iter2> mismatch(Iter1 @\farg{first1}@, Iter2 @\farg{last1}@,
+ pair<Iter1, Iter2> mismatch(Iter1 @\farg{first1}@, Iter1 @\farg{last1}@,
                                 Iter2 @\farg{first2}@, Pred @\farg{pred}@);
 
   template<InputIterator Iter1, InputIterator Iter2>
@@ -268,12 +270,12 @@
     requires HasCopyAssign<Iter::reference, T>
     void replace_if(Iter @\farg{first}@, Iter @\farg{last}@,
                     Pred @\farg{pred}@, const T& @\farg{new_value}@);
- template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter, class T>
+ template<InputIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter, class T>
     requires HasCopyAssign<OutIter::reference, T> && HasEqualTo<InIter::reference, T>
     OutIter replace_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                          OutIter @\farg{result}@,
                          const T& @\farg{old_value}@, const T& @\farg{new_value}@);
- template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter,
+ template<InputIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter,
            Predicate<auto, InIter::reference> Pred, class T>
     requires HasCopyAssign<OutIter::reference, T>
     OutIter replace_copy_if(InIter @\farg{first}@, InIter @\farg{last}@,
@@ -283,7 +285,7 @@
   template<MutableForwardIterator Iter, class T>
     requires HasCopyAssign<Iter::reference, T>
     void fill(Iter @\farg{first}@, Iter @\farg{last}@, const T& @\farg{value}@);
- template<class Iter, Integral Size, class T>
+ template<class Iter, IntegralLike Size, class T>
     requires OutputIterator<Iter, T>
     void fill_n(Iter @\farg{first}@, Size @\farg{n}@, const T& @\farg{value}@);
 
@@ -291,7 +293,7 @@
     requires HasCopyAssign<Iter::reference, Generator::result_type>
     void generate(Iter @\farg{first}@, Iter @\farg{last}@,
                   Generator @\farg{gen}@);
- template<class Iter, Integral Size, Callable Generator>
+ template<class Iter, IntegralLike Size, Callable Generator>
     requires OutputIterator<Iter, Generator::result_type>
     void generate_n(Iter @\farg{first}@, Size @\farg{n}@, Generator @\farg{gen}@);
 
@@ -303,11 +305,11 @@
     requires MoveAssignable<Iter::reference>
     Iter remove_if(Iter @\farg{first}@, Iter @\farg{last}@,
                    Pred @\farg{pred}@);
- template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter, class T>
+ template<InputIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter, class T>
     requires HasEqualTo<InIter::reference, T>
     OutIter remove_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                         OutIter @\farg{result}@, const T& @\farg{value}@);
- template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter,
+ template<InputIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter,
            Predicate<auto, InIter::reference> Pred>
     OutIter remove_copy_if(InIter @\farg{first}@, InIter @\farg{last}@,
                            OutIter @\farg{result}@, Pred @\farg{pred}@);
@@ -326,12 +328,12 @@
     OutIter
       unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                   OutIter @\farg{result}@);
- template<ForwardIterator InIter, OutputIterator<auto, InIter::value_type> OutIter>
+ template<ForwardIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter>
     requires EqualityComparable<InIter::reference>
     OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                         OutIter @\farg{result}@);
   template<InputIterator InIter, MutableForwardIterator OutIter>
- requires HasEqualTo<OutIter::reference, InIter::value_type> &&
+ requires HasEqualTo<OutIter::reference, InIter::@\changedCCC{value_type}{reference}@> &&
              HasCopyAssign<OutIter::reference, InIter::reference> &&
              !ForwardIterator<InIter>
     OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
@@ -342,7 +344,7 @@
              !ForwardIterator<InIter> && !MutableForwardIterator<OutIter>
     OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                         OutIter @\farg{result}@, Pred @\farg{pred}@);
- template<ForwardIterator InIter, OutputIterator<auto, InIter::value_type> OutIter,
+ template<ForwardIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter,
            Predicate<auto, InIter::reference, InIter::reference> Pred>
     OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                         OutIter @\farg{result}@);
@@ -353,31 +355,27 @@
     OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                         OutIter @\farg{result}@, Pred @\farg{pred}@);
 
- template<@\removedCC{Mutable}@BidirectionalIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ template<BidirectionalIterator Iter>
+ requires SwappableIterator<Iter>
     void reverse(Iter @\farg{first}@, Iter @\farg{last}@);
- template<BidirectionalIterator InIter, OutputIterator<auto, InIter::value_type> OutIter>
+ template<BidirectionalIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter>
     OutIter reverse_copy(InIter @\farg{first}@,
                          InIter @\farg{last}@, OutIter @\farg{result}@);
 
   template<ForwardIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     void rotate(Iter @\farg{first}@, Iter @\farg{middle}@,
                 Iter @\farg{last}@);
   template<ForwardIterator InIter, OutputIterator<auto, InIter::value_type> OutIter>
     OutIter rotate_copy(InIter @\farg{first}@, InIter @\farg{middle}@,
                         InIter @\farg{last}@, OutIter @\farg{result}@);
 
- template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter>
     void random_shuffle(Iter @\farg{first}@,
                         Iter @\farg{last}@);
- template<@\removedCC{Mutable}@RandomAccessIterator Iter, Callable<auto, Iter::difference_type> Rand>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\& }@
- @\addedCC{SwappableIterator<Iter> \&\&}@ Convertible<Rand::result_type, Iter::difference_type>
+ template<RandomAccessIterator Iter, Callable<auto, Iter::difference_type> Rand>
+ requires SwappableIterator<Iter> && Convertible<Rand::result_type, Iter::difference_type>
     void random_shuffle(Iter @\farg{first}@,
                         Iter @\farg{last}@,
                         Rand& @\farg{rand}@);
@@ -388,77 +386,58 @@
 
   @\textcolor{black}{// \ref{alg.partitions}, partitions:}@
   template<BidirectionalIterator Iter, Predicate<auto, Iter::reference> Pred>
- @\color{addclr}@requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ @\color{addclr}@requires SwappableIterator<Iter>
     Iter partition(Iter @\farg{first}@, Iter @\farg{last}@, Pred @\farg{pred}@);
- template<@\removedCC{Mutable}@BidirectionalIterator Iter, Predicate<auto Iter::reference> Pred>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ template<BidirectionalIterator Iter, Predicate<auto Iter::reference> Pred>
+ requires SwappableIterator<Iter>
     Iter stable_partition(Iter @\farg{first}@, Iter @\farg{last}@, Pred @\farg{pred}@);
 
   @\textcolor{black}{// \ref{alg.sorting}, sorting and related operations:}@
   @\textcolor{black}{// \ref{alg.sort}, sorting:}@
- template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+ template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
              LessThanComparable<Iter::value_type>
     void sort(Iter @\farg{first}@, Iter @\farg{last}@);
- template<@\removedCC{Mutable}@RandomAccessIterator Iter,
+ template<RandomAccessIterator Iter,
            Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     void sort(Iter @\farg{first}@, Iter @\farg{last}@,
               Compare @\farg{comp}@);
 
- template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+ template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
              LessThanComparable<Iter::value_type>
     void stable_sort(Iter @\farg{first}@, Iter @\farg{last}@);
- template<@\removedCC{Mutable}@RandomAccessIterator Iter,
+ template<RandomAccessIterator Iter,
            Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     void stable_sort(Iter @\farg{first}@, Iter @\farg{last}@,
                      Compare @\farg{comp}@);
 
- template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@ @\addedCC{\&\&}@
- @\addedCC{LessThanComparable<Iter::value_type>}@
+ template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
+ LessThanComparable<Iter::value_type>
     void partial_sort(Iter @\farg{first}@,
                       Iter @\farg{middle}@,
                       Iter @\farg{last}@);
- template<@\removedCC{Mutable}@RandomAccessIterator Iter,
+ template<RandomAccessIterator Iter,
            Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     void partial_sort(Iter @\farg{first}@,
                       Iter @\farg{middle}@,
                       Iter @\farg{last}@,
                       Compare @\farg{comp}@);
- template<InputIterator InIter, @\removedCC{Mutable}@RandomAccessIterator RAIter>
+ template<InputIterator InIter, RandomAccessIterator RAIter>
     requires HasCopyAssign<RAIter::reference, InIter::value_type> &&
- @\removedCC{SameType<RAIter::value_type\&, RAIter::reference> \&\& Swappable<RAIter::value_type> \&\&}@
- @\removedCC{MoveConstructible<RAIter::value_type> \&\& MoveAssignable<RAIter::value_type> \&\&}@
- @\addedCC{SwappableIterator<RAIter> \&\&}@
+ SwappableIterator<RAIter> &&
              HasLess<InIter::value_type, RAIter::value_type> &&
              HasLess<RAIter::value_type, InIter::value_type> &&
              HasLess<RAIter::value_type>
     RAIter partial_sort_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                              RAIter @\farg{result_first}@, RAIter @\farg{result_last}@);
- template<InputIterator InIter, @\removedCC{Mutable}@RandomAccessIterator RAIter, class Compare>
+ template<InputIterator InIter, RandomAccessIterator RAIter, class Compare>
     requires HasCopyAssign<RAIter::reference, InIter::value_type> &&
- @\removedCC{SameType<RAIter::value_type\&, RAIter::reference> \&\& Swappable<RAIter::value_type> \&\&}@
- @\removedCC{MoveConstructible<RAIter::value_type> \&\& MoveAssignable<RAIter::value_type> \&\&}@
- @\addedCC{SwappableIterator<RAIter> \&\&}@
+ SwappableIterator<RAIter> &&
              Predicate<Compare, InIter::value_type, RAIter::value_type> &&
              Predicate<Compare, RAIter::value_type, InIter::value_type> &&
              Predicate<Compare, RAIter::value_type>
@@ -479,18 +458,12 @@
     Iter is_sorted_until(Iter @\farg{first}@, Iter @\farg{last}@,
                          Compare @\farg{comp}@);
 
- template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+ template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
              LessThanComparable<Iter::value_type>
     void nth_element(Iter @\farg{first}@, Iter @\farg{nth}@,
                      Iter @\farg{last}@);
- template<@\removedCC{Mutable}@RandomAccessIterator Iter,
- Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ template<SwappableIterator<Iter>
     void nth_element(Iter @\farg{first}@, Iter @\farg{nth}@,
                      Iter @\farg{last}@, Compare @\farg{comp}@);
 
@@ -552,19 +525,15 @@
                   InIter2 @\farg{first2}@, InIter2 @\farg{last2}@,
                   OutIter @\farg{result}@, Compare @\farg{comp}@);
 
- template<@\removedCC{Mutable}@BidirectionalIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+ template<BidirectionalIterator Iter>
+ requires SwappableIterator<Iter> &&
              LessThanComparable<Iter::value_type>
     void inplace_merge(Iter @\farg{first}@,
                        Iter @\farg{middle}@,
                        Iter @\farg{last}@);
- template<@\removedCC{Mutable}@BidirectionalIterator Iter,
+ template<BidirectionalIterator Iter,
            Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     void inplace_merge(Iter @\farg{first}@,
                        Iter @\farg{middle}@,
                        Iter @\farg{last}@, Compare @\farg{comp}@);
@@ -642,52 +611,41 @@
                                      OutIter @\farg{result}@, Compare @\farg{comp}@);
 
   @\textcolor{black}{// \ref{alg.heap.operations}, heap operations:}@
- template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+ template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
              LessThanComparable<Iter::value_type>
     void push_heap(Iter @\farg{first}@, Iter @\farg{last}@);
- template<@\removedCC{Mutable}@RandomAccessIterator Iter,
+ template<RandomAccessIterator Iter,
            Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     void push_heap(Iter @\farg{first}@, Iter @\farg{last}@,
                    Compare @\farg{comp}@);
 
- template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\removedCC{Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@ && LessThanComparable<Iter::value_type>
+ template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> && LessThanComparable<Iter::value_type>
     void pop_heap(Iter @\farg{first}@, Iter @\farg{last}@);
- template<@\removedCC{Mutable}@RandomAccessIterator Iter,
+ template<RandomAccessIterator Iter,
            Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\removedCC{Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     void pop_heap(Iter @\farg{first}@, Iter @\farg{last}@,
                   Compare @\farg{comp}@);
 
- template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+ template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
              LessThanComparable<Iter::value_type>
     void make_heap(Iter @\farg{first}@, Iter @\farg{last}@);
- template<@\removedCC{Mutable}@RandomAccessIterator Iter,
+ template<RandomAccessIterator Iter,
            Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     void make_heap(Iter @\farg{first}@, Iter @\farg{last}@,
                    Compare @\farg{comp}@);
 
- template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\removedCC{Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@ && LessThanComparable<Iter::value_type>
+ template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> && LessThanComparable<Iter::value_type>
     void sort_heap(Iter @\farg{first}@, Iter @\farg{last}@);
- template<@\removedCC{Mutable}@RandomAccessIterator Iter,
+ template<RandomAccessIterator Iter,
            Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     void sort_heap(Iter @\farg{first}@, Iter @\farg{last}@,
                    Compare @\farg{comp}@);
 
@@ -705,35 +663,35 @@
   @\textcolor{black}{// \ref{alg.min.max}, minimum and maximum:}@
   template<LessThanComparable T> const T& min(const T& @\farg{a}@, const T& @\farg{b}@);
   template<class T, Predicate<auto, T, T> Compare>
- @\addedCC{requires !SameType<T, Compare>}@
+ requires !SameType<T, Compare>
     const T& min(const T& @\farg{a}@, const T& @\farg{b}@, Compare @\farg{comp}@);
- @\removedCC{template<LessThanComparable T> const T\& min(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
- @\addedCC{template<LessThanComparable T, LessThanComparable... Args>}@
- @\addedCC{requires SameType<T, Args>...}@
- @\addedCC{const T\& min(const T\& \mbox{\farg{a}}, const Args\&... \mbox{\farg{args}});}@
+ @\removedConcepts{template<LessThanComparable T> const T\& min(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
+ template<LessThanComparable T, LessThanComparable... Args>
+ requires SameType<T, Args>...
+ const T& min(const T& @\farg{a}@, const Args&... @\farg{args}@);
   @\textcolor{black}{template<class T, class U, class... Args>}@
     @\textcolor{black}{const T\& min(const T\& \mbox{\farg{a}}, const U\& \mbox{\farg{b}}, const Args\&... \mbox{\farg{args}});}@
 
   template<LessThanComparable T> const T& max(const T& @\farg{a}@, const T& @\farg{b}@);
   template<class T, Predicate<auto, T, T> Compare>
- @\addedCC{requires !SameType<T, Compare>}@
+ requires !SameType<T, Compare>
     const T& max(const T& @\farg{a}@, const T& @\farg{b}@, Compare @\farg{comp}@);
- @\removedCC{template<LessThanComparable T> const T\& max(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
- @\addedCC{template<LessThanComparable T, LessThanComparable... Args>}@
- @\addedCC{requires SameType<T, Args>...}@
- @\addedCC{const T\& max(const T\& \mbox{\farg{a}}, const Args\&... \mbox{\farg{args}});}@
+ @\removedConcepts{template<LessThanComparable T> const T\& max(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
+ template<LessThanComparable T, LessThanComparable... Args>
+ requires SameType<T, Args>...
+ const T& max(const T& @\farg{a}@, const Args&... @\farg{args}@);
   @\textcolor{black}{template<class T, class U, class... Args>}@
     @\textcolor{black}{const T\& max(const T\& \mbox{\farg{a}}, const U\& \mbox{\farg{b}}, const Args\&... \mbox{\farg{args}});}@
 
   template<LessThanComparable T> pair<const T&, const T&> minmax(const T& @\farg{a}@, const T& @\farg{b}@);
   template<class T, Predicate<auto, T, T> Compare>
- @\addedCC{requires !SameType<T, Compare>}@
+ requires !SameType<T, Compare>
     pair<const T&, const T&> minmax(const T& @\farg{a}@, const T& @\farg{b}@, Compare @\farg{comp}@);
- @\removedCC{template<LessThanComparable T>}@
- @\removedCC{pair<const T\&, const T\&> minmax(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
- @\addedCC{template<LessThanComparable T, LessThanComparable... Args>}@
- @\addedCC{requires SameType<T, Args>...}@
- @\addedCC{pair<const T\&, const T\&> minmax(const T\& \mbox{\farg{a}}, const Args\&... \mbox{\farg{args}});}@
+ @\removedConcepts{template<LessThanComparable T>}@
+ @\removedConcepts{pair<const T\&, const T\&> minmax(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
+ template<LessThanComparable T, LessThanComparable... Args>
+ requires SameType<T, Args>...
+ pair<const T&, const T&> minmax(const T& @\farg{a}@, const Args&... @\farg{args}@);
   @\textcolor{black}{template<class T, class U, class... Args>}@
     @\textcolor{black}{pair<const T\&, const T\&> minmax(const T\& \mbox{\farg{a}}, const U\& \mbox{\farg{b}}, const Args\&... \mbox{\farg{args}});}@
 
@@ -773,25 +731,21 @@
                                  Compare @\farg{comp}@);
 
   @\textcolor{black}{// \ref{alg.permutation.generators}, permutations:}@
- template<@\removedCC{Mutable}@BidirectionalIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter>}@
+ template<BidirectionalIterator Iter>
+ requires SwappableIterator<Iter>
              @\textcolor{addclr}{LessThanComparable}@<Iter::reference>
     bool next_permutation(Iter @\farg{first}@, Iter @\farg{last}@);
- template<@\removedCC{Mutable}@BidirectionalIterator Iter,
+ template<BidirectionalIterator Iter,
            Predicate<auto, Iter::reference, Iter::reference> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     @\textcolor{addclr}{}@bool next_permutation(Iter @\farg{first}@, Iter @\farg{last}@, Compare @\farg{comp}@);
- template<@\removedCC{Mutable}@BidirectionalIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter>}@
+ template<BidirectionalIterator Iter>
+ requires SwappableIterator<Iter>
              @\textcolor{addclr}{}@LessThanComparable<Iter::reference>
     bool prev_permutation(Iter @\farg{first}@, Iter @\farg{last}@);
- template<@\removedCC{Mutable}@BidirectionalIterator Iter,
+ template<BidirectionalIterator Iter,
            Predicate<auto, Iter::reference, Iter::reference> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
     bool prev_permutation(Iter @\farg{first}@, Iter @\farg{last}@, Compare @\farg{comp}@);
 }
 \end{codeblock}
@@ -1141,7 +1095,7 @@
 \index{adjacent_find@\tcode{adjacent_find}}%
 \color{addclr}\begin{itemdecl}
 template<ForwardIterator Iter>
- requires HasEqualTo<Iter::reference>
+ requires @\changedCCC{HasEqualTo}{EqualityComparable}@<Iter::reference>
   Iter adjacent_find(Iter @\farg{first}@, Iter @\farg{last}@);
 
 template<ForwardIterator Iter, Predicate<auto, Iter::reference, Iter::reference> Pred>
@@ -1212,11 +1166,11 @@
 template<InputIterator Iter1, InputIterator Iter2>
   requires HasEqualTo<Iter1::reference, Iter2::reference>
   pair<Iter1, Iter2> mismatch(Iter1 @\farg{first1}@, Iter1 @\farg{last1}@,
- Iter @\farg{first2}@);
+ Iter2 @\farg{first2}@);
 
 template<InputIterator Iter1, InputIterator Iter2,
          Predicate<auto, Iter1::reference, Iter2::reference> Pred>
- pair<Iter1, Iter2> mismatch(Iter1 @\farg{first1}@, Iter2 @\farg{last1}@,
+ pair<Iter1, Iter2> mismatch(Iter1 @\farg{first1}@, Iter1 @\farg{last1}@,
                               Iter2 @\farg{first2}@, Pred @\farg{pred}@);
 \end{itemdecl}\color{black}
 
@@ -1751,13 +1705,13 @@
 \index{replace_copy@\tcode{replace_copy}}%
 \index{replace_copy_if@\tcode{replace_copy_if}}%
 \color{addclr}\begin{itemdecl}
-template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter, class T>
+template<InputIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter, class T>
   requires HasCopyAssign<OutIter::reference, T> && HasEqualTo<InIter::reference, T>
   OutIter replace_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                        OutIter @\farg{result}@,
                        const T& @\farg{old_value}@, const T& @\farg{new_value}@);
 
-template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter,
+template<InputIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter,
          Predicate<auto, InIter::reference> Pred, class T>
   requires HasCopyAssign<OutIter::reference, T>
   OutIter replace_copy_if(InIter @\farg{first}@, InIter @\farg{last}@,
@@ -1819,7 +1773,7 @@
   requires HasCopyAssign<Iter::reference, T>
   void fill(Iter @\farg{first}@, Iter @\farg{last}@, const T& @\farg{value}@);
 
-template<class Iter, Integral Size, class T>
+template<class Iter, IntegralLike Size, class T>
   requires OutputIterator<Iter, T>
   void fill_n(Iter @\farg{first}@, Size @\farg{n}@, const T& @\farg{value}@);
 \end{itemdecl}\color{black}
@@ -1831,7 +1785,7 @@
   12.3).}\efootnote{The ``Convertible to integral type'' requirements
   are very odd. We can model them with concepts if we need, but I've
   chosen the simpler route of requiring the \tcode{Size} parameter to model
- \tcode{Integral}. This could break existing code, although it
+ \tcode{IntegralLike}. This could break existing code, although it
   appears that such existing code would fail to compile with at least
   libstdc++.}
 
@@ -1859,7 +1813,7 @@
   void generate(Iter @\farg{first}@, Iter @\farg{last}@,
                 Generator @\farg{gen}@);
 
-template<class Iter, Integral Size, Callable Generator>
+template<class Iter, IntegralLike Size, Callable Generator>
   requires OutputIterator<Iter, Generator::result_type>
   void generate_n(Iter @\farg{first}@, Size @\farg{n}@, Generator @\farg{gen}@);
 \end{itemdecl}\color{black}
@@ -1880,7 +1834,7 @@
   12.3).}\efootnote{The ``Convertible to integral type'' requirements
   are very odd. We can model them with concepts if we need, but I've
   chosen the simpler route of requiring the \tcode{Size} parameter to model
- \tcode{Integral}. This could break existing code, although it
+ \tcode{IntegralLike}. This could break existing code, although it
   appears that such existing code would fail to compile with at least
   libstdc++.}
 
@@ -1939,12 +1893,12 @@
 \index{remove_copy@\tcode{remove_copy}}%
 \index{remove_copy_if@\tcode{remove_copy_if}}%
 \color{addclr}\begin{itemdecl}
-template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter, class T>
+template<InputIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter, class T>
   requires HasEqualTo<InIter::reference, T>
   OutIter remove_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                       OutIter @\farg{result}@, const T& @\farg{value}@);
 
-template<InputIterator InIter, OutputIterator<auto, InIter::value_type> OutIter,
+template<InputIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter,
          Predicate<auto, InIter::reference> Pred>
   OutIter remove_copy_if(InIter @\farg{first}@, InIter @\farg{last}@,
                          OutIter @\farg{result}@, Pred @\farg{pred}@);
@@ -2037,13 +1991,13 @@
     unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                 OutIter @\farg{result}@);
 
-template<ForwardIterator InIter, OutputIterator<auto, InIter::value_type> OutIter>
+template<ForwardIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter>
   requires EqualityComparable<InIter::reference>
   OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                       OutIter @\farg{result}@);
 
 @\textcolor{addclr}{template}@<InputIterator InIter, MutableForwardIterator OutIter>
- requires HasEqualTo<OutIter::reference, InIter::value_type> &&
+ requires HasEqualTo<OutIter::reference, InIter::@\changedCCC{value_type}{reference}@> &&
            HasCopyAssign<OutIter::reference, InIter::reference> &&
            !ForwardIterator<InIter>
   OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
@@ -2056,7 +2010,7 @@
   OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                       @\textcolor{addclr}{OutIter}@ @\farg{result}@, Pred @\farg{pred}@);
 
-template<ForwardIterator InIter, OutputIterator<auto, InIter::value_type> OutIter,
+template<ForwardIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter,
          Predicate<auto, InIter::reference, InIter::reference> Pred>
   OutIter unique_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                       OutIter @\farg{result}@);
@@ -2122,9 +2076,8 @@
 
 \index{reverse@\tcode{reverse}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@BidirectionalIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<BidirectionalIterator Iter>
+ requires SwappableIterator<Iter>
   void reverse(Iter @\farg{first}@, Iter @\farg{last}@);
 \end{itemdecl}\color{black}
 
@@ -2152,7 +2105,7 @@
 
 \index{reverse_copy@\tcode{reverse_copy}}%
 \color{addclr}\begin{itemdecl}
-template<BidirectionalIterator InIter, OutputIterator<auto, InIter::value_type> OutIter>
+template<BidirectionalIterator InIter, OutputIterator<auto, InIter::@\changedCCC{value_type}{reference}@> OutIter>
   OutIter reverse_copy(InIter @\farg{first}@,
                        InIter @\farg{last}@, OutIter @\farg{result}@);
 \end{itemdecl}\color{black}
@@ -2194,8 +2147,7 @@
 \index{rotate@\tcode{rotate}}%
 \color{addclr}\begin{itemdecl}
 template<ForwardIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
   void rotate(Iter @\farg{first}@, Iter @\farg{middle}@,
               Iter @\farg{last}@);
 \end{itemdecl}\color{black}
@@ -2273,15 +2225,13 @@
 
 \index{random_shuffle@\tcode{random_shuffle}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter>
   void random_shuffle(Iter @\farg{first}@,
                       Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@RandomAccessIterator Iter, Callable<auto, Iter::difference_type> Rand>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\& }@
- @\addedCC{SwappableIterator<Iter> \&\&}@ Convertible<Rand::result_type, Iter::difference_type>
+template<RandomAccessIterator Iter, Callable<auto, Iter::difference_type> Rand>
+ requires SwappableIterator<Iter> && Convertible<Rand::result_type, Iter::difference_type>
   void random_shuffle(Iter @\farg{first}@,
                       Iter @\farg{last}@,
                       Rand&& @\farg{rand}@);
@@ -2342,8 +2292,7 @@
 \index{partition@\tcode{partition}}%
 \color{addclr}\begin{itemdecl}
 @\textcolor{addclr}{}@template<BidirectionalIterator Iter, Predicate<auto, Iter::reference> Pred>
- @\color{addclr}@requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ @\color{addclr}@requires SwappableIterator<Iter>
   Iter partition(Iter @\farg{first}@, Iter @\farg{last}@, Pred @\farg{pred}@);
 \end{itemdecl}\color{black}
 
@@ -2391,10 +2340,8 @@
 
 \index{stable_partition@\tcode{stable_partition}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@BidirectionalIterator Iter, Predicate<auto Iter::reference> Pred>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<BidirectionalIterator Iter, Predicate<auto Iter::reference> Pred>
+ requires SwappableIterator<Iter>
   Iter stable_partition(Iter @\farg{first}@, Iter @\farg{last}@, Pred @\farg{pred}@);
 \end{itemdecl}\color{black}
 
@@ -2449,17 +2396,13 @@
 
 \index{sort@\tcode{sort}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
            LessThanComparable<Iter::value_type>
   void sort(Iter @\farg{first}@, Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
+ requires SwappableIterator<Iter>
   void sort(Iter @\farg{first}@, Iter @\farg{last}@,
             Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
@@ -2496,17 +2439,13 @@
 
 \index{stable_sort@\tcode{stable_sort}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
            LessThanComparable<Iter::value_type>
   void stable_sort(Iter @\farg{first}@, Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
+ requires SwappableIterator<Iter>
   void stable_sort(Iter @\farg{first}@, Iter @\farg{last}@,
                    Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
@@ -2542,19 +2481,15 @@
 
 \index{partial_sort@\tcode{partial_sort}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@ @\addedCC{\&\&}@
- @\addedCC{LessThanComparable<Iter::value_type>}@
+template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
+ LessThanComparable<Iter::value_type>
   void partial_sort(Iter @\farg{first}@,
                     Iter @\farg{middle}@,
                     Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
+ requires SwappableIterator<Iter>
   void partial_sort(Iter @\farg{first}@,
                     Iter @\farg{middle}@,
                     Iter @\farg{last}@,
@@ -2595,22 +2530,18 @@
 
 \index{partial_sort_copy@\tcode{partial_sort_copy}}%
 \color{addclr}\begin{itemdecl}
-template<InputIterator InIter, @\removedCC{Mutable}@RandomAccessIterator RAIter>
+template<InputIterator InIter, RandomAccessIterator RAIter>
   requires HasCopyAssign<RAIter::reference, InIter::value_type> &&
- @\removedCC{SameType<RAIter::value_type\&, RAIter::reference> \&\& Swappable<RAIter::value_type> \&\&}@
- @\removedCC{MoveConstructible<RAIter::value_type> \&\& MoveAssignable<RAIter::value_type> \&\&}@
- @\addedCC{SwappableIterator<RAIter> \&\&}@
+ SwappableIterator<RAIter> &&
            HasLess<InIter::value_type, RAIter::value_type> &&
            HasLess<RAIter::value_type, InIter::value_type> &&
            HasLess<RAIter::value_type>
   RAIter partial_sort_copy(InIter @\farg{first}@, InIter @\farg{last}@,
                            RAIter @\farg{result_first}@, RAIter @\farg{result_last}@);
 
-template<InputIterator InIter, @\removedCC{Mutable}@RandomAccessIterator RAIter, class Compare>
+template<InputIterator InIter, RandomAccessIterator RAIter, class Compare>
   requires HasCopyAssign<RAIter::reference, InIter::value_type> &&
- @\removedCC{SameType<RAIter::value_type\&, RAIter::reference> \&\& Swappable<RAIter::value_type> \&\&}@
- @\removedCC{MoveConstructible<RAIter::value_type> \&\& MoveAssignable<RAIter::value_type> \&\&}@
- @\addedCC{SwappableIterator<RAIter> \&\&}@
+ SwappableIterator<RAIter> &&
            Predicate<Compare, InIter::value_type, RAIter::value_type> &&
            Predicate<Compare, RAIter::value_type, InIter::value_type> &&
            Predicate<Compare, RAIter::value_type>
@@ -2706,19 +2637,15 @@
 
 \index{nth_element@\tcode{nth_element}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
            LessThanComparable<Iter::value_type>
   void nth_element(Iter @\farg{first}@, Iter @\farg{nth}@,
                    Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@RandomAccessIterator Iter,
+template<RandomAccessIterator Iter,
          Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
   void nth_element(Iter @\farg{first}@, Iter @\farg{nth}@,
                    Iter @\farg{last}@, Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
@@ -3061,20 +2988,16 @@
 
 \index{inplace_merge@\tcode{inplace_merge}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@BidirectionalIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+template<BidirectionalIterator Iter>
+ requires SwappableIterator<Iter> &&
            LessThanComparable<Iter::value_type>
   void inplace_merge(Iter @\farg{first}@,
                      Iter @\farg{middle}@,
                      Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@BidirectionalIterator Iter,
+template<BidirectionalIterator Iter,
          Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+ requires SwappableIterator<Iter>
   void inplace_merge(Iter @\farg{first}@,
                      Iter @\farg{middle}@,
                      Iter @\farg{last}@, Compare @\farg{comp}@);
@@ -3433,15 +3356,13 @@
 
 \index{push_heap@\tcode{push_heap}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
            LessThanComparable<Iter::value_type>
   void push_heap(Iter @\farg{first}@, Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
+ requires SwappableIterator<Iter>
   void push_heap(Iter @\farg{first}@, Iter @\farg{last}@,
                  Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
@@ -3476,16 +3397,12 @@
 
 \index{pop_heap@\tcode{pop_heap}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\removedCC{Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@ && LessThanComparable<Iter::value_type>
+template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> && LessThanComparable<Iter::value_type>
   void pop_heap(Iter @\farg{first}@, Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\removedCC{Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
+ requires SwappableIterator<Iter>
   void pop_heap(Iter @\farg{first}@, Iter @\farg{last}@,
                 Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
@@ -3524,15 +3441,13 @@
 
 \index{make_heap@\tcode{make_heap}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter> \&\&}@
+template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> &&
            LessThanComparable<Iter::value_type>
   void make_heap(Iter @\farg{first}@, Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
+ requires SwappableIterator<Iter>
   void make_heap(Iter @\farg{first}@, Iter @\farg{last}@,
                  Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
@@ -3561,15 +3476,12 @@
 
 \index{sort_heap@\tcode{sort_heap}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@RandomAccessIterator Iter>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type> \&\&}@
- @\removedCC{Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@ && LessThanComparable<Iter::value_type>
+template<RandomAccessIterator Iter>
+ requires SwappableIterator<Iter> && LessThanComparable<Iter::value_type>
   void sort_heap(Iter @\farg{first}@, Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
- requires @\removedCC{MoveConstructible<Iter::value_type> \&\& MoveAssignable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<RandomAccessIterator Iter, Predicate<auto, Iter::value_type, Iter::value_type> Compare>
+ requires SwappableIterator<Iter>
   void sort_heap(Iter @\farg{first}@, Iter @\farg{last}@,
                  Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
@@ -3651,7 +3563,7 @@
 \color{addclr}\begin{itemdecl}
 template<LessThanComparable T> const T& min(const T& @\farg{a}@, const T& @\farg{b}@);
 template<class T, Predicate<auto, T, T> Compare>
- @\addedCC{requires !SameType<T, Compare>}@
+ requires !SameType<T, Compare>
   const T& min(const T& @\farg{a}@, const T& @\farg{b}@, Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
 
@@ -3673,15 +3585,15 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\removedCC{template<LessThanComparable T> const T\& min(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
-@\addedCC{template<LessThanComparable T, LessThanComparable... Args>}@
- @\addedCC{requires SameType<T, Args>...}@
- @\addedCC{const T\& min(const T\& \mbox{\farg{a}}, const Args\&... \mbox{\farg{args}});}@
+@\removedConcepts{template<LessThanComparable T> const T\& min(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
+@\addedConcepts{template<LessThanComparable T, LessThanComparable... Args>}@
+ @\addedConcepts{requires SameType<T, Args>...}@
+ @\addedConcepts{const T\& min(const T\& \mbox{\farg{a}}, const Args\&... \mbox{\farg{args}});}@
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
-\removedCC{\mbox{\requires} Type \mbox{\tcode{T}} is
+\removedConcepts{\mbox{\requires} Type \mbox{\tcode{T}} is
   \mbox{\tcode{LessThanComparable}}, and all types forming
   \mbox{\tcode{Args...}} are the same as \mbox{\tcode{T}}.}
 
@@ -3732,7 +3644,7 @@
 \color{addclr}\begin{itemdecl}
 template<LessThanComparable T> const T& max(const T& @\farg{a}@, const T& @\farg{b}@);
 template<class T, Predicate<auto, T, T> Compare>
- @\addedCC{requires !SameType<T, Compare>}@
+ @\addedConcepts{requires !SameType<T, Compare>}@
   const T& max(const T& @\farg{a}@, const T& @\farg{b}@, Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
 
@@ -3754,15 +3666,15 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\removedCC{template<LessThanComparable T> const T\& max(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
-@\addedCC{template<LessThanComparable T, LessThanComparable... Args>}@
- @\addedCC{requires SameType<T, Args>...}@
- @\addedCC{const T\& max(const T\& \mbox{\farg{a}}, const Args\&... \mbox{\farg{args}});}@
+@\removedConcepts{template<LessThanComparable T> const T\& max(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
+@\addedConcepts{template<LessThanComparable T, LessThanComparable... Args>}@
+ @\addedConcepts{requires SameType<T, Args>...}@
+ @\addedConcepts{const T\& max(const T\& \mbox{\farg{a}}, const Args\&... \mbox{\farg{args}});}@
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
-\removedCC{\mbox{\requires} Type \mbox{\tcode{T}} is
+\removedConcepts{\mbox{\requires} Type \mbox{\tcode{T}} is
   \mbox{\tcode{LessThanComparable}}, and all types forming
   \mbox{\tcode{Args...}} are the same as \mbox{\tcode{T}}.}
 
@@ -3808,7 +3720,7 @@
 \begin{itemdecl}
 template<LessThanComparable T> pair<const T&, const T&> minmax(const T& @\farg{a}@, const T& @\farg{b}@);
 template<class T, Predicate<auto, T, T> Compare>
- @\addedCC{requires !SameType<T, Compare>}@
+ @\addedConcepts{requires !SameType<T, Compare>}@
   @\textcolor{addclr}{pair}@<const T&, const T&> minmax(const T& @\farg{a}@, const T& @\farg{b}@, Compare @\farg{comp}@);
 \end{itemdecl}
 \color{black}
@@ -3837,16 +3749,16 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-@\removedCC{template<LessThanComparable T>}@
- @\removedCC{pair<const T\&, const T\&> minmax(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
-@\addedCC{template<LessThanComparable T, LessThanComparable... Args>}@
- @\addedCC{requires SameType<T, Args>...}@
- @\addedCC{pair<const T\&, const T\&> minmax(const T\& \mbox{\farg{a}}, const Args\&... \mbox{\farg{args}});}@
+@\removedConcepts{template<LessThanComparable T>}@
+ @\removedConcepts{pair<const T\&, const T\&> minmax(const T\& \mbox{\farg{a}}, const T\& \mbox{\farg{b}}, const T\& \mbox{\farg{c}});}@
+@\addedConcepts{template<LessThanComparable T, LessThanComparable... Args>}@
+ @\addedConcepts{requires SameType<T, Args>...}@
+ @\addedConcepts{pair<const T\&, const T\&> minmax(const T\& \mbox{\farg{a}}, const Args\&... \mbox{\farg{args}});}@
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
-\removedCC{\mbox{\requires} Type \mbox{\tcode{T}} is
+\removedConcepts{\mbox{\requires} Type \mbox{\tcode{T}} is
   \mbox{\tcode{LessThanComparable}}, and all types forming
   \mbox{\tcode{Args...}} are the same as \mbox{\tcode{T}}.}
 
@@ -4079,15 +3991,13 @@
 
 \index{next_permutation@\tcode{next_permutation}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@BidirectionalIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter>}@
+template<BidirectionalIterator Iter>
+ requires SwappableIterator<Iter>
            @\textcolor{addclr}{LessThanComparable}@<Iter::reference>
   bool next_permutation(Iter @\farg{first}@, Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@BidirectionalIterator Iter, Predicate<auto, Iter::reference, Iter::reference> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<BidirectionalIterator Iter, Predicate<auto, Iter::reference, Iter::reference> Compare>
+ requires SwappableIterator<Iter>
   @\textcolor{addclr}{bool}@ next_permutation(Iter @\farg{first}@, Iter @\farg{last}@, Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
 
@@ -4121,15 +4031,13 @@
 
 \index{prev_permutation@\tcode{prev_permutation}}%
 \color{addclr}\begin{itemdecl}
-template<@\removedCC{Mutable}@BidirectionalIterator Iter>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type> \&\&}@
- @\addedCC{SwappableIterator<Iter>}@
+template<BidirectionalIterator Iter>
+ requires SwappableIterator<Iter>
            @\textcolor{addclr}{}@LessThanComparable<Iter::reference>
   bool prev_permutation(Iter @\farg{first}@, Iter @\farg{last}@);
 
-template<@\removedCC{Mutable}@BidirectionalIterator Iter, Predicate<auto, Iter::reference, Iter::reference> Compare>
- requires @\removedCC{SameType<Iter::value_type\&, Iter::reference> \&\& Swappable<Iter::value_type>}@
- @\addedCC{SwappableIterator<Iter>}@
+template<BidirectionalIterator Iter, Predicate<auto, Iter::reference, Iter::reference> Compare>
+ requires SwappableIterator<Iter>
   bool prev_permutation(Iter @\farg{first}@, Iter @\farg{last}@, Compare @\farg{comp}@);
 \end{itemdecl}\color{black}
 

Modified: sandbox/committee/concepts/stdlib/clib-concepts.tex
==============================================================================
--- sandbox/committee/concepts/stdlib/clib-concepts.tex (original)
+++ sandbox/committee/concepts/stdlib/clib-concepts.tex 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -561,11 +561,6 @@
 \end{itemdescr}
 
 \rSec2[concept.comparison]{Comparisons}
-\begin{itemdescr}
-\pnum
-\addedConcepts{\mbox{\reallynote} describes types with an operator <.}
-\end{itemdescr}
-
 \begin{itemdecl}
 auto concept LessThanComparable<typename T> : HasLess<T> {
   bool operator>(T const& a, T const& b) { return b < a; }

Modified: sandbox/committee/concepts/stdlib/macros.tex
==============================================================================
--- sandbox/committee/concepts/stdlib/macros.tex (original)
+++ sandbox/committee/concepts/stdlib/macros.tex 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -1103,6 +1103,8 @@
 \newcommand{\addedCC}[1]{\textcolor{ccadd}{\ul{#1}}}
 \newcommand{\removedCC}[1]{\textcolor{remclr}{\st{#1}}}
 \newcommand{\changedCC}[2]{\removedCC{#1}\addedCC{#2}}
+\newcommand{\changedCCC}[2]{\textcolor{addclr}{\st{#1}}\addedCC{#2}}
+\newcommand{\removedCCC}[1]{\textcolor{addclr}{\st{#1}}}
 \newcommand{\remitemCC}[1]{\remitem{#1}}
 \newcommand{\additemCC}[1]{\item\addedCC{#1}}
 

Modified: sandbox/committee/concepts/wording/wording.tex
==============================================================================
--- sandbox/committee/concepts/wording/wording.tex (original)
+++ sandbox/committee/concepts/wording/wording.tex 2008-06-09 16:45:52 EDT (Mon, 09 Jun 2008)
@@ -1926,7 +1926,7 @@
     void h() const &; // OK
     void h() &&; // OK, all declarations have a ref-qualifier
     void i() &;
- void f() const; // ill-formed, prior declaration of i
+ void i() const; // ill-formed, prior declaration of i
                     @\textcolor{black}{}@// has a ref-qualifier
 };
 \end{codeblock}


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