//===----------------------------------------------------------------------===// // // 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. // //===----------------------------------------------------------------------===// #ifndef _LIBCUDACXX___CONCEPTS_INVOCABLE_H #define _LIBCUDACXX___CONCEPTS_INVOCABLE_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 _LIBCUDACXX_BEGIN_NAMESPACE_STD #if !defined(_CCCL_NO_CONCEPTS) // [concept.invocable] template concept invocable = requires(_Fn&& __fn, _Args&&... __args) { _CUDA_VSTD::__invoke(_CUDA_VSTD::forward<_Fn>(__fn), _CUDA_VSTD::forward<_Args>(__args)...); // not required to be // equality preserving }; // [concept.regular.invocable] template concept regular_invocable = invocable<_Fn, _Args...>; template concept __invoke_constructible = requires(_Fun&& __fun, _Args&&... __args) { static_cast>>( _CUDA_VSTD::invoke(_CUDA_VSTD::forward<_Fun>(__fun), _CUDA_VSTD::forward<_Args>(__args)...)); }; #elif !defined(_CCCL_NO_VARIABLE_TEMPLATES) // ^^^ !_CCCL_NO_CONCEPTS ^^^ template _CCCL_CONCEPT_FRAGMENT(_Invocable_, requires(_Fn&& __fn, _Args&&... __args)( (_CUDA_VSTD::invoke(_CUDA_VSTD::forward<_Fn>(__fn), _CUDA_VSTD::forward<_Args>(__args)...)))); template _CCCL_CONCEPT invocable = _CCCL_FRAGMENT(_Invocable_, _Fn, _Args...); template _CCCL_CONCEPT regular_invocable = invocable<_Fn, _Args...>; template _CCCL_CONCEPT_FRAGMENT( __invoke_constructible_, requires(_Fun&& __fun, _Args&&... __args)((static_cast>>( _CUDA_VSTD::invoke(_CUDA_VSTD::forward<_Fun>(__fun), _CUDA_VSTD::forward<_Args>(__args)...))))); template _CCCL_CONCEPT __invoke_constructible = _CCCL_FRAGMENT(__invoke_constructible_, _Fun, _Args...); #endif // ^^^ !_CCCL_NO_VARIABLE_TEMPLATES _LIBCUDACXX_END_NAMESPACE_STD #endif // _LIBCUDACXX___CONCEPTS_INVOCABLE_H