From 24a7e331f19489eddf31f26e40c1eeae1c8049b2 Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Wed, 11 Sep 2013 00:06:45 +0000 Subject: [PATCH] LWG Issue #2210 Part 4 - map/multimap git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@190454 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/set | 36 +++++++++++++++++++ .../multiset.cons/initializer_list.pass.cpp | 18 ++++++++++ .../multiset.cons/iter_iter_alloc.pass.cpp | 34 ++++++++++++++++++ .../initializer_list_compare_alloc.pass.cpp | 22 ++++++++++++ .../set/set.cons/iter_iter_alloc.pass.cpp | 32 +++++++++++++++++ 5 files changed, 142 insertions(+) diff --git a/include/set b/include/set index 70b8d28f..a537c5fe 100644 --- a/include/set +++ b/include/set @@ -66,6 +66,11 @@ public: set(initializer_list il, const value_compare& comp = value_compare()); set(initializer_list il, const value_compare& comp, const allocator_type& a); + template + set(InputIterator first, InputIterator last, const allocator_type& a) + : set(first, last, Compare(), a) {} // C++14 + set(initializer_list il, const allocator_type& a) + : set(il, Compare(), a) {} // C++14 ~set(); set& operator=(const set& s); @@ -242,6 +247,11 @@ public: multiset(initializer_list il, const value_compare& comp = value_compare()); multiset(initializer_list il, const value_compare& comp, const allocator_type& a); + template + multiset(InputIterator first, InputIterator last, const allocator_type& a) + : set(first, last, Compare(), a) {} // C++14 + multiset(initializer_list il, const allocator_type& a) + : set(il, Compare(), a) {} // C++14 ~multiset(); multiset& operator=(const multiset& s); @@ -442,6 +452,13 @@ public: insert(__f, __l); } +#if _LIBCPP_STD_VER > 11 + template + _LIBCPP_INLINE_VISIBILITY + set(_InputIterator __f, _InputIterator __l, const allocator_type& __a) + : set(__f, __l, key_compare(), __a) {} +#endif + _LIBCPP_INLINE_VISIBILITY set(const set& __s) : __tree_(__s.__tree_) @@ -494,6 +511,12 @@ public: insert(__il.begin(), __il.end()); } +#if _LIBCPP_STD_VER > 11 + _LIBCPP_INLINE_VISIBILITY + set(initializer_list __il, const allocator_type& __a) + : set(__il, key_compare(), __a) {} +#endif + _LIBCPP_INLINE_VISIBILITY set& operator=(initializer_list __il) { @@ -817,6 +840,13 @@ public: insert(__f, __l); } +#if _LIBCPP_STD_VER > 11 + template + _LIBCPP_INLINE_VISIBILITY + multiset(_InputIterator __f, _InputIterator __l, const allocator_type& __a) + : multiset(__f, __l, key_compare(), __a) {} +#endif + template _LIBCPP_INLINE_VISIBILITY multiset(_InputIterator __f, _InputIterator __l, @@ -876,6 +906,12 @@ public: insert(__il.begin(), __il.end()); } +#if _LIBCPP_STD_VER > 11 + _LIBCPP_INLINE_VISIBILITY + multiset(initializer_list __il, const allocator_type& __a) + : multiset(__il, key_compare(), __a) {} +#endif + _LIBCPP_INLINE_VISIBILITY multiset& operator=(initializer_list __il) { diff --git a/test/containers/associative/multiset/multiset.cons/initializer_list.pass.cpp b/test/containers/associative/multiset/multiset.cons/initializer_list.pass.cpp index 9e3186d9..60e6940e 100644 --- a/test/containers/associative/multiset/multiset.cons/initializer_list.pass.cpp +++ b/test/containers/associative/multiset/multiset.cons/initializer_list.pass.cpp @@ -51,5 +51,23 @@ int main() assert(*++i == V(5)); assert(*++i == V(6)); } +#if _LIBCPP_STD_VER > 11 + { + typedef std::multiset, min_allocator> C; + typedef C::value_type V; + min_allocator a; + C m ({1, 2, 3, 4, 5, 6}, a); + assert(m.size() == 6); + assert(distance(m.begin(), m.end()) == 6); + C::const_iterator i = m.cbegin(); + assert(*i == V(1)); + assert(*++i == V(2)); + assert(*++i == V(3)); + assert(*++i == V(4)); + assert(*++i == V(5)); + assert(*++i == V(6)); + assert(m.get_allocator() == a); + } +#endif #endif } diff --git a/test/containers/associative/multiset/multiset.cons/iter_iter_alloc.pass.cpp b/test/containers/associative/multiset/multiset.cons/iter_iter_alloc.pass.cpp index a83e2ae5..b6d25d6e 100644 --- a/test/containers/associative/multiset/multiset.cons/iter_iter_alloc.pass.cpp +++ b/test/containers/associative/multiset/multiset.cons/iter_iter_alloc.pass.cpp @@ -55,4 +55,38 @@ int main() assert(*next(m.begin(), 6) == 3); assert(*next(m.begin(), 7) == 3); assert(*next(m.begin(), 8) == 3); +#if _LIBCPP_STD_VER > 11 + { + typedef int V; + V ar[] = + { + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 3 + }; + typedef test_allocator A; + typedef test_compare > C; + A a; + std::multiset m(ar, ar+sizeof(ar)/sizeof(ar[0]), a); + + assert(m.size() == 9); + assert(distance(m.begin(), m.end()) == 9); + assert(*next(m.begin(), 0) == 1); + assert(*next(m.begin(), 1) == 1); + assert(*next(m.begin(), 2) == 1); + assert(*next(m.begin(), 3) == 2); + assert(*next(m.begin(), 4) == 2); + assert(*next(m.begin(), 5) == 2); + assert(*next(m.begin(), 6) == 3); + assert(*next(m.begin(), 7) == 3); + assert(*next(m.begin(), 8) == 3); + assert(m.get_allocator() == a); + } +#endif } diff --git a/test/containers/associative/set/set.cons/initializer_list_compare_alloc.pass.cpp b/test/containers/associative/set/set.cons/initializer_list_compare_alloc.pass.cpp index c180915a..d4021acf 100644 --- a/test/containers/associative/set/set.cons/initializer_list_compare_alloc.pass.cpp +++ b/test/containers/associative/set/set.cons/initializer_list_compare_alloc.pass.cpp @@ -12,6 +12,7 @@ // class set // set(initializer_list il, const key_compare& comp, const allocator_type& a); +// set(initializer_list il, const allocator_type& a); #include #include @@ -21,6 +22,7 @@ int main() { #ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS + { typedef test_compare > Cmp; typedef test_allocator A; typedef std::set C; @@ -37,5 +39,25 @@ int main() assert(*++i == V(6)); assert(m.key_comp() == Cmp(10)); assert(m.get_allocator() == A(4)); + } +#if _LIBCPP_STD_VER > 11 + { + typedef test_compare > Cmp; + typedef test_allocator A; + typedef std::set C; + typedef C::value_type V; + C m({1, 2, 3, 4, 5, 6}, A(4)); + assert(m.size() == 6); + assert(distance(m.begin(), m.end()) == 6); + C::const_iterator i = m.cbegin(); + assert(*i == V(1)); + assert(*++i == V(2)); + assert(*++i == V(3)); + assert(*++i == V(4)); + assert(*++i == V(5)); + assert(*++i == V(6)); + assert(m.get_allocator() == A(4)); + } +#endif #endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS } diff --git a/test/containers/associative/set/set.cons/iter_iter_alloc.pass.cpp b/test/containers/associative/set/set.cons/iter_iter_alloc.pass.cpp index 9b4992bd..1ae4634a 100644 --- a/test/containers/associative/set/set.cons/iter_iter_alloc.pass.cpp +++ b/test/containers/associative/set/set.cons/iter_iter_alloc.pass.cpp @@ -14,6 +14,10 @@ // template // set(InputIterator first, InputIterator last, // const value_compare& comp, const allocator_type& a); +// +// template +// set(InputIterator first, InputIterator last, +// const allocator_type& a); #include #include @@ -49,4 +53,32 @@ int main() assert(*m.begin() == 1); assert(*next(m.begin()) == 2); assert(*next(m.begin(), 2) == 3); +#if _LIBCPP_STD_VER > 11 + { + typedef int V; + V ar[] = + { + 1, + 1, + 1, + 2, + 2, + 2, + 3, + 3, + 3 + }; + typedef test_allocator A; + typedef test_compare > C; + A a(7); + std::set m(ar, ar+sizeof(ar)/sizeof(ar[0]), a); + + assert(m.size() == 3); + assert(distance(m.begin(), m.end()) == 3); + assert(*m.begin() == 1); + assert(*next(m.begin()) == 2); + assert(*next(m.begin(), 2) == 3); + assert(m.get_allocator() == a); + } +#endif }