//===----------------------------------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // UNSUPPORTED: c++03, c++11, c++14 // // template>, // class Allocator = allocator>> // set(InputIterator, InputIterator, // Compare = Compare(), Allocator = Allocator()) // -> set, Compare, Allocator>; // template, // class Allocator = allocator> // set(initializer_list, Compare = Compare(), Allocator = Allocator()) // -> set; // template // set(InputIterator, InputIterator, Allocator) // -> set, // less>, Allocator>; // template // set(initializer_list, Allocator) // -> set, Allocator>; // // template>, // class Allocator = allocator>> // set(from_range_t, R&&, Compare = Compare(), Allocator = Allocator()) // -> set, Compare, Allocator>; // C++23 // // template // set(from_range_t, R&&, Allocator) // -> set, less>, Allocator>; // C++23 #include // std::equal #include #include #include // INT_MAX #include #include #include #include "deduction_guides_sfinae_checks.h" #include "test_allocator.h" struct NotAnAllocator { friend bool operator<(NotAnAllocator, NotAnAllocator) { return false; } }; int main(int, char**) { { const int arr[] = {1, 2, 1, INT_MAX, 3}; std::set s(std::begin(arr), std::end(arr)); ASSERT_SAME_TYPE(decltype(s), std::set); const int expected_s[] = {1, 2, 3, INT_MAX}; assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s))); } { const int arr[] = {1, 2, 1, INT_MAX, 3}; std::set s(std::begin(arr), std::end(arr), std::greater()); ASSERT_SAME_TYPE(decltype(s), std::set >); const int expected_s[] = {INT_MAX, 3, 2, 1}; assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s))); } { const int arr[] = {1, 2, 1, INT_MAX, 3}; std::set s(std::begin(arr), std::end(arr), std::greater(), test_allocator(0, 42)); ASSERT_SAME_TYPE(decltype(s), std::set, test_allocator >); const int expected_s[] = {INT_MAX, 3, 2, 1}; assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s))); assert(s.get_allocator().get_id() == 42); } { std::set source; std::set s(source); ASSERT_SAME_TYPE(decltype(s), std::set); assert(s.size() == 0); } { std::set source; std::set s{source}; // braces instead of parens ASSERT_SAME_TYPE(decltype(s), std::set); assert(s.size() == 0); } { std::set source; std::set s(source, std::set::allocator_type()); ASSERT_SAME_TYPE(decltype(s), std::set); assert(s.size() == 0); } { std::set s{1, 2, 1, INT_MAX, 3}; ASSERT_SAME_TYPE(decltype(s), std::set); const int expected_s[] = {1, 2, 3, INT_MAX}; assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s))); } { std::set s({1, 2, 1, INT_MAX, 3}, std::greater()); ASSERT_SAME_TYPE(decltype(s), std::set >); const int expected_s[] = {INT_MAX, 3, 2, 1}; assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s))); } { std::set s({1, 2, 1, INT_MAX, 3}, std::greater(), test_allocator(0, 43)); ASSERT_SAME_TYPE(decltype(s), std::set, test_allocator >); const int expected_s[] = {INT_MAX, 3, 2, 1}; assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s))); assert(s.get_allocator().get_id() == 43); } { const int arr[] = {1, 2, 1, INT_MAX, 3}; std::set s(std::begin(arr), std::end(arr), test_allocator(0, 44)); ASSERT_SAME_TYPE(decltype(s), std::set, test_allocator >); const int expected_s[] = {1, 2, 3, INT_MAX}; assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s))); assert(s.get_allocator().get_id() == 44); } { std::set s({1, 2, 1, INT_MAX, 3}, test_allocator(0, 45)); ASSERT_SAME_TYPE(decltype(s), std::set, test_allocator >); const int expected_s[] = {1, 2, 3, INT_MAX}; assert(std::equal(s.begin(), s.end(), std::begin(expected_s), std::end(expected_s))); assert(s.get_allocator().get_id() == 45); } { NotAnAllocator a; std::set s{a}; // set(initializer_list) ASSERT_SAME_TYPE(decltype(s), std::set); assert(s.size() == 1); } { std::set source; std::set s{source, source}; // set(initializer_list>) ASSERT_SAME_TYPE(decltype(s), std::set >); assert(s.size() == 1); } { NotAnAllocator a; std::set s{a, a}; // set(initializer_list) ASSERT_SAME_TYPE(decltype(s), std::set); assert(s.size() == 1); } { int source[3] = {3, 4, 5}; std::set s(source, source + 3); // set(InputIterator, InputIterator) ASSERT_SAME_TYPE(decltype(s), std::set); assert(s.size() == 3); } { int source[3] = {3, 4, 5}; std::set s{source, source + 3}; // set(initializer_list) ASSERT_SAME_TYPE(decltype(s), std::set); assert(s.size() == 2); } #if TEST_STD_VER >= 23 { using Range = std::array; using Comp = std::greater; using DefaultComp = std::less; using Alloc = test_allocator; { // (from_range, range) std::set c(std::from_range, Range()); static_assert(std::is_same_v>); } { // (from_range, range, comp) std::set c(std::from_range, Range(), Comp()); static_assert(std::is_same_v>); } { // (from_range, range, comp, alloc) std::set c(std::from_range, Range(), Comp(), Alloc()); static_assert(std::is_same_v>); } { // (from_range, range, alloc) std::set c(std::from_range, Range(), Alloc()); static_assert(std::is_same_v>); } } #endif AssociativeContainerDeductionGuidesSfinaeAway>(); return 0; }