//===----------------------------------------------------------------------===// // // 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 // // template // constexpr synth-three-way-result // operator<=>(const array& x, const array& y); #include #include #include "test_comparisons.h" // SFINAE constexpr std::size_t N{1}; // The container should fulfill `std::three_way_comparable` static_assert(std::three_way_comparable>); // Thanks to SFINAE, the following is not a compiler error but returns `false` struct NonComparable {}; static_assert(!std::three_way_comparable>); // Implementation detail of `test_sequence_container_array_spaceship` template constexpr void test_sequence_container_array_spaceship_with_type() { // Empty containers { std::array l1 = {}; std::array l2 = {}; assert(testOrder(l1, l2, Order::equivalent)); } // Identical contents { std::array l1{Elem{1}, Elem{1}}; std::array l2{Elem{1}, Elem{1}}; assert(testOrder(l1, l2, Order::equivalent)); } // Less, due to contained values { std::array l1{Elem{1}, Elem{1}}; std::array l2{Elem{1}, Elem{2}}; assert(testOrder(l1, l2, Order::less)); } // Greater, due to contained values { std::array l1{Elem{1}, Elem{3}}; std::array l2{Elem{1}, Elem{2}}; assert(testOrder(l1, l2, Order::greater)); } // Shorter list - unsupported - containers must be of equal lengths // Longer list - unsupported - containers must be of equal lengths // Unordered if constexpr (std::is_same_v) { std::array l1{Elem{1}, Elem{std::numeric_limits::min()}}; std::array l2{Elem{1}, Elem{2}}; assert(testOrder(l1, l2, Order::unordered)); } } // Tests the `operator<=>` on sequence containers `array` constexpr bool test_sequence_container_array_spaceship() { // Test different comparison categories test_sequence_container_array_spaceship_with_type(); test_sequence_container_array_spaceship_with_type(); test_sequence_container_array_spaceship_with_type(); test_sequence_container_array_spaceship_with_type(); // `LessAndEqComp` does not have `operator<=>`. Ordering is synthesized based on `operator<` test_sequence_container_array_spaceship_with_type(); return true; } int main(int, char**) { assert(test_sequence_container_array_spaceship()); static_assert(test_sequence_container_array_spaceship()); return 0; }