|
Boost-Commit : |
From: dgregor_at_[hidden]
Date: 2008-08-18 21:42:40
Author: dgregor
Date: 2008-08-18 21:42:40 EDT (Mon, 18 Aug 2008)
New Revision: 48205
URL: http://svn.boost.org/trac/boost/changeset/48205
Log:
Fix priority_queue, queue, stack, and add RangeInsertionContainer concepts
Text files modified:
sandbox/committee/concepts/stdlib/clib-containers.tex | 208 +++++++++++++++++++++++++--------------
1 files changed, 131 insertions(+), 77 deletions(-)
Modified: sandbox/committee/concepts/stdlib/clib-containers.tex
==============================================================================
--- sandbox/committee/concepts/stdlib/clib-containers.tex (original)
+++ sandbox/committee/concepts/stdlib/clib-containers.tex 2008-08-18 21:42:40 EDT (Mon, 18 Aug 2008)
@@ -120,6 +120,10 @@
\tcode{BackInsertionSequence}, and \tcode{InsertionSequence} to
\tcode{FrontInsertionContainer}, \tcode{BackInsertionContainer}, and
\tcode{InsertionContainer}, respectively.
+\item Added the \tcode{RangeInsertionContainer} and
+ \tcode{MemberRangeInsertionContainer} concepts, along with a concept
+ map to adapt from member- to free-function syntax, which is
+ necessary for \tcode{priority_queue}'s constructors.
\end{itemize}
\end{titlepage}
@@ -837,18 +841,22 @@
concept FrontInsertionContainer<typename C> @\textit{see below}@
concept BackInsertionContainer<typename C> @\textit{see below}@
concept InsertionContainer<typename C> @\textit{see below}@
+ concept RangeInsertionContainer<typename C, typename Iter> @\textit{see below}@
// \ref{container.concepts.member}, member container concepts
- concept MemberContainer<typename C> @\textit{see below}@
- concept MemberFrontInsertionContainer<typename C> @\textit{see below}@
- concept MemberBackInsertionContainer<typename C> @\textit{see below}@
- concept MemberInsertionContainer<typename C> @\textit{see below}@
+ auto concept MemberContainer<typename C> @\textit{see below}@
+ auto concept MemberFrontInsertionContainer<typename C> @\textit{see below}@
+ auto concept MemberBackInsertionContainer<typename C> @\textit{see below}@
+ auto concept MemberInsertionContainer<typename C> @\textit{see below}@
+ auto concept MemberRangeInsertionContainer<typename C, typename Iter> @\textit{see below}@
// \mbox{\ref{container.concepts.maps}}, container concept maps
template <MemberContainer C> concept_map Container<C> @\textit{see below}@
template <MemberFrontInsertionContainer C> concept_map FrontInsertionContainer<C> @\textit{see below}@
template <MemberBackInsertionContainer C> concept_map BackInsertionContainer<C> @\textit{see below}@
template <MemberInsertionContainer C> concept_map InsertionContainer<C> @\textit{see below}@
+ template <MemberRangeInsertionContainer C, InputIterator Iter>
+ concept_map RangeInsertionContainer<C, Iter> @\textit{see below}@
template <typename E, size_t N> concept_map Container<E[N]> @\textit{see below}@
template <typename E, size_t N> concept_map Container<const E[N]> @\textit{see below}@
}
@@ -864,7 +872,7 @@
(\mbox{\ref{container.concepts.member}}) and (\mbox{\ref{container.concepts.maps}}).}
\begin{itemdecl}
-auto concept Container<typename C> {
+concept Container<typename C> {
ObjectType value_type = typename C::value_type;
typename reference = typename C::reference;
typename const_reference = typename C::const_reference;
@@ -969,6 +977,19 @@
modified by inserting elements at any position within the sequence.}
\end{itemdescr}
+\begin{itemdecl}
+concept RangeInsertionContainer<typename C, typename Iter> : InsertionContainer<C> {
+ requires InputIterator<Iter>;
+ void insert(C&, const_iterator position, Iter first, Iter last);
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+ \pnum \addedConcepts{\mbox{\reallynote} describes a container that
+ can be modified by inserting a sequence of elements at any
+ position within the sequence.}
+\end{itemdescr}
+
\rSec3[container.concepts.member]{Member container concepts}
\pnum
@@ -1041,7 +1062,7 @@
\addedConcepts{\mbox{\reallynote} describes a container, in terms of
member functions, that can be
modified by adding or removing elements from the front of the
- sequence.}
+ container.}
\end{itemdescr}
\begin{itemdecl}
@@ -1067,28 +1088,32 @@
\pnum
\addedConcepts{\mbox{\reallynote} describes a container, in terms of member functions, that can be
modified by adding or removing elements from the back of the
- sequence.}
+ container.}
\end{itemdescr}
-
\begin{itemdecl}
auto concept MemberInsertionContainer<typename C> : MemberContainer<C> {
iterator C::insert(const_iterator, const value_type&);
}
\end{itemdecl}
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} describes a container, in terms of member functions, that can be
+ modified by inserting elements at any position within the container.}
+\end{itemdescr}
+
\begin{itemdecl}
-template <MemberInsertionContainer C>
-concept_map InsertionContainer<C> {
- Container<C>::iterator insert(C& c, Container<C>::const_iterator i, const Container<C>::value_type &v)
- { return c.insert(i, v); }
-}
+concept MemberRangeInsertionContainer<typename C, typename Iter> : MemberInsertionContainer<C> {
+ requires InputIterator<Iter>;
+ void C::insert(const_iterator position, Iter first, Iter last);
+}
\end{itemdecl}
\begin{itemdescr}
-\pnum
-\addedConcepts{\mbox{\reallynote} describes a container, in terms of member functions, that can be
- modified by inserting elements at any position within the sequence.}
+ \pnum \addedConcepts{\mbox{\reallynote} describes a container, in terms of member functions, that
+ can be modified by inserting a sequence of elements at any
+ position within the sequence.}
\end{itemdescr}
\rSec3[container.concepts.maps]{Container concept maps}
@@ -1131,52 +1156,6 @@
\end{itemdescr}
\begin{itemdecl}
-template <typename E, size_t N>
-concept_map Container<E[N]> {
- typedef E value_type;
- typedef E& reference;
- typedef const E& const_reference;
- typedef size_t size_type;
- typedef E* iterator;
- typedef const E* const_iterator;
-
- bool empty(const E(&c)[N]) { return N==0; }
- size_type size(const E(&c) [N]) { return N; }
-
- iterator begin(E(&c)[N]) { return &c[0]; }
- const_iterator begin(const E(&c)[N]) { return &c[0]; }
- iterator end(E(&c)[N]) { return &c[N]; }
- const_iterator end(const E(&c)[N]) { return &c[N]; }
-}
-\end{itemdecl}
-
-\begin{itemdecl}
-template <typename E, size_t N>
-concept_map Container<const E[N]> {
- typedef E value_type;
- typedef const E& reference;
- typedef const E& const_reference;
- typedef size_t size_type;
-
- typedef const E* iterator;
- typedef const E* const_iterator;
-
- bool empty(const E(&c)[N]) { return N==0; }
- size_type size(const E(&c) c) { return N; }
-
- const_iterator begin(const E(&c)[N]) { return &c[0]; }
- const_iterator end(const E(&c)[N]) { return &c[N]; }
-}
-\end{itemdecl}
-
-\begin{itemdescr}
-\pnum
-\addedConcepts{\mbox{\reallynote} Adapts built-in arrays to the
- \mbox{\tcode{Container}} concept.}
-\end{itemdescr}
-
-
-\begin{itemdecl}
template <MemberFrontInsertionContainer C>
concept_map FrontInsertionContainer<C> {
typedef Container<C>::reference reference;
@@ -1206,7 +1185,7 @@
reference back(C& c) { return c.back(); }
const_reference back(const C& c) { return c.back(); }
- void push_back(C& c, const Container<C>::value_type &v) { c.back(v); }
+ void push_back(C& c, const Container<C>::value_type &v) { c.push_back(v); }
void pop_back(C& c) { c.pop_back(); }
}
\end{itemdecl}
@@ -1218,6 +1197,81 @@
\\\addedConcepts{\mbox{\tcode{BackInsertionContainer}} concept.}
\end{itemdescr}
+\begin{itemdecl}
+template <MemberInsertionContainer C>
+concept_map InsertionContainer<C> {
+ Container<C>::iterator insert(C& c, Container<C>::const_iterator i, const Container<C>::value_type &v)
+ { return c.insert(i, v); }
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} Adapts an existing insertion container, which uses
+ member function syntax for each of its operations, to the}
+ \\\addedConcepts{\mbox{\tcode{InsertionContainer}} concept.}
+\end{itemdescr}
+
+\begin{itemdecl}
+template <MemberRangeInsertionContainer C, InputIterator Iter>
+concept_map RangeInsertionContainer<C, Iter> {
+ void insert(C& c, Container<C>::const_iterator i, Iter first, Iter last)
+ { c.insert(i, first, last); }
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} Adapts an existing range-insertion container, which uses
+ member function syntax for each of its operations, to the}
+ \\\addedConcepts{\mbox{\tcode{RangeInsertionContainer}} concept.}
+\end{itemdescr}
+
+\begin{itemdecl}
+template <typename E, size_t N>
+concept_map Container<E[N]> {
+ typedef E value_type;
+ typedef E& reference;
+ typedef const E& const_reference;
+ typedef size_t size_type;
+ typedef E* iterator;
+ typedef const E* const_iterator;
+
+ bool empty(const E(&c)[N]) { return N==0; }
+ size_type size(const E(&c) [N]) { return N; }
+
+ iterator begin(E(&c)[N]) { return c; }
+ const_iterator begin(const E(&c)[N]) { return c; }
+ iterator end(E(&c)[N]) { return c + N; }
+ const_iterator end(const E(&c)[N]) { return c + N; }
+}
+\end{itemdecl}
+
+\begin{itemdecl}
+template <typename E, size_t N>
+concept_map Container<const E[N]> {
+ typedef E value_type;
+ typedef const E& reference;
+ typedef const E& const_reference;
+ typedef size_t size_type;
+
+ typedef const E* iterator;
+ typedef const E* const_iterator;
+
+ bool empty(const E(&c)[N]) { return N==0; }
+ size_type size(const E(&c)[N]) { return N; }
+
+ const_iterator begin(const E(&c)[N]) { return c; }
+ const_iterator end(const E(&c)[N]) { return c + N; }
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} Adapts built-in arrays to the
+ \mbox{\tcode{Container}} concept.}
+\end{itemdescr}
+
\color{black}
\rSec1[sequences]{Sequences}
@@ -3436,16 +3490,16 @@
@\addedConcepts{requires MoveConstructible<Cont>}@ explicit queue(Cont@\removedConcepts{ainer}@&& = Cont@\removedConcepts{ainer}@());
@\addedConcepts{requires MoveConstructible<Cont>}@ queue(queue&& q) : c(std::move(q.c)) {}
template <class Alloc>
- @\addedConcepts{requires Constructible<Cont, Alloc>}@
+ @\addedConcepts{requires Constructible<Cont, const Alloc\&>}@
explicit queue(const Alloc&);
template <class Alloc>
- @\addedConcepts{requires Constructible<Cont, Cont, Alloc>}@
+ @\addedConcepts{requires Constructible<Cont, const Cont\&, const Alloc\&>}@
queue(const Cont@\removedConcepts{ainer}@&, const Alloc&);
template <class Alloc>
- @\addedConcepts{requires Constructible<Cont, Cont\&\&, Alloc>}@
+ @\addedConcepts{requires Constructible<Cont, Cont\&\&, const Alloc\&>}@
queue(Cont@\removedConcepts{ainer}@&&, const Alloc&);
template <class Alloc>
- @\addedConcepts{requires Constructible<Cont, Cont\&\&, Alloc\&\&>}@
+ @\addedConcepts{requires Constructible<Cont, Cont\&\&, const Alloc\&>}@
queue(queue&&, const Alloc&);
@\addedConcepts{requires MoveAssignable<Cont>}@ queue& operator=(queue&& q)
{ c = std::move(q.c); return *this; }
@@ -3642,20 +3696,20 @@
@\addedConcepts{requires MoveConstructible<Cont>}@
explicit priority_queue(const Compare& x = Compare(), Cont@\removedConcepts{ainer}@&& = Cont@\removedConcepts{ainer}@());
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
- @\addedConcepts{CopyConstructible<Cont> \&\& Constructible<Cont, Iter, Iter>}@
+ @\addedConcepts{requires CopyConstructible<Cont> \&\& RangeInsertionContainer<Cont, Iter>}@
priority_queue(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
const Compare& x, const Cont@\removedConcepts{ainer}@&);
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
- @\addedConcepts{MoveConstructible<Cont> \&\& Constructible<Cont, Iter, Iter>}@
+ @\addedConcepts{requires MoveConstructible<Cont> \&\& RangeInsertionContainer<Cont, Iter>}@
priority_queue(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
const Compare& x = Compare(), Cont@\removedConcepts{ainer}@&& = Cont@\removedConcepts{ainer}@());
@\addedConcepts{requires MoveConstructible<Cont>}@ priority_queue(priority_queue&&);
@\addedConcepts{requires MoveAssignable<Cont>}@ priority_queue& operator=(priority_queue&&);
template <class Alloc>
- @\addedConcepts{requires Constructible<Cont, Alloc>}@
+ @\addedConcepts{requires Constructible<Cont, const Alloc\&>}@
explicit priority_queue(const Alloc&);
template <class Alloc>
- @\addedConcepts{requires Constructible<Cont, Alloc>}@
+ @\addedConcepts{requires Constructible<Cont, const Alloc\&>}@
priority_queue(const Compare&, const Alloc&);
template <class Alloc>
@\addedConcepts{requires Constructible<Cont, Cont, Alloc>}@
@@ -3727,11 +3781,11 @@
\begin{itemdecl}
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
- @\addedConcepts{CopyConstructible<Cont> \&\& Constructible<Cont, Iter, Iter>}@
+ @\addedConcepts{requires CopyConstructible<Cont> \&\& RangeInsertionContainer<Cont, Iter>}@
priority_queue(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
const Compare& x, const Cont@\removedConcepts{ainer}@&);
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
- @\addedConcepts{MoveConstructible<Cont> \&\& Constructible<Cont, Iter, Iter>}@
+ @\addedConcepts{requires MoveConstructible<Cont> \&\& RangeInsertionContainer<Cont, Iter>}@
priority_queue(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last,
const Compare& x = Compare(), Cont@\removedConcepts{ainer}@&& = Cont@\removedConcepts{ainer}@());
\end{itemdecl}
@@ -3858,16 +3912,16 @@
@\addedConcepts{requires CopyConstructible<Cont>}@ explicit stack(const Cont@\removedConcepts{ainer}@&);
@\addedConcepts{requires MoveConstructible<Cont>}@ explicit stack(Cont@\removedConcepts{ainer}@&& = Cont@\removedConcepts{ainer}@());
template <class Alloc>
- @\addedConcepts{Constructible<Cont, Alloc>}@
+ @\addedConcepts{requires Constructible<Cont, const Alloc\&>}@
explicit stack(const Alloc&);
template <class Alloc>
- @\addedConcepts{Constructible<Cont, Cont, Alloc>}@
+ @\addedConcepts{requires Constructible<Cont, const Cont\&, const Alloc\&>}@
stack(const Cont@\removedConcepts{ainer}@&, const Alloc&);
template <class Alloc>
- @\addedConcepts{Constructible<Cont, Cont\&\&, Alloc>}@
+ @\addedConcepts{requires Constructible<Cont, Cont\&\&, const Alloc\&>}@
stack(Cont@\removedConcepts{ainer}@&&, const Alloc&);
template <class Alloc>
- @\addedConcepts{Constructible<Cont, Cont\&\&, Alloc>}@
+ @\addedConcepts{Constructible<Cont, Cont\&\&, const Alloc\&>}@
stack(stack&&, const Alloc&);
bool empty() const { return @\removedConcepts{c.}@empty(@\addedConcepts{c}@); }
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