//===----------------------------------------------------------------------===// // // 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, c++17, c++20 // // template R> // flat_map(from_range_t, R&&) // template R> // flat_map(from_range_t, R&&, const key_compare&) // template R, class Alloc> // flat_map(from_range_t, R&&, const Alloc&); // template R, class Alloc> // flat_map(from_range_t, R&&, const key_compare&, const Alloc&); #include #include #include #include #include #include #include "min_allocator.h" #include "test_allocator.h" #include "test_iterators.h" #include "test_macros.h" #include "../../../test_compare.h" // test constraint container-compatible-range template using RangeOf = std::ranges::subrange; using Map = std::flat_map; static_assert(std::is_constructible_v>>); static_assert(std::is_constructible_v>>); static_assert(!std::is_constructible_v>); static_assert(!std::is_constructible_v>); static_assert(std::is_constructible_v>, std::less>); static_assert(std::is_constructible_v>, std::less>); static_assert(!std::is_constructible_v, std::less>); static_assert(!std::is_constructible_v, std::less>); static_assert(std::is_constructible_v>, std::allocator>); static_assert(std::is_constructible_v>, std::allocator>); static_assert(!std::is_constructible_v, std::allocator>); static_assert(!std::is_constructible_v, std::allocator>); static_assert(std::is_constructible_v>, std::less, std::allocator>); static_assert(std::is_constructible_v>, std::less, std::allocator>); static_assert(!std::is_constructible_v, std::less, std::allocator>); static_assert(!std::is_constructible_v, std::less, std::allocator>); int main(int, char**) { { // The constructors in this subclause shall not participate in overload // resolution unless uses_allocator_v is true // and uses_allocator_v is true. using C = test_less; using A1 = test_allocator; using A2 = other_allocator; using V1 = std::vector; using V2 = std::vector; using M1 = std::flat_map; using M2 = std::flat_map; using M3 = std::flat_map; static_assert(std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(!std::is_constructible_v); } { // container-compatible-range using C = test_less; using A1 = test_allocator; using A2 = test_allocator; using M = std::flat_map, std::vector>; using Pair = std::pair; using PairLike = std::tuple; using NonPairLike = int; static_assert(std::is_constructible_v&>); static_assert(std::is_constructible_v&>); static_assert(!std::is_constructible_v&>); static_assert(std::is_constructible_v&, const C&>); static_assert(std::is_constructible_v&, const C&>); static_assert(!std::is_constructible_v&, const C&>); static_assert(std::is_constructible_v&, const A1&>); static_assert(std::is_constructible_v&, const A1&>); static_assert(!std::is_constructible_v&, const A1&>); static_assert(std::is_constructible_v&, const C&, const A1&>); static_assert(std::is_constructible_v&, const C&, const A1&>); static_assert(!std::is_constructible_v&, const C&, const A1&>); } using P = std::pair; P ar[] = {{1, 1}, {1, 2}, {1, 3}, {2, 4}, {2, 5}, {3, 6}, {2, 7}, {3, 8}, {3, 9}}; P expected[] = {{1, 1}, {2, 4}, {3, 6}}; { // flat_map(from_range_t, R&&) // input_range && !common using M = std::flat_map; using Iter = cpp20_input_iterator; using Sent = sentinel_wrapper; using R = std::ranges::subrange; auto m = M(std::from_range, R(Iter(ar), Sent(Iter(ar + 9)))); assert(std::ranges::equal(m.keys(), expected | std::views::elements<0>)); LIBCPP_ASSERT(std::ranges::equal(m, expected)); // explicit(false) M m2 = {std::from_range, R(Iter(ar), Sent(Iter(ar + 9)))}; assert(m2 == m); } { // flat_map(from_range_t, R&&) // greater using M = std::flat_map, std::deque>, std::deque>; using Iter = cpp20_input_iterator; using Sent = sentinel_wrapper; using R = std::ranges::subrange; auto m = M(std::from_range, R(Iter(ar), Sent(Iter(ar + 9)))); assert((m.keys() == std::deque>{3, 2, 1})); LIBCPP_ASSERT((m.values() == std::deque{6, 4, 1})); } { // flat_map(from_range_t, R&&) // contiguous range using M = std::flat_map; using R = std::ranges::subrange; auto m = M(std::from_range, R(ar, ar + 9)); assert(std::ranges::equal(m.keys(), expected | std::views::elements<0>)); LIBCPP_ASSERT(std::ranges::equal(m, expected)); } { // flat_map(from_range_t, R&&, const key_compare&) using C = test_less; using M = std::flat_map, std::deque>; using R = std::ranges::subrange; auto m = M(std::from_range, R(ar, ar + 9), C(3)); assert(std::ranges::equal(m.keys(), expected | std::views::elements<0>)); LIBCPP_ASSERT(std::ranges::equal(m, expected)); assert(m.key_comp() == C(3)); // explicit(false) M m2 = {std::from_range, R(ar, ar + 9), C(3)}; assert(m2 == m); assert(m2.key_comp() == C(3)); } { // flat_map(from_range_t, R&&, const Allocator&) using A1 = test_allocator; using A2 = test_allocator; using M = std::flat_map, std::vector, std::deque>; using R = std::ranges::subrange; auto m = M(std::from_range, R(ar, ar + 9), A1(5)); assert(std::ranges::equal(m.keys(), expected | std::views::elements<0>)); LIBCPP_ASSERT(std::ranges::equal(m, expected)); assert(m.keys().get_allocator() == A1(5)); assert(m.values().get_allocator() == A2(5)); } { // flat_map(from_range_t, R&&, const Allocator&) // explicit(false) using A1 = test_allocator; using A2 = test_allocator; using M = std::flat_map, std::vector, std::deque>; using R = std::ranges::subrange; M m = {std::from_range, R(ar, ar + 9), A1(5)}; // implicit ctor assert(std::ranges::equal(m.keys(), expected | std::views::elements<0>)); LIBCPP_ASSERT(std::ranges::equal(m, expected)); assert(m.keys().get_allocator() == A1(5)); assert(m.values().get_allocator() == A2(5)); } { // flat_map(from_range_t, R&&, const key_compare&, const Allocator&) using C = test_less; using A1 = test_allocator; using A2 = test_allocator; using M = std::flat_map, std::deque>; using R = std::ranges::subrange; auto m = M(std::from_range, R(ar, ar + 9), C(3), A1(5)); assert(std::ranges::equal(m.keys(), expected | std::views::elements<0>)); LIBCPP_ASSERT(std::ranges::equal(m, expected)); assert(m.key_comp() == C(3)); assert(m.keys().get_allocator() == A1(5)); assert(m.values().get_allocator() == A2(5)); } { // flat_map(from_range_t, R&&, const key_compare&, const Allocator&) // explicit(false) using A1 = test_allocator; using A2 = test_allocator; using M = std::flat_map, std::deque, std::vector>; using R = std::ranges::subrange; M m = {std::from_range, R(ar, ar + 9), {}, A2(5)}; // implicit ctor assert(std::ranges::equal(m.keys(), expected | std::views::elements<0>)); LIBCPP_ASSERT(std::ranges::equal(m, expected)); assert(m.keys().get_allocator() == A1(5)); assert(m.values().get_allocator() == A2(5)); } return 0; }