111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                     The LLVM Compiler Infrastructure
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details.
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===//
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// UNSUPPORTED: c++98, c++03
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <unordered_map>
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// void swap(unordered_multimap& c)
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//      noexcept(
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//          (!allocator_type::propagate_on_container_swap::value ||
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//                __is_nothrow_swappable<allocator_type>::value) &&
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//           __is_nothrow_swappable<hasher>::value &&
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//           __is_nothrow_swappable<key_equal>::value);
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//  In C++17, the standard says that swap shall have:
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//     noexcept(allocator_traits<allocator_type>::is_always_equal::value &&
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//               __is_nothrow_swappable<hasher>::value &&
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//               __is_nothrow_swappable<key_equal>::value);
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This tests a conforming extension
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <unordered_map>
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert>
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test_macros.h"
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "MoveOnly.h"
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include "test_allocator.h"
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T>
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct some_comp
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef T value_type;
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_comp() {}
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_comp(const some_comp&) {}
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T>
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct some_comp2
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef T value_type;
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_comp2() {}
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_comp2(const some_comp2&) {}
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void deallocate(void*, unsigned) {}
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::true_type propagate_on_container_swap;
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if TEST_STD_VER >= 14
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T>
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid swap(some_comp2<T>&, some_comp2<T>&) noexcept {}
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T>
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct some_hash
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef T value_type;
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_hash() {}
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_hash(const some_hash&);
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T>
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct some_hash2
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef T value_type;
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_hash2() {}
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_hash2(const some_hash2&);
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if TEST_STD_VER >= 14
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <typename T>
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albertvoid swap(some_hash2<T>&, some_hash2<T>&) noexcept {}
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T>
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct some_alloc
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef T value_type;
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_alloc() {}
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_alloc(const some_alloc&);
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void deallocate(void*, unsigned) {}
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::true_type propagate_on_container_swap;
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T>
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct some_alloc2
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef T value_type;
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_alloc2() {}
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_alloc2(const some_alloc2&);
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void deallocate(void*, unsigned) {}
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::false_type propagate_on_container_swap;
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::true_type is_always_equal;
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class T>
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct some_alloc3
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef T value_type;
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_alloc3() {}
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    some_alloc3(const some_alloc3&);
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    void deallocate(void*, unsigned) {}
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::false_type propagate_on_container_swap;
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::false_type is_always_equal;
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert};
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main()
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::pair<const MoveOnly, MoveOnly> V;
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typedef std::unordered_multimap<MoveOnly, MoveOnly> C;
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        C c1, c2;
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert(noexcept(swap(c1, c2)), "");
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typedef std::unordered_multimap<MoveOnly, MoveOnly, std::hash<MoveOnly>,
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                           std::equal_to<MoveOnly>, test_allocator<V>> C;
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        C c1, c2;
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert(noexcept(swap(c1, c2)), "");
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typedef std::unordered_multimap<MoveOnly, MoveOnly, std::hash<MoveOnly>,
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                          std::equal_to<MoveOnly>, other_allocator<V>> C;
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        C c1, c2;
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert(noexcept(swap(c1, c2)), "");
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash<MoveOnly>> C;
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        C c1, c2;
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert(!noexcept(swap(c1, c2)), "");
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        typedef std::unordered_multimap<MoveOnly, MoveOnly, std::hash<MoveOnly>,
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert                                                         some_comp<MoveOnly>> C;
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        C c1, c2;
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert        static_assert(!noexcept(swap(c1, c2)), "");
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#if TEST_STD_VER >= 14
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { // POCS allocator, throwable swap for hash, throwable swap for comp
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash<MoveOnly>, some_comp <MoveOnly>, some_alloc <V>> C;
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1, c2;
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert(!noexcept(swap(c1, c2)), "");
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { // always equal allocator, throwable swap for hash, throwable swap for comp
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash<MoveOnly>, some_comp <MoveOnly>, some_alloc2<V>> C;
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1, c2;
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert(!noexcept(swap(c1, c2)), "");
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { // POCS allocator, throwable swap for hash, nothrow swap for comp
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash<MoveOnly>, some_comp2<MoveOnly>, some_alloc <V>> C;
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1, c2;
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert(!noexcept(swap(c1, c2)), "");
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { // always equal allocator, throwable swap for hash, nothrow swap for comp
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash<MoveOnly>, some_comp2<MoveOnly>, some_alloc2<V>> C;
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1, c2;
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert(!noexcept(swap(c1, c2)), "");
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { // POCS allocator, nothrow swap for hash, throwable swap for comp
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash2<MoveOnly>, some_comp <MoveOnly>, some_alloc <V>> C;
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1, c2;
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert(!noexcept(swap(c1, c2)), "");
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { // always equal allocator, nothrow swap for hash, throwable swap for comp
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash2<MoveOnly>, some_comp <MoveOnly>, some_alloc2<V>> C;
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1, c2;
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert(!noexcept(swap(c1, c2)), "");
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { // POCS allocator, nothrow swap for hash, nothrow swap for comp
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash2<MoveOnly>, some_comp2<MoveOnly>, some_alloc <V>> C;
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1, c2;
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert( noexcept(swap(c1, c2)), "");
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { // always equal allocator, nothrow swap for hash, nothrow swap for comp
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash2<MoveOnly>, some_comp2<MoveOnly>, some_alloc2<V>> C;
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1, c2;
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert( noexcept(swap(c1, c2)), "");
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    { // NOT always equal allocator, nothrow swap for hash, nothrow swap for comp
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    typedef std::unordered_multimap<MoveOnly, MoveOnly, some_hash2<MoveOnly>, some_comp2<MoveOnly>, some_alloc3<V>> C;
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    C c1, c2;
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    static_assert( noexcept(swap(c1, c2)), "");
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}
199