//===----------------------------------------------------------------------===// // // 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 // SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES // //===----------------------------------------------------------------------===// // // ranges::less #include #include #include #include "compare_types.h" #include "MoveOnly.h" #include "pointer_comparison_test_helper.h" #include "test_macros.h" struct NotTotallyOrdered { __host__ __device__ friend bool operator<(const NotTotallyOrdered&, const NotTotallyOrdered&); }; static_assert(!cuda::std::is_invocable_v); #if !TEST_COMPILER(MSVC) || TEST_STD_VER > 2017 // MSVC considers implicit conversions in C++17 static_assert(!cuda::std::is_invocable_v); #endif // !TEST_COMPILER(MSVC) || TEST_STD_VER > 2017 static_assert(cuda::std::is_invocable_v); #if TEST_STD_VER > 2017 static_assert(requires { typename cuda::std::ranges::less::is_transparent; }); #else template inline constexpr bool is_transparent = false; template inline constexpr bool is_transparent> = true; static_assert(is_transparent); #endif __host__ __device__ constexpr bool test() { auto fn = cuda::std::ranges::less(); assert(fn(MoveOnly(41), MoveOnly(42))); ForwardingTestObject a{}; ForwardingTestObject b{}; assert(!fn(a, b)); assert(fn(cuda::std::move(a), cuda::std::move(b))); assert(fn(1, 2)); assert(!fn(2, 2)); assert(!fn(2, 1)); assert(!fn(2, 1L)); return true; } int main(int, char**) { test(); static_assert(test()); // test total ordering of int* for less and less. do_pointer_comparison_test(cuda::std::ranges::less()); return 0; }