// -*- 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 // //===----------------------------------------------------------------------===// #ifndef _LIBCUDACXX___FUNCTIONAL_REFERENCE_WRAPPER_H #define _LIBCUDACXX___FUNCTIONAL_REFERENCE_WRAPPER_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 _LIBCUDACXX_BEGIN_NAMESPACE_STD template class _CCCL_TYPE_VISIBILITY_DEFAULT reference_wrapper : public __weak_result_type<_Tp> { public: // types using type = _Tp; private: type* __f_; static _CCCL_API inline void __fun(_Tp&) noexcept; static void __fun(_Tp&&) = delete; public: template ::value, decltype(__fun(declval<_Up>()))>> _CCCL_API inline _CCCL_CONSTEXPR_CXX20 reference_wrapper(_Up&& __u) noexcept(noexcept(__fun(declval<_Up>()))) { type& __f = static_cast<_Up&&>(__u); __f_ = _CUDA_VSTD::addressof(__f); } // access _CCCL_API inline _CCCL_CONSTEXPR_CXX20 operator type&() const noexcept { return *__f_; } _CCCL_API inline _CCCL_CONSTEXPR_CXX20 type& get() const noexcept { return *__f_; } // invoke template _CCCL_API inline _CCCL_CONSTEXPR_CXX20 typename __invoke_of::type operator()(_ArgTypes&&... __args) const noexcept(_CCCL_TRAIT(is_nothrow_invocable, _Tp&, _ArgTypes...)) { return _CUDA_VSTD::__invoke(get(), _CUDA_VSTD::forward<_ArgTypes>(__args)...); } }; template _CCCL_HOST_DEVICE reference_wrapper(_Tp&) -> reference_wrapper<_Tp>; template _CCCL_API inline _CCCL_CONSTEXPR_CXX20 reference_wrapper<_Tp> ref(_Tp& __t) noexcept { return reference_wrapper<_Tp>(__t); } template _CCCL_API inline _CCCL_CONSTEXPR_CXX20 reference_wrapper<_Tp> ref(reference_wrapper<_Tp> __t) noexcept { return __t; } template _CCCL_API inline _CCCL_CONSTEXPR_CXX20 reference_wrapper cref(const _Tp& __t) noexcept { return reference_wrapper(__t); } template _CCCL_API inline _CCCL_CONSTEXPR_CXX20 reference_wrapper cref(reference_wrapper<_Tp> __t) noexcept { return __t; } template void ref(const _Tp&&) = delete; template void cref(const _Tp&&) = delete; _LIBCUDACXX_END_NAMESPACE_STD #include #endif // _LIBCUDACXX___FUNCTIONAL_REFERENCE_WRAPPER_H