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