1b0386a51SErik Pilkington //===----------------------------------------------------------------------===// 2b0386a51SErik Pilkington // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6b0386a51SErik Pilkington // 7b0386a51SErik Pilkington //===----------------------------------------------------------------------===// 8b0386a51SErik Pilkington 931cbe0f2SLouis Dionne // UNSUPPORTED: c++03, c++11, c++14 10b0386a51SErik Pilkington 11b0386a51SErik Pilkington #include <unordered_set> 12b0386a51SErik Pilkington #include <unordered_map> 13b0386a51SErik Pilkington #include <set> 14b0386a51SErik Pilkington #include <map> 157fc6a556SMarshall Clow #include "test_macros.h" 16b0386a51SErik Pilkington #include "min_allocator.h" 17b0386a51SErik Pilkington 18b0386a51SErik Pilkington // [container.node.overview] Table 83. 19b0386a51SErik Pilkington template <class K, class T, class C1, class C2, class H1, class H2, class E1, class E2, class A_set, class A_map> 20b0386a51SErik Pilkington struct node_compatibility_table 21b0386a51SErik Pilkington { 22b0386a51SErik Pilkington static constexpr bool value = 239d7ae0acSLouis Dionne std::is_same_v<typename std::map<K, T, C1, A_map>::node_type, typename std::map<K, T, C2, A_map>::node_type> && 249d7ae0acSLouis Dionne std::is_same_v<typename std::map<K, T, C1, A_map>::node_type, typename std::multimap<K, T, C2, A_map>::node_type> && 259d7ae0acSLouis Dionne std::is_same_v<typename std::set<K, C1, A_set>::node_type, typename std::set<K, C2, A_set>::node_type> && 269d7ae0acSLouis Dionne std::is_same_v<typename std::set<K, C1, A_set>::node_type, typename std::multiset<K, C2, A_set>::node_type> && 279d7ae0acSLouis Dionne std::is_same_v<typename std::unordered_map<K, T, H1, E1, A_map>::node_type, typename std::unordered_map<K, T, H2, E2, A_map>::node_type> && 289d7ae0acSLouis Dionne std::is_same_v<typename std::unordered_map<K, T, H1, E1, A_map>::node_type, typename std::unordered_multimap<K, T, H2, E2, A_map>::node_type> && 299d7ae0acSLouis Dionne std::is_same_v<typename std::unordered_set<K, H1, E1, A_set>::node_type, typename std::unordered_set<K, H2, E2, A_set>::node_type> && 309d7ae0acSLouis Dionne std::is_same_v<typename std::unordered_set<K, H1, E1, A_set>::node_type, typename std::unordered_multiset<K, H2, E2, A_set>::node_type>; 31b0386a51SErik Pilkington }; 32b0386a51SErik Pilkington 33b0386a51SErik Pilkington template <class T> struct my_hash 34b0386a51SErik Pilkington { 35b0386a51SErik Pilkington using argument_type = T; 369d7ae0acSLouis Dionne using result_type = std::size_t; 37b0386a51SErik Pilkington my_hash() = default; 389d7ae0acSLouis Dionne std::size_t operator()(const T&) const {return 0;} 39b0386a51SErik Pilkington }; 40b0386a51SErik Pilkington 41b0386a51SErik Pilkington template <class T> struct my_compare 42b0386a51SErik Pilkington { 43b0386a51SErik Pilkington my_compare() = default; 44b0386a51SErik Pilkington bool operator()(const T&, const T&) const {return true;} 45b0386a51SErik Pilkington }; 46b0386a51SErik Pilkington 47b0386a51SErik Pilkington template <class T> struct my_equal 48b0386a51SErik Pilkington { 49b0386a51SErik Pilkington my_equal() = default; 50b0386a51SErik Pilkington bool operator()(const T&, const T&) const {return true;} 51b0386a51SErik Pilkington }; 52b0386a51SErik Pilkington 53b0386a51SErik Pilkington struct Static 54b0386a51SErik Pilkington { 55b0386a51SErik Pilkington Static() = default; 56b0386a51SErik Pilkington Static(const Static&) = delete; 57b0386a51SErik Pilkington Static(Static&&) = delete; 58b0386a51SErik Pilkington Static& operator=(const Static&) = delete; 59b0386a51SErik Pilkington Static& operator=(Static&&) = delete; 60b0386a51SErik Pilkington }; 61b0386a51SErik Pilkington 62*5dfdac74SNikolas Klauser template <> 63*5dfdac74SNikolas Klauser struct std::hash<Static> { 64b0386a51SErik Pilkington using argument_type = Static; 659d7ae0acSLouis Dionne using result_type = std::size_t; 66b0386a51SErik Pilkington hash() = default; 679d7ae0acSLouis Dionne std::size_t operator()(const Static&) const; 68b0386a51SErik Pilkington }; 69b0386a51SErik Pilkington 70b0386a51SErik Pilkington static_assert(node_compatibility_table< 71b0386a51SErik Pilkington int, int, std::less<int>, std::less<int>, std::hash<int>, 72b0386a51SErik Pilkington std::hash<int>, std::equal_to<int>, std::equal_to<int>, 73b0386a51SErik Pilkington std::allocator<int>, 74b0386a51SErik Pilkington std::allocator<std::pair<const int, int>>>::value, 75b0386a51SErik Pilkington ""); 76b0386a51SErik Pilkington 77b0386a51SErik Pilkington static_assert( 78b0386a51SErik Pilkington node_compatibility_table<int, int, std::less<int>, my_compare<int>, 79b0386a51SErik Pilkington std::hash<int>, my_hash<int>, std::equal_to<int>, 809d7ae0acSLouis Dionne my_equal<int>, std::allocator<int>, 819d7ae0acSLouis Dionne std::allocator<std::pair<const int, int>>>::value, 82b0386a51SErik Pilkington ""); 83b0386a51SErik Pilkington 84b0386a51SErik Pilkington static_assert(node_compatibility_table< 85b0386a51SErik Pilkington Static, int, my_compare<Static>, std::less<Static>, 86b0386a51SErik Pilkington my_hash<Static>, std::hash<Static>, my_equal<Static>, 87b0386a51SErik Pilkington std::equal_to<Static>, min_allocator<Static>, 88b0386a51SErik Pilkington min_allocator<std::pair<const Static, int>>>::value, 89b0386a51SErik Pilkington ""); 90b0386a51SErik Pilkington 91b0386a51SErik Pilkington template <class Container> 92b0386a51SErik Pilkington void test_node_handle_operations() 93b0386a51SErik Pilkington { 94b0386a51SErik Pilkington Container c; 95b0386a51SErik Pilkington 96b0386a51SErik Pilkington typename Container::node_type nt1, nt2 = c.extract(c.emplace().first); 97b0386a51SErik Pilkington assert(nt2.get_allocator() == c.get_allocator()); 98b0386a51SErik Pilkington assert(!nt2.empty()); 99b0386a51SErik Pilkington assert(nt1.empty()); 100b0386a51SErik Pilkington std::swap(nt1, nt2); 101b0386a51SErik Pilkington assert(nt1.get_allocator() == c.get_allocator()); 102b0386a51SErik Pilkington assert(nt2.empty()); 103b0386a51SErik Pilkington } 104b0386a51SErik Pilkington 105b0386a51SErik Pilkington template <class Container> 106b0386a51SErik Pilkington void test_node_handle_operations_multi() 107b0386a51SErik Pilkington { 108b0386a51SErik Pilkington Container c; 109b0386a51SErik Pilkington 110b0386a51SErik Pilkington typename Container::node_type nt1, nt2 = c.extract(c.emplace()); 111b0386a51SErik Pilkington assert(nt2.get_allocator() == c.get_allocator()); 112b0386a51SErik Pilkington assert(!nt2.empty()); 113b0386a51SErik Pilkington assert(nt1.empty()); 114b0386a51SErik Pilkington std::swap(nt1, nt2); 115b0386a51SErik Pilkington assert(nt1.get_allocator() == c.get_allocator()); 116b0386a51SErik Pilkington assert(nt2.empty()); 117b0386a51SErik Pilkington } 118b0386a51SErik Pilkington 11977e898cbSBilly Robert O'Neal III template <class> void test_typedef() {} 12077e898cbSBilly Robert O'Neal III 121b0386a51SErik Pilkington template <class Container> 122b0386a51SErik Pilkington void test_insert_return_type() 123b0386a51SErik Pilkington { 12477e898cbSBilly Robert O'Neal III test_typedef<typename Container::insert_return_type>(); 125b0386a51SErik Pilkington } 126b0386a51SErik Pilkington 1272df59c50SJF Bastien int main(int, char**) 128b0386a51SErik Pilkington { 129b0386a51SErik Pilkington test_node_handle_operations<std::map<int, int>>(); 130b0386a51SErik Pilkington test_node_handle_operations_multi<std::multimap<int, int>>(); 131b0386a51SErik Pilkington test_node_handle_operations<std::set<int>>(); 132b0386a51SErik Pilkington test_node_handle_operations_multi<std::multiset<int>>(); 133b0386a51SErik Pilkington test_node_handle_operations<std::unordered_map<int, int>>(); 134b0386a51SErik Pilkington test_node_handle_operations_multi<std::unordered_multimap<int, int>>(); 135b0386a51SErik Pilkington test_node_handle_operations<std::unordered_set<int>>(); 136b0386a51SErik Pilkington test_node_handle_operations_multi<std::unordered_multiset<int>>(); 137b0386a51SErik Pilkington 138b0386a51SErik Pilkington test_insert_return_type<std::map<int, int>>(); 139b0386a51SErik Pilkington test_insert_return_type<std::set<int>>(); 140b0386a51SErik Pilkington test_insert_return_type<std::unordered_map<int, int>>(); 141b0386a51SErik Pilkington test_insert_return_type<std::unordered_set<int>>(); 1422df59c50SJF Bastien 1432df59c50SJF Bastien return 0; 144b0386a51SErik Pilkington } 145