|
Boost-Commit : |
From: dgregor_at_[hidden]
Date: 2008-08-21 13:02:24
Author: dgregor
Date: 2008-08-21 13:02:23 EDT (Thu, 21 Aug 2008)
New Revision: 48283
URL: http://svn.boost.org/trac/boost/changeset/48283
Log:
Fix LWG issue 676 in the containers chapter
Text files modified:
sandbox/committee/concepts/stdlib/clib-containers.tex | 240 ++++++++++++++++++++++++++++++---------
1 files changed, 185 insertions(+), 55 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-21 13:02:23 EDT (Thu, 21 Aug 2008)
@@ -142,6 +142,14 @@
resolved as NAD following the application of this proposal to the
wording paper:
\begin{description}
+\item[Issue 676. Moving the unordered containers.] Applied a
+ conceptualized version of the proposed wording. This issue was voted
+ into the Working Paper in Bellevue, but is not in the Working Paper
+ due to some editorial problems with the proposed wording, including
+ some errors in the ``hint'' versions of the \tcode{insert}
+ operations and the verbosity of the specification. These errors have
+ been corrected in this document.
+
\item[Issue 704. MoveAssignable requirement for container value type
overly strict.] The concepts proposal for the containers specifies
precisely which routines require \tcode{MoveAssignable} value types.
@@ -6609,11 +6617,11 @@
@\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = std::equal_to<Key>,
@\changedConcepts{class}{RandomAccessAllocator}@ Alloc = std::allocator<std::pair<const Key, T> > >
@\addedConcepts{requires SameType<Hash::result_type, size_t>}@
- @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
+ @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
class unordered_map;
// \ref{unord.multimap}, class template unordered_multimap:
@@ -6623,20 +6631,32 @@
@\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = std::equal_to<Key>,
@\changedConcepts{class}{RandomAccessAllocator}@ Alloc = std::allocator<std::pair<const Key, T> > >
@\addedConcepts{requires SameType<Hash::result_type, size_t>}@
- @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
+ @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
class unordered_multimap;
template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Hash, class Pred, class Alloc>
void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
unordered_map<Key, T, Hash, Pred, Alloc>& y);
+ @\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_map<Key, T, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_map<Key, T, Hash, Pred, Alloc>\&\& y);}@
+ @\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_map<Key, T, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_map<Key, T, Hash, Pred, Alloc>\& y);}@
template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Hash, class Pred, class Alloc>
void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
+ @\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_multimap<Key, T, Hash, Pred, Alloc>\&\& y);}@
+ @\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_multimap<Key, T, Hash, Pred, Alloc>\& y);}@
} // namespace std
\end{codeblock}
@@ -6652,11 +6672,11 @@
@\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = std::equal_to<Value>,
@\changedConcepts{class}{RandomAccessAllocator}@ Alloc = std::allocator<Value> >
@\addedConcepts{requires SameType<Hash::result_type, size_t>}@
- @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
+ @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
class unordered_set;
// \ref{unord.multiset}, class template unordered_multiset:
@@ -6665,20 +6685,32 @@
@\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = std::equal_to<Value>,
@\changedConcepts{class}{RandomAccessAllocator}@ Alloc = std::allocator<Value> >
@\addedConcepts{requires SameType<Hash::result_type, size_t>}@
- @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
+ @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
class unordered_multiset;
template <@\changedConcepts{class}{ObjectType}@ Value, class Hash, class Pred, class Alloc>
void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
unordered_set<Value, Hash, Pred, Alloc>& y);
+ @\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_set<Value, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_set<Value, Hash, Pred, Alloc>\&\& y);}@
+ @\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_set<Value, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_set<Value, Hash, Pred, Alloc>\& y);}@
template <@\changedConcepts{class}{ObjectType}@ Value, class Hash, class Pred, class Alloc>
void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
unordered_multiset<Value, Hash, Pred, Alloc>& y);
+ @\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multiset<Value, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_multiset<Value, Hash, Pred, Alloc>\&\& y);}@
+ @\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multiset<Value, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_multiset<Value, Hash, Pred, Alloc>\& y);}@
} // namespace std
\end{codeblock}
@@ -6711,11 +6743,11 @@
@\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = std::equal_to<Key>,
@\changedConcepts{class}{RandomAccessAllocator}@ Alloc = std::allocator<std::pair<const Key, T> > >
@\addedConcepts{requires SameType<Hash::result_type, size_t>}@
- @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
+ @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
class unordered_map
{
public:
@@ -6753,6 +6785,8 @@
const allocator_type& a = allocator_type());
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
unordered_map(const unordered_map&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@
+ @\addedConcepts{unordered_map(unordered_map\&\&);}@
unordered_map(const Alloc@\removedConcepts{ator}@&);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
unordered_map(const unordered_map&, const Alloc@\removedConcepts{ator}@&);
@@ -6767,6 +6801,8 @@
~unordered_map();
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
unordered_map& operator=(const unordered_map&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&> \&\& MoveAssignable<value_type>}@
+ @\addedConcepts{unordered_map\& operator=(unordered_map\&\&);}@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
unordered_map& operator=(initializer_list<value_type>);
allocator_type get_allocator() const;
@@ -6792,11 +6828,18 @@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Args\&\&...>}@
iterator emplace_hint(const_iterator position, Args&&... args);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
- std::pair<iterator, bool> insert(const value_type& obj);
+ @\removedConcepts{std::}@pair<iterator, bool> insert(const value_type& obj);
+ @\addedConcepts{template <class P>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, P\&\&> \&\& MoveConstructible<value_type>}@
+ @\addedConcepts{pair<iterator, bool> insert(P\&\& obj);}@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
iterator insert(const_iterator hint, const value_type& obj);
+ @\addedConcepts{template <class P>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, P\&\&> \&\& MoveConstructible<value_type>}@
+ @\addedConcepts{pair<iterator, bool> insert(const_iterator hint, P\&\& obj);}@
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
- @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::reference> \&\& MoveConstructible<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::reference>}@
+ @\addedConcepts{\&\& MoveConstructible<value_type>}@
void insert(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
void insert(initializer_list<value_type>);
@@ -6805,7 +6848,7 @@
iterator erase(const_iterator first, const_iterator last);
void clear();
- void swap(unordered_map&);
+ void swap(unordered_map&@\addedConcepts{\&}@);
// observers
hasher hash_function() const;
@@ -6821,6 +6864,9 @@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const key_type\&, mapped_type\&\&>}@
@\addedConcepts{\&\& ConstructibleAsElement<Alloc, mapped_type>}@
mapped_type& operator[](const key_type& k);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, key_type\&\&, mapped_type\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, mapped_type>}@
+ @\addedConcepts{mapped_type\& operator[](key_type\&\& k);}@
mapped_type& at(const key_type& k);
const mapped_type& at(const key_type& k) const;
@@ -6844,6 +6890,12 @@
template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Hash, class Pred, class Alloc>
void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
unordered_map<Key, T, Hash, Pred, Alloc>& y);
+ @\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_map<Key, T, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_map<Key, T, Hash, Pred, Alloc>\&\& y);}@
+ @\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_map<Key, T, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_map<Key, T, Hash, Pred, Alloc>\& y);}@
@\removedConcepts{template <class Key, class T, class Hash, class Pred, class Alloc>}@
@\removedConcepts{struct constructible_with_allocator_suffix<}@
@@ -6908,6 +6960,10 @@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, key_type\&\&, mapped_type\&\&>}@
@\addedConcepts{\&\& ConstructibleAsElement<Alloc, mapped_type>}@
mapped_type& operator[](const key_type& k);
+
+@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, key_type\&\&, mapped_type\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, mapped_type>}@
+ @\addedConcepts{mapped_type\& operator[](key_type\&\& k);}@
\end{itemdecl}
\begin{itemdescr}
@@ -6915,7 +6971,10 @@
\effects\ If the \tcode{unordered_map} does not already contain
an element whose key is equivalent to \tcode{\textit{k}}, inserts
the value
-\tcode{std::pair<const key_type, mapped_type>(k, mapped_type())}.
+\tcode{std::pair<const key_type, mapped_type>(k, mapped_type())}
+\addedConcepts{or
+\mbox{\tcode{std::pair<const key_type,}}}\\
+\addedConcepts{\mbox{\tcode{mapped_type>(std::move(k), mapped_type())}}, respectively}.
\pnum
\returns\ A reference to \tcode{x.second}, where \tcode{x}
@@ -6943,6 +7002,12 @@
template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Hash, class Pred, class Alloc>
void swap(unordered_map<Key, T, Hash, Pred, Alloc>& x,
unordered_map<Key, T, Hash, Pred, Alloc>& y);
+@\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_map<Key, T, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_map<Key, T, Hash, Pred, Alloc>\&\& y);}@
+@\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_map<Key, T, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_map<Key, T, Hash, Pred, Alloc>\& y);}@
\end{itemdecl}
\begin{itemdescr}
@@ -6978,11 +7043,11 @@
@\changedConcepts{class}{Predicate<auto, Key, Key>}@ Pred = std::equal_to<Key>,
@\changedConcepts{class}{RandomAccessAllocator}@ Alloc = std::allocator<std::pair<const Key, T> > >
@\addedConcepts{requires SameType<Hash::result_type, size_t>}@
- @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
+ @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
class unordered_multimap
{
public:
@@ -7020,11 +7085,13 @@
const allocator_type& a = allocator_type());
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
unordered_multimap(const unordered_multimap&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@
+ @\addedConcepts{unordered_multimap(unordered_multimap\&\&);}@
unordered_multimap(const Alloc@\removedConcepts{ator}@&);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
unordered_multimap(const unordered_multimap&, const Alloc@\removedConcepts{ator}@&);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@
- unordered_multimap(unordered_multimap&&, const Alloc@\removedConcepts{ator}@&);
+ unordered_multimap(unordered_multimap&&, const Alloc@\removedConcepts{ator}@&);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
unordered_multimap(initializer_list<value_type>,
size_type = @\impdef@,
@@ -7034,6 +7101,8 @@
~unordered_multimap();
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
unordered_multimap& operator=(const unordered_multimap&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&> \&\& MoveAssignable<value_type>}@
+ @\addedConcepts{unordered_multimap\& operator=(unordered_multimap\&\&);}@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
unordered_multimap& operator=(initializer_list<value_type>);
allocator_type get_allocator() const;
@@ -7060,10 +7129,17 @@
iterator emplace_hint(const_iterator position, Args&&... args);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
iterator insert(const value_type& obj);
+ @\addedConcepts{template <class P>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, P\&\&> \&\& MoveConstructible<value_type>}@
+ @\addedConcepts{iterator insert(P\&\& obj);}@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
iterator insert(const_iterator hint, const value_type& obj);
+ @\addedConcepts{template <class P>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, P\&\&> \&\& MoveConstructible<value_type>}@
+ @\addedConcepts{iterator insert(const_iterator hint, P\&\& obj);}@
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
- @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::reference> \&\& MoveConstructible<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::reference>}@
+ @\addedConcepts{\&\& MoveConstructible<value_type>}@
void insert(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
void insert(initializer_list<value_type>);
@@ -7073,7 +7149,7 @@
iterator erase(const_iterator first, const_iterator last);
void clear();
- void swap(unordered_multimap&);
+ void swap(unordered_multimap&@\addedConcepts{\&}@);
// observers
hasher hash_function() const;
@@ -7106,6 +7182,12 @@
template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Hash, class Pred, class Alloc>
void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
+ @\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_multimap<Key, T, Hash, Pred, Alloc>\&\& y);}@
+ @\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_multimap<Key, T, Hash, Pred, Alloc>\& y);}@
@\removedConcepts{template <class Key, class T, class Hash, class Pred, class Alloc>}@
@\removedConcepts{struct constructible_with_allocator_suffix<}@
@@ -7140,7 +7222,7 @@
\begin{itemdecl}
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::reference>}@
- @\addedConcepts{\&\& MoveConstructible<value_type>}@
+ @\addedConcepts{\&\& MoveConstructible<value_type>}@
unordered_multimap(@\changedConcepts{InputIterator}{Iter}@ f, @\changedConcepts{InputIterator}{Iter}@ l,
size_type n = @\textit{implementation-defined}@,
const hasher& hf = hasher(),
@@ -7169,6 +7251,12 @@
template <@\changedConcepts{class}{ObjectType}@ Key, @\changedConcepts{class}{ObjectType}@ T, class Hash, class Pred, class Alloc>
void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>& x,
unordered_multimap<Key, T, Hash, Pred, Alloc>& y);
+@\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_multimap<Key, T, Hash, Pred, Alloc>\&\& y);}@
+@\addedConcepts{template <ObjectType Key, ObjectType T, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multimap<Key, T, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_multimap<Key, T, Hash, Pred, Alloc>\& y);}@
\end{itemdecl}
@@ -7204,11 +7292,11 @@
@\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = std::equal_to<Value>,
@\changedConcepts{class}{RandomAccessAllocator}@ Alloc = std::allocator<Value> >
@\addedConcepts{requires SameType<Hash::result_type, size_t>}@
- @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
+ @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
class unordered_set
{
public:
@@ -7245,6 +7333,8 @@
const allocator_type& a = allocator_type());
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
unordered_set(const unordered_set&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@
+ @\addedConcepts{unordered_set(unordered_set\&\&);}@
unordered_set(const Alloc@\removedConcepts{ator}@&);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
unordered_set(const unordered_set&, const Alloc@\removedConcepts{ator}@&);
@@ -7259,6 +7349,8 @@
~unordered_set();
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
unordered_set& operator=(const unordered_set&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&> \&\& MoveAssignable<value_type>}@
+ @\addedConcepts{unordered_set\& operator=(unordered_set\&\&);}@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
unordered_set& operator=(initializer_list<value_type>);
allocator_type get_allocator() const;
@@ -7284,11 +7376,16 @@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Args\&\&...>}@
iterator emplace_hint(const_iterator position, Args&&... args);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
- std::pair<iterator, bool> insert(const value_type& obj);
+ @\removedConcepts{std::}@pair<iterator, bool> insert(const value_type& obj);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@
+ @\addedConcepts{pair<iterator, bool> insert(value_type\&\& obj);}@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
iterator insert(const_iterator hint, const value_type& obj);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@
+ @\addedConcepts{iterator insert(const_iterator hint, value_type\&\& obj);}@
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
- @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::reference> \&\& MoveConstructible<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::reference>}@
+ @\addedConcepts{\&\& MoveConstructible<value_type>}@
void insert(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
void insert(initializer_list<value_type>);
@@ -7298,7 +7395,7 @@
iterator erase(const_iterator first, const_iterator last);
void clear();
- void swap(unordered_set&);
+ void swap(unordered_set&@\addedConcepts{\&}@);
// observers
hasher hash_function() const;
@@ -7331,6 +7428,12 @@
template <@\changedConcepts{class}{ObjectType}@ Value, class Hash, class Pred, class Alloc>
void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
unordered_set<Value, Hash, Pred, Alloc>& y);
+ @\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_set<Value, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_set<Value, Hash, Pred, Alloc>\&\& y);}@
+ @\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_set<Value, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_set<Value, Hash, Pred, Alloc>\& y);}@
@\removedConcepts{template <class Value, class Hash, class Pred, class Alloc>}@
@\removedConcepts{struct constructible_with_allocator_suffix<}@
@@ -7365,7 +7468,7 @@
\begin{itemdecl}
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::reference>}@
- @\addedConcepts{\&\& MoveConstructible<value_type>}@
+ @\addedConcepts{\&\& MoveConstructible<value_type>}@
unordered_set(@\changedConcepts{InputIterator}{Iter}@ f, @\changedConcepts{InputIterator}{Iter}@ l,
size_type n = @\textit{implementation-defined}@,
const hasher& hf = hasher(),
@@ -7394,6 +7497,12 @@
template <@\changedConcepts{class}{ObjectType}@ Value, class Hash, class Pred, class Alloc>
void swap(unordered_set<Value, Hash, Pred, Alloc>& x,
unordered_set<Value, Hash, Pred, Alloc>& y);
+@\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_set<Value, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_set<Value, Hash, Pred, Alloc>\&\& y);}@
+@\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_set<Value, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_set<Value, Hash, Pred, Alloc>\& y);}@
\end{itemdecl}
\begin{itemdescr}
@@ -7428,11 +7537,11 @@
@\changedConcepts{class}{Predicate<auto, Value, Value>}@ class Pred = std::equal_to<Value>,
@\changedConcepts{class}{RandomAccessAllocator}@ Alloc = std::allocator<Value> >
@\addedConcepts{requires SameType<Hash::result_type, size_t>}@
- @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
- @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
+ @\addedConcepts{\&\& CopyConstructible<Hash> \&\& CopyConstructible<Pred>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, const Pred\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Pred, Pred\&\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, const Hash\&>}@
+ @\addedConcepts{\&\& ConstructibleAsElement<Alloc, Hash, Hash\&\&>}@
class unordered_multiset
{
public:
@@ -7469,6 +7578,8 @@
const allocator_type& a = allocator_type());
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
unordered_multiset(const unordered_multiset&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@
+ @\addedConcepts{unordered_multiset(unordered_multiset\&\&);}@
unordered_multiset(const Alloc@\removedConcepts{ator}@&);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
unordered_multiset(const unordered_multiset&, const Alloc@\removedConcepts{ator}@&);
@@ -7483,6 +7594,8 @@
~unordered_multiset();
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
unordered_multiset& operator=(const unordered_multiset&);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&> \&\& MoveAssignable<value_type>}@
+ @\addedConcepts{unordered_multiset\& operator=(unordered_multiset\&\&);}@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&> \&\& CopyAssignable<value_type>}@
unordered_multiset& operator=(initializer_list<value_type>);
allocator_type get_allocator() const;
@@ -7509,10 +7622,15 @@
iterator emplace_hint(const_iterator position, Args&&... args);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
iterator insert(const value_type& obj);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@
+ @\addedConcepts{iterator insert(value_type\&\& obj);}@
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
iterator insert(const_iterator hint, const value_type& obj);
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, value_type\&\&>}@
+ @\addedConcepts{iterator insert(const_iterator hint, value_type\&\& obj);}@
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
- @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::value_type> \&\& MoveConstructible<value_type>}@
+ @\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::value_type>}@
+ @\addedConcepts{\&\& MoveConstructible<value_type>}@
void insert(@\changedConcepts{InputIterator}{Iter}@ first, @\changedConcepts{InputIterator}{Iter}@ last);
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, const value_type\&>}@
void insert(initializer_list<value_type>);
@@ -7522,7 +7640,7 @@
iterator erase(const_iterator first, const_iterator last);
void clear();
- void swap(unordered_multiset&);
+ void swap(unordered_multiset&@\addedConcepts{\&}@);
// observers
hasher hash_function() const;
@@ -7555,6 +7673,12 @@
template <@\changedConcepts{class}{ObjectType}@ Value, class Hash, class Pred, class Alloc>
void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
unordered_multiset<Value, Hash, Pred, Alloc>& y);
+ @\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multiset<Value, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_multiset<Value, Hash, Pred, Alloc>\&\& y);}@
+ @\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multiset<Value, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_multiset<Value, Hash, Pred, Alloc>\& y);}@
@\removedConcepts{template <class Value, class Hash, class Pred, class Alloc>}@
@\removedConcepts{struct constructible_with_allocator_suffix<}@
@@ -7589,7 +7713,7 @@
\begin{itemdecl}
template <@\changedConcepts{class InputIterator}{InputIterator Iter}@>
@\addedConcepts{requires ConstructibleAsElement<Alloc, value_type, Iter::reference>}@
- @\addedConcepts{\&\& MoveConstructible<value_type>}@
+ @\addedConcepts{\&\& MoveConstructible<value_type>}@
unordered_multiset(@\changedConcepts{InputIterator}{Iter}@ f, @\changedConcepts{InputIterator}{Iter}@ l,
size_type n = @\textit{implementation-defined}@,
const hasher& hf = hasher(),
@@ -7617,6 +7741,12 @@
template <@\changedConcepts{class}{ObjectType}@ Value, class Hash, class Pred, class Alloc>
void swap(unordered_multiset<Value, Hash, Pred, Alloc>& x,
unordered_multiset<Value, Hash, Pred, Alloc>& y);
+@\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multiset<Value, Hash, Pred, Alloc>\& x,}@
+ @\addedConcepts{unordered_multiset<Value, Hash, Pred, Alloc>\&\& y);}@
+@\addedConcepts{template <ObjectType Value, class Hash, class Pred, class Alloc>}@
+ @\addedConcepts{void swap(unordered_multiset<Value, Hash, Pred, Alloc>\&\& x,}@
+ @\addedConcepts{unordered_multiset<Value, Hash, Pred, Alloc>\& y);}@
\end{itemdecl}
\begin{itemdescr}
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