$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r48880 - sandbox/committee/concepts/stdlib
From: mmarcus_at_[hidden]
Date: 2008-09-19 04:42:35
Author: mmarcus
Date: 2008-09-19 04:42:34 EDT (Fri, 19 Sep 2008)
New Revision: 48880
URL: http://svn.boost.org/trac/boost/changeset/48880
Log:
Emplace and other Container changes
Text files modified: 
   sandbox/committee/concepts/stdlib/clib-containers.tex |   400 ++++++++++++++++++++++++++++++++------- 
   1 files changed, 321 insertions(+), 79 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-09-19 04:42:34 EDT (Fri, 19 Sep 2008)
@@ -118,6 +118,11 @@
     operations in \tcode{stack}, \tcode{queue}, and
     \tcode{priority_queue} with \tcode{HasEmplaceBack}.}
 \item{Removed all qualification by \tcode{std::}}
+\item{Backed out Emplace changes above. Added axioms to Emplacement concepts. Added \tcode{HasPushFront}, \tcode{HasPushBack},
+\tcode{HasInsert}. Added concept maps to model insertion by emplacement.}
+\item{Renamed \tcode{RandomAccessAllocator} to \tcode{Allocator}}
+\item{Added \tcode{cbegin} and \tcode{cend} operations and default implementations to
+    \tcode{Container}-related concepts}
 \end{itemize}
 
 \end{titlepage}
@@ -927,9 +932,12 @@
   concept QueueLikeContainer<typename C> @\textit{see below}@
   concept InsertionContainer<typename C> @\textit{see below}@
   concept RangeInsertionContainer<typename C, typename Iter> @\textit{see below}@
-  concept HasEmplaceBack<typename C, typename... Args> @\textit{see below}@
-  concept HasEmplaceFront<typename C, typename... Args> @\textit{see below}@
-  concept HasEmplace<typename C, typename... Args> @\textit{see below}@
+  concept FrontEmplacementContainer<typename C, typename... Args> @\textit{see below}@
+  concept BackEmplacementContainer<typename C, typename... Args> @\textit{see below}@
+  concept EmplacementContainer<typename C, typename... Args> @\textit{see below}@
+  concept HasPushFront<Container C> @\textit{see below}@
+  concept HasPushBack<Container C> @\textit{see below}@
+  concept HasInsert<Container C> @\textit{see below}@
 
   // \ref{container.concepts.member}, member container concepts
   auto concept MemberContainer<typename C> @\textit{see below}@
@@ -939,9 +947,12 @@
   auto concept MemberQueueLikeContainer<typename C> @\textit{see below}@
   auto concept MemberInsertionContainer<typename C> @\textit{see below}@
   auto concept MemberRangeInsertionContainer<typename C, typename Iter> @\textit{see below}@
-  auto concept MemberHasEmplaceBack<typename C, typename... Args> @\textit{see below}@
-  auto concept MemberHasEmplaceFront<typename C, typename... Args> @\textit{see below}@
-  auto concept MemberHasEmplace<typename C, typename... Args> @\textit{see below}@
+  auto concept MemberFrontEmplacementContainer<typename C, typename... Args> @\textit{see below}@
+  auto concept MemberBackEmplacementContainer<typename C, typename... Args> @\textit{see below}@
+  auto concept MemberEmplacementContainer<typename C, typename... Args> @\textit{see below}@
+  auto concept MemberHasPushFront<MemberContainer C> @\textit{see below}@
+  auto concept MemberHasPushBack<MemberContainer C> @\textit{see below}@
+  auto concept MemberHasInsert<MemberContainer C> @\textit{see below}@
 
   // \mbox{\ref{container.concepts.maps}}, container concept maps
   template <MemberContainer C>              concept_map Container<C> @\textit{see below}@
@@ -952,12 +963,18 @@
   template <MemberInsertionContainer C>      concept_map InsertionContainer<C> @\textit{see below}@
   template <MemberRangeInsertionContainer C, InputIterator Iter>
     concept_map RangeInsertionContainer<C, Iter> @\textit{see below}@
-  template <MemberHasEmplaceFront C, typename... Args> 
-    concept_map HasEmplaceFront<C, Args...> @\textit{see below}@
-  template <MemberHasEmplaceBack C, typename... Args>  
-    concept_map HasEmplaceBack<C, Args...> @\textit{see below}@
-  template <MemberHasEmplace C, typename... Args>
-    concept_map HasEmplace<C, Args...> @\textit{see below}@
+  template <MemberFrontEmplacementContainer C, typename... Args> 
+    concept_map FrontEmplacementContainer<C, Args...> @\textit{see below}@
+  template <MemberBackEmplacementContainer C, typename... Args>  
+    concept_map BackEmplacementContainer<C, Args...> @\textit{see below}@
+  template <MemberEmplacementContainer C, typename... Args>
+    concept_map EmplacementContainer<C, Args...> @\textit{see below}@
+  template <MemberHasPushFront C> 
+    concept_map HasPushFront<C> @\textit{see below}@
+  template <MemberHasPushBack C>  
+    concept_map HasPushBack<C> @\textit{see below}@
+  template <MemberHasInsert C>
+    concept_map HasInsert<C> @\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}@
 }
@@ -1002,6 +1019,8 @@
   const_iterator  begin(const C&);
   iterator        end(C&);
   const_iterator  end(const C&);
+  const_iterator  cbegin(const C& c) { return begin(c); }
+  const_iterator  cend(const C& c)   { return end(c); }
   reference       front(C& c) { return *begin(c); } 
   const_reference front(const C& c) { return *begin(c); }
 
@@ -1031,7 +1050,7 @@
 
 \begin{itemdecl}
 concept FrontInsertionContainer<typename C> : Container<C> {
-  void push_front(C&, const value_type&);
+  void push_front(C&, value_type&&);
 
   axiom FrontInsertion(C c, value_type x) {
     x == (push_front(c, x), front(c));
@@ -1052,7 +1071,7 @@
   reference       back(C&);
   const_reference back(const C&);
 
-  void push_back(C&, const value_type&);
+  void push_back(C&, value_type&&);
 
   requires BidirectionalIterator<iterator> axiom AccessBack(C c) {
     if (begin(c) != end(c)) back(c) == *(--end(c));
@@ -1108,7 +1127,11 @@
 
 \begin{itemdecl}
 concept InsertionContainer<typename C> : Container<C> {
-  iterator insert(C&, const_iterator, const value_type&);
+  iterator insert(C&, const_iterator, value_type&&);
+
+  axiom Insertion(C c, const_iterator position, value_type v) {
+    v == *insert(c, position, v);
+  }
 }
 \end{itemdecl}
 
@@ -1132,36 +1155,97 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-concept HasEmplaceFront< C, typename... Args> {
-  void emplace_front(C& c, Args... args);
+concept FrontEmplacementContainer<typename C, typename... Args> : Container<C> {
+  void emplace_front(C& c, Args&&... args);
+
+  axiom FrontEmplacement(C c, Args... args) {
+    value_type(args...) == (emplace_front(c, args...), front(c));
+  }
+
+  requires HasPushFront<C> axiom FrontEmplacementPushEquivalence(C c, Args... args) {
+    (emplace_front(c, args...), front(c)) == (push_front(c, value_type(args...)), front(c));
+  }
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} describes a container that can be
+  modified by constructing elements at the front of the sequence.} 
+\end{itemdescr}
+
+\begin{itemdecl}
+concept BackEmplacementContainer<typename C, typename... Args> : Container<C> {
+  void emplace_back(C& c, Args&&... args);
+
+  axiom BackEmplacement(C c, Args... args) {
+    value_type(args...) == (emplace_back(c, args...), back(c));
+  }
+
+  requires HasPushBack<C> axiom BackEmplacementPushEquivalence(C c, Args... args) {
+    (emplace_back(c, args...), back(c)) == (push_back(c, value_type(args...)), back(c));
+  }
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} describes a container that can be
+  modified by constructing elements at the back of the sequence.} 
+\end{itemdescr}
+
+\begin{itemdecl}
+concept EmplacementContainer<typename C, typename... Args> : Container<C> {
+  iterator emplace(C& c, const_iterator position, Args&&... args);
+
+  axiom Emplacement(C c, const_iterator position, Args... args) {
+    value_type(args...) == *emplace(c, position, args...);
+  }
+
+  requires HasInsert<C> axiom EmplacementPushEquivalence(C c, const_iterator position, Args... args) {
+    *emplace(c, position, args...) == *insert(c, position, value_type(args...));
+  }
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} describes a container that can be
+  modified by constructing elements at any position within 
+  the sequence.}
+\end{itemdescr}
+
+\begin{itemdecl}
+concept HasPushFront<Container C> {
+  void push_front(C&, value_type&&);
 }
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
-\addedConcepts{\mbox{\reallynote} describes types with an emplace_front operation } 
+\addedConcepts{\mbox{\reallynote} describes types with a push_front operation } 
 \end{itemdescr}
 
 \begin{itemdecl}
-concept HasEmplaceBack<typename C, typename... Args> {
-  void emplace_back(C& c, Args... args);
+concept HasPushBack<Container C> {
+  void push_back(C&, value_type&&);
 }
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
-\addedConcepts{\mbox{\reallynote} describes types with an emplace_back operation } 
+\addedConcepts{\mbox{\reallynote} describes types with a push_back operation } 
 \end{itemdescr}
 
 \begin{itemdecl}
-concept HasEmplace<typename C, typename... Args> {
-  void emplace(C& c, const_iterator position, Args... args);
+concept HasInsert<Container C> {
+  iterator insert(C&, const_iterator, value_type&&);
 }
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
-\addedConcepts{\mbox{\reallynote} describes types with an emplace operation } 
+\addedConcepts{\mbox{\reallynote} describes types with an insert operation } 
 \end{itemdescr}
 
 \rSec3[container.concepts.member]{Member container concepts} 
@@ -1187,7 +1271,7 @@
 
   requires Convertible<reference, const_reference>
         && Convertible<reference, const value_type&>
-        && Convertible<const_reference, const _value_type&>;
+        && Convertible<const_reference, const value_type&>;
         && Convertible<iterator, const_iterator>
         && SameType<ForwardIterator<iterator>::value_type, value_type> 
         && SameType<ForwardIterator<const_iterator>::value_type, value_type>
@@ -1205,8 +1289,10 @@
   const_iterator  C::begin() const;
   iterator        C::end();
   const_iterator  C::end() const;
-  reference       C::front() { return *this->begin(); }
-  const_reference C::front() const { return *this->begin(); }
+  const_iterator  C::cbegin() const { return this->begin(); }
+  const_iterator  C::cend() const   { return this->end(); }
+  reference       C::front()        { return *this->begin(); }
+  const_reference C::front() const  { return *this->begin(); }
 
   axiom MemberAccessFront(C c) {
     if (c.begin() != c.end()) c.front() == *c.begin();
@@ -1232,7 +1318,7 @@
 
 \begin{itemdecl}
 auto concept MemberFrontInsertionContainer<typename C> : MemberContainer<C> {
-  void C::push_front(const value_type&);
+  void C::push_front(value_type&&);
 
   axiom MemberFrontInsertion(C c, value_type x) {
     x == (c.push_front(x), c.front());
@@ -1253,7 +1339,7 @@
   reference       C::back();
   const_reference C::back() const;
 
-  void C::push_back(const value_type&);
+  void C::push_back(value_type&&);
 
   requires BidirectionalIterator<iterator> axiom MemberAccessBack(C c) {
     if (c.begin() != c.end()) c.back() == *(--c.end());
@@ -1308,7 +1394,11 @@
 
 \begin{itemdecl}
 auto concept MemberInsertionContainer<typename C> : MemberContainer<C> {
-  iterator C::insert(const_iterator, const value_type&);
+  iterator C::insert(const_iterator, value_type&&);
+
+  axiom MemberInsertion(C c, const_iterator position, value_type v) {
+    v == *c.insert(position, v);
+  }
 }
 \end{itemdecl}
 
@@ -1319,7 +1409,7 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-concept MemberRangeInsertionContainer<typename C, typename Iter> : MemberInsertionContainer<C> {
+auto concept MemberRangeInsertionContainer<typename C, typename Iter> : MemberInsertionContainer<C> {
   requires InputIterator<Iter>;
   void C::insert(const_iterator position, Iter first, Iter last);
 }
@@ -1332,39 +1422,100 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-auto concept MemberHasEmplaceFront<typename C, typename... Args> {
-  void C::emplace_front(Args... args);
+auto concept MemberFrontEmplacementContainer<typename C, typename... Args> : MemberContainer<C> {
+  void C::emplace_front(Args&&... args);
+
+  axiom MemberFrontEmplacement(C c, Args... args) {
+    value_type(args...) == (c.emplace_front(args...), front(c));
+  }
+
+  requires HasPushFront<C> axiom MemberFrontEmplacementPushEquivalence(C c, Args... args) {
+    (c.emplace_front(args...), c.front()) == (c.push_front(value_type(args...)), c.front());
+  }
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} describes a container, in terms of member functions, that can be
+  modified by placing a newly-constructed object at the front of the sequence.} 
+\end{itemdescr}
+
+\begin{itemdecl}
+auto concept MemberBackEmplacementContainer<typename C, typename... Args> : MemberBackInsertionContainer<C> {
+  void C::emplace_back(Args&&... args);
+
+  axiom MemberBackEmplacement(C c, Args... args) {
+    value_type(args...) == (c.emplace_back(args...), back(c));
+  }
+
+  requires HasPushBack<C> axiom MemberBackEmplacementPushEquivalence(C c, Args... args) {
+    (c.emplace_back(args...), c.back()) == (c.push_back(value_type(args...)), c.back());
+  }
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} describes a container, in terms of member functions, that can be
+  modified by constructing elements at the back of the sequence.} 
+\end{itemdescr}
+
+\begin{itemdecl}
+auto concept MemberEmplacementContainer<typename C, typename... Args> : MemberInsertionContainer<C> {
+  void C::emplace(const_iterator position, Args&&... args);
+
+  axiom MemberEmplacement(C c, const_iterator position, Args... args) {
+    value_type(args...) == *c.emplace(position, args...);
+  }
+
+  requires HasInsert<C> axiom MemberEmplacementPushEquivalence(C c, const_iterator position, Args... args) {
+    *c.emplace(position, args...) == *c.insert(position, value_type(args...));
+  }
+}
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum
+\addedConcepts{\mbox{\reallynote} describes a container, in terms of member functions, that can be
+  modified by constructing elements at any position within 
+  the sequence.}
+\end{itemdescr}
+
+\begin{itemdecl}
+auto concept MemberHasPushFront<MemberContainer C> {
+  void C::push_front(value_type&&);
 }
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
 \addedConcepts{\mbox{\reallynote} describes a type that has a member
-  function named emplace_front } 
+  function named push_front } 
 \end{itemdescr}
 
 \begin{itemdecl}
-auto concept MemberHasEmplaceBack<typename C, typename... Args> {
-  void C::emplace_back(Args... args);
+auto concept MemberHasPushBack<MemberContainer C> {
+  void C::push_back(value_type&&);
 }
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
 \addedConcepts{\mbox{\reallynote} describes a type that has a member
-  function named emplace_back } 
+  function named push_back } 
 \end{itemdescr}
 
 \begin{itemdecl}
-auto concept MemberHasEmplace<typename C, typename... Args> {
-  void C::emplace(const_iterator position, Args... args);
+auto concept MemberHasInsert<MemberContainer C> {
+  void C::insert(const_iterator, value_type&&);
 }
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum
 \addedConcepts{\mbox{\reallynote} describes a type that has a member
-  function named emplace } 
+  function named insert } 
 \end{itemdescr}
 
 \rSec3[container.concepts.maps]{Container concept maps}
@@ -1375,7 +1526,8 @@
   (\mbox{\ref{container.concepts.member}}), to meet the free function
   container concept syntax in (\mbox{\ref{container.concepts.free}}). It
   also contains maps adapting built-in arrays to model the appropriate
-  container concepts. }
+  container concepts, and maps adapting emplacement container concepts to
+  to model insertion container concepts. }
 
 
 \begin{itemdecl}
@@ -1411,7 +1563,7 @@
 \begin{itemdecl}
 template <MemberFrontInsertionContainer C> 
 concept_map FrontInsertionContainer<C> {
-  void push_front(C& c, const Container<C>::value_type &v)   { c.push_front(v); }
+  void push_front(C& c, Container<C>::value_type&& v)   { c.push_front(v); }
 }			
 \end{itemdecl}
 
@@ -1431,7 +1583,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.push_back(v); }
+  void push_back(C& c, Container<C>::value_type&& v)    { c.push_back(v); }
 }			
 \end{itemdecl}
 
@@ -1473,7 +1625,7 @@
 \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)    
+  Container<C>::iterator insert(C& c, Container<C>::const_iterator i, Container<C>::value_type&& v)    
   { return c.insert(i, v); }
 }			
 \end{itemdecl}
@@ -1501,48 +1653,138 @@
 \end{itemdescr}
 
 \begin{itemdecl}
-template <MemberHasEmplaceFront C, typename... Args> 
-  concept_map HasEmplaceFront<C, Args...> {
-    void emplace_front(C& c, Args... args) 
+template <MemberFrontEmplacementContainer C, typename... Args> 
+  concept_map FrontEmplacementContainer<C, Args...> {
+    void emplace_front(C& c, Args&&... args) 
     { c.emplace_front(forward<Args>(args)...); }
   }
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum 
-\addedConcepts{\mbox{\reallynote} Adapts an existing type with an
-  \mbox{\tcode{emplace_front}} member function to model the}
-  \addedConcepts{\mbox{\tcode{HasEmplaceFront}} concept.}
+\addedConcepts{\mbox{\reallynote} Adapts an existing front-emplace container, which uses
+  member function syntax for each of its operations, to the}
+  \addedConcepts{\mbox{\tcode{FrontEmplacementContainer}} concept.}
 \end{itemdescr}
 
 \begin{itemdecl}
-template <MemberHasEmplaceBack C, typename... Args> 
-  concept_map HasEmplaceBack<C, Args...> {
-    void emplace_back(C& c, Args... args) 
+template <FrontEmplacementContainer C>
+  requires !HasPushFront<C>
+  concept_map FrontInsertionContainer<C> {
+    void push_front(C& c, Container<C>::value_type&& v)
+    { emplace_front(c, forward<Container<C>::value_type>(v)); }
+  }
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum 
+\addedConcepts{\mbox{\reallynote} Adapts a front-emplacement container that does not have a push_front to the}
+  \addedConcepts{\mbox{\tcode{FrontInsertionContainer}} concept.}
+\end{itemdescr}
+
+\begin{itemdecl}
+template <MemberBackEmplacementContainer C, typename... Args> 
+  concept_map BackEmplacementContainer<C, Args...> {
+    void emplace_back(C& c, Args&&... args) 
     { c.emplace_back(forward<Args>(args)...); }
   }
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum 
+\addedConcepts{\mbox{\reallynote} Adapts an existing back-emplace container, which uses
+  member function syntax for each of its operations, to the}
+  \addedConcepts{\mbox{\tcode{BackEmplacementContainer}} concept.}
+\end{itemdescr}
+
+\begin{itemdecl}
+template <BackEmplacementContainer C>
+  requires !HasPushBack<C>
+  concept_map BackInsertionContainer<C> {
+    void push_back(C& c, Container<C>::value_type&& v)
+    { emplace_back(c, forward<Container<C>::value_type>(v)); }
+  }
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum 
+\addedConcepts{\mbox{\reallynote} Adapts a back-emplacement container that does not have a push_back to the}
+  \addedConcepts{\mbox{\tcode{BackInsertionContainer}} concept.}
+\end{itemdescr}
+
+\begin{itemdecl}
+template <MemberEmplacementContainer C, typename... Args> 
+  concept_map EmplacementContainer<C, Args...> {
+    Container<C>::iterator emplace(C& c, Container<C>::const_iterator position, Args&&... args) 
+    { return c.emplace(position, forward<Args>(args)...); }
+  }
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum 
+\addedConcepts{\mbox{\reallynote} Adapts an existing emplace container, which uses
+  member function syntax for each of its operations, to the}
+  \\\addedConcepts{\mbox{\tcode{EmplacementContainer}} concept.}
+\end{itemdescr}
+
+\begin{itemdecl}
+template <EmplacementContainer C>
+  requires !HasInsert<C>
+  concept_map InsertionContainer<C> {
+    Container<C>::iterator insert(C& c, Container<C>::const_iterator position, Container<C>::value_type&& v)
+    { return emplace(c, position, forward<Container<C>::value_type>(v)); }
+  }
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum 
+\addedConcepts{\mbox{\reallynote} Adapts a emplacement container that does not have an insert to the}
+  \addedConcepts{\mbox{\tcode{InsertionContainer}} concept.}
+\end{itemdescr}
+
+\begin{itemdecl}
+template <MemberHasPushFront C> 
+  concept_map HasPushFront<C> {
+    void push_front(C& c, Container<C>::value_type&& v)
+    { c.push_front(v); }
+  }
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum 
+\addedConcepts{\mbox{\reallynote} Adapts an existing type with a
+  \mbox{\tcode{push_front}} member function to model the}
+  \addedConcepts{\mbox{\tcode{HasPushFront}} concept.}
+\end{itemdescr}
+
+\begin{itemdecl}
+template <MemberHasPushBack C> 
+  concept_map HasPushBack<C> {
+    void push_back(C& c, Container<C>::value_type&& v)
+    { c.push_back(v); }
+  }
+\end{itemdecl}
+
+\begin{itemdescr}
+\pnum 
 \addedConcepts{\mbox{\reallynote} Adapts an existing type with an
-  \mbox{\tcode{emplace_back}} member function to model the}
-  \addedConcepts{\mbox{\tcode{HasEmplaceBack}} concept.}
+  \mbox{\tcode{push_back}} member function to model the}
+  \addedConcepts{\mbox{\tcode{HasPushBack}} concept.}
 \end{itemdescr}
 
 \begin{itemdecl}
-template <MemberHasEmplace C, typename... Args> 
-  concept_map HasEmplace<C, Args...> {
-    void emplace(C& c, Container<C>::const_iterator position, Args... args) 
-    { c.emplace(position, forward<Args>(args)...); }
+template <MemberHasInsert C> 
+  concept_map HasInsert<C> {
+    Container<C>::iterator insert(C& c, Container<C>::const_iterator position, Container<C>::value_type&& v) 
+    { return c.insert(position, v); }
   }
 \end{itemdecl}
 
 \begin{itemdescr}
 \pnum 
 \addedConcepts{\mbox{\reallynote} Adapts an existing type with an
-  \mbox{\tcode{emplace}} member function to model the}
-  \addedConcepts{\mbox{\tcode{HasEmplace}} concept.}
+  \mbox{\tcode{insert}} member function to model the}
+  \addedConcepts{\mbox{\tcode{HasInsert}} concept.}
 \end{itemdescr}
 
 
@@ -1642,7 +1884,7 @@
 
 \begin{codeblock}
 namespace std {
-  template <@\changedConcepts{class}{ValueType}@ T, @\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> > 
+  template <@\changedConcepts{class}{ValueType}@ T, @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> > 
     @\addedConcepts{requires NothrowDestructible<T>}@
     class deque;
   template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
@@ -1799,7 +2041,7 @@
 
 \begin{codeblock}
 namespace std {
-  template <@\changedConcepts{class}{ValueType}@ T, @\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> > 
+  template <@\changedConcepts{class}{ValueType}@ T, @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> > 
     @\addedConcepts{requires MoveConstructible<T>}@
     class vector;
   template <@\changedConcepts{class}{EqualityComparable}@ T, class Alloc@\removedConcepts{ator}@>
@@ -1821,7 +2063,7 @@
   template <@\changedConcepts{class}{ValueType}@ T, class Alloc@\removedConcepts{ator}@>
     void swap(vector<T,Alloc@\removedConcepts{ator}@>& x, vector<T,Alloc@\removedConcepts{ator}@>&& y);
 
-  template <@\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@> class vector<bool,Alloc@\removedConcepts{ator}@>;
+  template <@\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@> class vector<bool,Alloc@\removedConcepts{ator}@>;
 \end{codeblock}
 
 \rSec2[array]{\marktr{}Class template \tcode{array}}
@@ -2086,7 +2328,7 @@
 
 \begin{codeblock}
 namespace std {
-  template <@\changedConcepts{class}{ValueType}@ T, @\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
+  template <@\changedConcepts{class}{ValueType}@ T, @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
   @\addedConcepts{requires NothrowDestructible<T>}@
   class deque {
   public:
@@ -3903,7 +4145,7 @@
     void push(const value_type& x)      { @\removedConcepts{c.}@push_back(@\addedConcepts{c, }@x); }
     void push(value_type&& x)           { @\removedConcepts{c.}@push_back(@\addedConcepts{c, }@move(x)); }
     template <class... Args> 
-      @\addedConcepts{requires HasEmplaceBack<Cont, Args\&\&...>}@
+      @\addedConcepts{requires BackEmplacementContainer<Cont, Args\&\&...>}@
       void emplace(Args&&... args)
       { @\removedConcepts{c.}@emplace_back(@\addedConcepts{c, }@forward<Args>(args)...); }
     void pop()                          { @\removedConcepts{c.}@pop_front(@\addedConcepts{c}@); }    
@@ -4120,7 +4362,7 @@
     void push(const value_type& x);
     void push(value_type&& x);
     template <class... Args> 
-      @\addedConcepts{requires HasEmplaceBack<Cont, Args\&\&...>}@
+      @\addedConcepts{requires BackEmplacementContainer<Cont, Args\&\&...>}@
       void emplace(Args&&... args);
     void pop();
     @\addedConcepts{requires Swappable<Cont>}@
@@ -4237,7 +4479,7 @@
 \index{emplace@\tcode{emplace}!\tcode{priority_queue}}%
 \begin{itemdecl}
 template <class... Args> 
-  @\addedConcepts{requires HasEmplaceBack<Cont, Args\&\&...>}@
+  @\addedConcepts{requires BackEmplacementContainer<Cont, Args\&\&...>}@
   void emplace(Args&&... args);
 \end{itemdecl}
 \begin{itemdescr}
@@ -4341,7 +4583,7 @@
     void push(const value_type& x)      { @\removedConcepts{c.}@push_back(@\addedConcepts{c, }@x); }
     void push(value_type&& x)           { @\removedConcepts{c.}@push_back(@\addedConcepts{c, }@move(x)); }
     template <class... Args> 
-      @\addedConcepts{requires HasEmplaceBack<Cont, Args\&\&...>}@
+      @\addedConcepts{requires BackEmplacementContainer<Cont, Args\&\&...>}@
       void emplace(Args&&... args)
       { @\removedConcepts{c.}@emplace_back(@\addedConcepts{c, }@forward<Args>(args)...); }
     void pop()                          { @\removedConcepts{c.}@pop_back(@\addedConcepts{c}@); }
@@ -4508,7 +4750,7 @@
 
 \begin{codeblock}
 namespace std {
-  template <@\changedConcepts{class}{ValueType}@ T, @\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
+  template <@\changedConcepts{class}{ValueType}@ T, @\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@ = allocator<T> >
   @\addedConcepts{requires MoveConstructible<T>}@
   class vector {
   public:
@@ -5039,7 +5281,7 @@
 
 \begin{codeblock}
 namespace std {
-  template <@\changedConcepts{class}{RandomAccessAllocator}@ Alloc@\removedConcepts{ator}@> class vector<bool, Alloc@\removedConcepts{ator}@> {
+  template <@\changedConcepts{class}{Allocator}@ Alloc@\removedConcepts{ator}@> class vector<bool, Alloc@\removedConcepts{ator}@> {
   public:
     // types:
     typedef bool                                  const_reference;
@@ -6738,7 +6980,7 @@
             @\changedConcepts{class}{ValueType}@ T,
             @\changedConcepts{class}{Callable<auto, const Key\&>}@ Hash = hash<Key>,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = equal_to<Key>,
-            @\changedConcepts{class}{RandomAccessAllocator}@ Alloc = allocator<pair<const Key, T> > >
+            @\changedConcepts{class}{Allocator}@ Alloc = allocator<pair<const Key, T> > >
     @\addedConcepts{requires NothrowDestructible<Key> \&\& NothrowDestructible<T>}@
           @\addedConcepts{\&\& SameType<Hash::result_type, size_t>}@
           @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
@@ -6753,7 +6995,7 @@
             @\changedConcepts{class}{ValueType}@ T,
             @\changedConcepts{class}{Callable<auto, const Key\&>}@ Hash = hash<Key>,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = equal_to<Key>,
-            @\changedConcepts{class}{RandomAccessAllocator}@ Alloc = allocator<pair<const Key, T> > >
+            @\changedConcepts{class}{Allocator}@ Alloc = allocator<pair<const Key, T> > >
     @\addedConcepts{requires NothrowDestructible<Key> \&\& NothrowDestructible<T>}@
           @\addedConcepts{\&\& SameType<Hash::result_type, size_t>}@
           @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
@@ -6795,7 +7037,7 @@
   template <@\changedConcepts{class}{ValueType}@ Value,
             @\changedConcepts{class}{Callable<auto, const Value\&>}@ Hash = hash<Value>,
             @\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = equal_to<Value>,
-            @\changedConcepts{class}{RandomAccessAllocator}@ Alloc = allocator<Value> >
+            @\changedConcepts{class}{Allocator}@ Alloc = allocator<Value> >
     @\addedConcepts{requires NothrowDestructible<Value>}@
           @\addedConcepts{\&\& SameType<Hash::result_type, size_t>}@
           @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
@@ -6809,7 +7051,7 @@
   template <@\changedConcepts{class}{ValueType}@ Value,
             @\changedConcepts{class}{Callable<auto, const Value\&>}@ Hash = hash<Value>,
             @\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = equal_to<Value>,
-            @\changedConcepts{class}{RandomAccessAllocator}@ Alloc = allocator<Value> >
+            @\changedConcepts{class}{Allocator}@ Alloc = allocator<Value> >
     @\addedConcepts{requires NothrowDestructible<Value>}@
           @\addedConcepts{\&\& SameType<Hash::result_type, size_t>}@
           @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
@@ -6868,7 +7110,7 @@
             @\changedConcepts{class}{ValueType}@ T,
             @\changedConcepts{class}{Callable<auto, const Key\&>}@ Hash = hash<Key>,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = equal_to<Key>,
-            @\changedConcepts{class}{RandomAccessAllocator}@ Alloc = allocator<pair<const Key, T> > >
+            @\changedConcepts{class}{Allocator}@ Alloc = allocator<pair<const Key, T> > >
   @\addedConcepts{requires NothrowDestructible<Key> \&\& NothrowDestructible<T>}@
         @\addedConcepts{\&\& SameType<Hash::result_type, size_t>}@
         @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
@@ -7169,7 +7411,7 @@
             @\changedConcepts{class}{ValueType}@ T,
             @\changedConcepts{class}{Callable<auto, const Key\&>}@ Hash = hash<Key>,
             @\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = equal_to<Key>,
-            @\changedConcepts{class}{RandomAccessAllocator}@ Alloc = allocator<pair<const Key, T> > >
+            @\changedConcepts{class}{Allocator}@ Alloc = allocator<pair<const Key, T> > >
   @\addedConcepts{requires NothrowDestructible<Key> \&\& NothrowDestructible<T>}@
         @\addedConcepts{\&\& SameType<Hash::result_type, size_t>}@
         @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
@@ -7419,7 +7661,7 @@
   template <@\changedConcepts{class}{ValueType}@ Value,
             @\changedConcepts{class}{Callable<auto, const Value\&>}@ Hash = hash<Value>,
             @\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = equal_to<Value>,
-            @\changedConcepts{class}{RandomAccessAllocator}@ Alloc = allocator<Value> >
+            @\changedConcepts{class}{Allocator}@ Alloc = allocator<Value> >
   @\addedConcepts{requires NothrowDestructible<Value>}@
         @\addedConcepts{\&\& SameType<Hash::result_type, size_t>}@
         @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
@@ -7665,7 +7907,7 @@
   template <@\changedConcepts{class}{ValueType}@ Value,
             @\changedConcepts{class}{Callable<auto, const Value\&>}@ Hash = hash<Value>,
             @\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = equal_to<Value>,
-            @\changedConcepts{class}{RandomAccessAllocator}@ Alloc = allocator<Value> >
+            @\changedConcepts{class}{Allocator}@ Alloc = allocator<Value> >
   @\addedConcepts{requires NothrowDestructible<Value>}@
         @\addedConcepts{\&\& SameType<Hash::result_type, size_t>}@
         @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@