// -*- C++ -*- //===----------------------------------------------------------------------===// // // 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) 2024 NVIDIA CORPORATION & AFFILIATES. // //===----------------------------------------------------------------------===// #ifndef _LIBCUDACXX___CMATH_TRAITS_H #define _LIBCUDACXX___CMATH_TRAITS_H #include #if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC) # pragma GCC system_header #elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG) # pragma clang system_header #elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC) # pragma system_header #endif // no system header #include #include #include #include #include #include #include #include #include #include #if !_CCCL_COMPILER(NVRTC) # include #endif // !_CCCL_COMPILER(NVRTC) #include _LIBCUDACXX_BEGIN_NAMESPACE_STD // isgreater template = 0> [[nodiscard]] _CCCL_DEVICE _CCCL_HIDE_FROM_ABI bool __device_isgreater(_A1 __x, _A1 __y) noexcept { if (_CUDA_VSTD::isnan(__x) || _CUDA_VSTD::isnan(__y)) { return false; } return __x > __y; } template = 0> [[nodiscard]] _CCCL_API inline bool isgreater(_A1 __x, _A2 __y) noexcept { using type = __promote_t<_A1, _A2>; NV_IF_ELSE_TARGET(NV_IS_HOST, (return ::isgreater((type) __x, (type) __y);), (return _CUDA_VSTD::__device_isgreater((type) __x, (type) __y);)) } // isgreaterequal template = 0> [[nodiscard]] _CCCL_DEVICE _CCCL_HIDE_FROM_ABI bool __device_isgreaterequal(_A1 __x, _A1 __y) noexcept { if (_CUDA_VSTD::isnan(__x) || _CUDA_VSTD::isnan(__y)) { return false; } return __x >= __y; } template = 0> [[nodiscard]] _CCCL_API inline bool isgreaterequal(_A1 __x, _A2 __y) noexcept { using type = __promote_t<_A1, _A2>; NV_IF_ELSE_TARGET(NV_IS_HOST, (return ::isgreaterequal((type) __x, (type) __y);), (return _CUDA_VSTD::__device_isgreaterequal((type) __x, (type) __y);)) } // isless template = 0> [[nodiscard]] _CCCL_DEVICE _CCCL_HIDE_FROM_ABI bool __device_isless(_A1 __x, _A1 __y) noexcept { if (_CUDA_VSTD::isnan(__x) || _CUDA_VSTD::isnan(__y)) { return false; } return __x < __y; } template = 0> [[nodiscard]] _CCCL_API inline bool isless(_A1 __x, _A2 __y) noexcept { using type = __promote_t<_A1, _A2>; NV_IF_ELSE_TARGET(NV_IS_HOST, (return ::isless((type) __x, (type) __y);), (return _CUDA_VSTD::__device_isless((type) __x, (type) __y);)) } // islessequal template = 0> [[nodiscard]] _CCCL_DEVICE _CCCL_HIDE_FROM_ABI bool __device_islessequal(_A1 __x, _A1 __y) noexcept { if (_CUDA_VSTD::isnan(__x) || _CUDA_VSTD::isnan(__y)) { return false; } return __x <= __y; } template = 0> [[nodiscard]] _CCCL_API inline bool islessequal(_A1 __x, _A2 __y) noexcept { using type = __promote_t<_A1, _A2>; NV_IF_ELSE_TARGET(NV_IS_HOST, (return ::islessequal((type) __x, (type) __y);), (return _CUDA_VSTD::__device_islessequal((type) __x, (type) __y);)) } // islessgreater template = 0> [[nodiscard]] _CCCL_DEVICE _CCCL_HIDE_FROM_ABI bool __device_islessgreater(_A1 __x, _A1 __y) noexcept { if (_CUDA_VSTD::isnan(__x) || _CUDA_VSTD::isnan(__y)) { return false; } return __x < __y || __x > __y; } template = 0> [[nodiscard]] _CCCL_API inline bool islessgreater(_A1 __x, _A2 __y) noexcept { using type = __promote_t<_A1, _A2>; NV_IF_ELSE_TARGET(NV_IS_HOST, (return ::islessgreater((type) __x, (type) __y);), (return _CUDA_VSTD::__device_islessgreater((type) __x, (type) __y);)) } // isunordered template = 0> [[nodiscard]] _CCCL_API inline bool isunordered(_A1 __x, _A2 __y) noexcept { using type = __promote_t<_A1, _A2>; return _CUDA_VSTD::isnan((type) __x) || _CUDA_VSTD::isnan((type) __y); } _LIBCUDACXX_END_NAMESPACE_STD #include #endif // _LIBCUDACXX___CMATH_TRAITS_H