// Copyright 2017-2018 Daniel James. // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) #include #include #include #if BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES struct hash_equals { template bool operator()(T const& x) const { boost::hash hf; return hf(x); } template bool operator()(T const& x, T const& y) const { std::equal_to eq; return eq(x, y); } }; template struct test_allocator { typedef T value_type; test_allocator() = default; template test_allocator(test_allocator const&) {} T* allocate(std::size_t n) const { return (T*)malloc(sizeof(T) * n); } void deallocate(T* ptr, std::size_t) const { free(ptr); } bool operator==(test_allocator const&) { return true; } bool operator!=(test_allocator const&) { return false; } }; #endif int main() { std::cout << "BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES: " << BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES << std::endl; #if BOOST_UNORDERED_TEMPLATE_DEDUCTION_GUIDES std::vector > x; x.push_back(std::make_pair(1, 3)); x.push_back(std::make_pair(5, 10)); test_allocator > pair_allocator; hash_equals f; // unordered_map /* template>, class Pred = equal_to>, class Allocator = allocator>> unordered_map(InputIterator, InputIterator, typename see below::size_type = see below, Hash = Hash(), Pred = Pred(), Allocator = Allocator()) -> unordered_map, iter_val_t, Hash, Pred, Allocator>; */ { boost::unordered_map m(x.begin(), x.end()); static_assert( std::is_same >::value); } /* Ambiguous: { boost::unordered_map m(x.begin(), x.end(), 0, std::hash()); static_assert(std::is_same>>::value); } { boost::unordered_map m(x.begin(), x.end(), 0, std::hash(), std::equal_to()); static_assert(std::is_same, std::equal_to>>::value); } */ { boost::unordered_map m(x.begin(), x.end(), 0, std::hash(), std::equal_to(), pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator > > >::value); } /* template, class Pred = equal_to, class Allocator = allocator>> unordered_map(initializer_list>, typename see below::size_type = see below, Hash = Hash(), Pred = Pred(), Allocator = Allocator()) -> unordered_map; */ { boost::unordered_map m({std::pair(1, 2)}); static_assert( std::is_same >::value); } /* Ambiguous { boost::unordered_map m({std::pair(1,2)}, 0, std::hash()); static_assert(std::is_same>>::value); } { boost::unordered_map m({std::pair(1,2)}, 0, std::hash(), std::equal_to()); static_assert(std::is_same, std::equal_to>>::value); } */ { boost::unordered_map m( {std::pair(1, 2)}, 0, f, f, pair_allocator); static_assert(std::is_same > > >::value); } /* template unordered_map(InputIterator, InputIterator, typename see below::size_type, Allocator) -> unordered_map, iter_val_t, hash>, equal_to>, Allocator>; */ /* Ambiguous { boost::unordered_map m(x.begin(), x.end(), 0u, pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator>>>::value); } */ /* template unordered_map(InputIterator, InputIterator, Allocator) -> unordered_map, iter_val_t, hash>, equal_to>, Allocator>; */ /* No constructor: { boost::unordered_map m(x.begin(), x.end(), pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator>>>::value); } */ /* template unordered_map(InputIterator, InputIterator, typename see below::size_type, Hash, Allocator) -> unordered_map, iter_val_t, Hash, equal_to>, Allocator>; */ /* Ambiguous { boost::unordered_map m(x.begin(), x.end(), 0u, f, pair_allocator); static_assert(std::is_same, test_allocator>>>::value); } */ /* template unordered_map(initializer_list>, typename see below::size_type, Allocator) -> unordered_map, equal_to, Allocator>; */ /* Ambiguous { boost::unordered_map m({std::pair(1,2)}, 0, pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator>>>::value); } */ /* template unordered_map(initializer_list>, Allocator) -> unordered_map, equal_to, Allocator>; */ { boost::unordered_map m({std::pair(1, 2)}, pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator > > >::value); } /* template unordered_map(initializer_list>, typename see below::size_type, Hash, Allocator) -> unordered_map, Allocator>; */ /* Ambiguous { boost::unordered_map m({std::pair(1,2)}, 0, f, pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator>>>::value); } */ // unordered_multimap { boost::unordered_multimap m(x.begin(), x.end()); static_assert( std::is_same >::value); } /* Ambiguous: { boost::unordered_multimap m(x.begin(), x.end(), 0, std::hash()); static_assert(std::is_same>>::value); } { boost::unordered_multimap m(x.begin(), x.end(), 0, std::hash(), std::equal_to()); static_assert(std::is_same, std::equal_to>>::value); } */ { boost::unordered_multimap m(x.begin(), x.end(), 0, std::hash(), std::equal_to(), pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator > > >::value); } { boost::unordered_multimap m({std::pair(1, 2)}); static_assert( std::is_same >::value); } /* Ambiguous { boost::unordered_multimap m({std::pair(1,2)}, 0, std::hash()); static_assert(std::is_same>>::value); } { boost::unordered_multimap m({std::pair(1,2)}, 0, std::hash(), std::equal_to()); static_assert(std::is_same, std::equal_to>>::value); } */ { boost::unordered_multimap m( {std::pair(1, 2)}, 0, f, f, pair_allocator); static_assert(std::is_same > > >::value); } /* Ambiguous { boost::unordered_multimap m(x.begin(), x.end(), 0u, pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator>>>::value); } */ /* No constructor: { boost::unordered_multimap m(x.begin(), x.end(), pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator>>>::value); } */ /* Ambiguous { boost::unordered_multimap m(x.begin(), x.end(), 0u, f, pair_allocator); static_assert(std::is_same, test_allocator>>>::value); } { boost::unordered_multimap m({std::pair(1,2)}, 0, pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator>>>::value); } */ { boost::unordered_multimap m( {std::pair(1, 2)}, pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator > > >::value); } /* Ambiguous { boost::unordered_multimap m({std::pair(1,2)}, 0, f, pair_allocator); static_assert(std::is_same, std::equal_to, test_allocator>>>::value); } */ #endif }