//===----------------------------------------------------------------------===// // // 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 // // explicit flat_multimap(const key_compare& comp); // template // flat_multimap(const key_compare& comp, const Alloc& a); #include #include #include #include #include #include "test_macros.h" #include "../../../test_compare.h" #include "test_allocator.h" 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 M1 = std::flat_multimap, std::vector>; using M2 = std::flat_multimap, std::vector>; using M3 = std::flat_multimap, std::vector>; static_assert(std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(!std::is_constructible_v); static_assert(!std::is_constructible_v); } { using C = test_less; auto m = std::flat_multimap(C(3)); assert(m.empty()); assert(m.begin() == m.end()); assert(m.key_comp() == C(3)); } { // The one-argument ctor is explicit. using C = test_less; static_assert(std::is_constructible_v, C>); static_assert(!std::is_convertible_v>); static_assert(std::is_constructible_v, std::less>); static_assert(!std::is_convertible_v, std::flat_multimap>); } { using C = test_less; using A1 = test_allocator; using A2 = test_allocator; auto m = std::flat_multimap, std::vector>(C(4), A1(5)); assert(m.empty()); assert(m.begin() == m.end()); assert(m.key_comp() == C(4)); assert(m.keys().get_allocator() == A1(5)); assert(m.values().get_allocator() == A2(5)); } { // explicit(false) using C = test_less; using A1 = test_allocator; using A2 = test_allocator; std::flat_multimap, std::deque> m = {C(4), A1(5)}; assert(m.empty()); assert(m.begin() == m.end()); assert(m.key_comp() == C(4)); assert(m.keys().get_allocator() == A1(5)); assert(m.values().get_allocator() == A2(5)); } { // If an allocator is given, it must be usable by both containers. using A = test_allocator; using M = std::flat_multimap, std::vector, std::vector>; static_assert(std::is_constructible_v>); static_assert(!std::is_constructible_v, std::allocator>); static_assert(!std::is_constructible_v, A>); } return 0; }