codekingpro/portable-devtools
114k
1// -*- C++ -*-2//===----------------------------------------------------------------------===//3//4// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.5// See https://llvm.org/LICENSE.txt for license information.6// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception7// SPDX-FileCopyrightText: Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES.8//9//===----------------------------------------------------------------------===//10 11#ifndef _LIBCUDACXX___FUNCTIONAL_BIND_BACK_H12#define _LIBCUDACXX___FUNCTIONAL_BIND_BACK_H13 14#ifndef __cuda_std__15#include <__config>16#endif // __cuda_std__17 18#include "../__functional/invoke.h"19#include "../__functional/perfect_forward.h"20#include "../__fwd/get.h"21#include "../__tuple_dir/tuple_size.h"22#include "../__type_traits/decay.h"23#include "../__type_traits/enable_if.h"24#include "../__type_traits/is_constructible.h"25#include "../__type_traits/is_move_constructible.h"26#include "../__utility/forward.h"27#include "../__utility/integer_sequence.h"28 29#include "../tuple"30 31#if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC)32# pragma GCC system_header33#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG)34# pragma clang system_header35#elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC)36# pragma system_header37#endif // no system header38 39_LIBCUDACXX_BEGIN_NAMESPACE_STD40 41#if _LIBCUDACXX_STD_VER > 1442 43template <size_t _NBound, class = make_index_sequence<_NBound>>44struct __bind_back_op;45 46template <size_t _NBound, size_t ..._Ip>47struct __bind_back_op<_NBound, index_sequence<_Ip...>> {48 template <class _Fn, class _BoundArgs, class... _Args>49 _LIBCUDACXX_HIDE_FROM_ABI _LIBCUDACXX_INLINE_VISIBILITY50 constexpr auto operator()(_Fn&& __f, _BoundArgs&& __bound_args, _Args&&... __args) const51 noexcept(noexcept(_CUDA_VSTD::invoke(_CUDA_VSTD::forward<_Fn>(__f), _CUDA_VSTD::forward<_Args>(__args)..., _CUDA_VSTD::get<_Ip>(_CUDA_VSTD::forward<_BoundArgs>(__bound_args))...)))52 -> decltype( _CUDA_VSTD::invoke(_CUDA_VSTD::forward<_Fn>(__f), _CUDA_VSTD::forward<_Args>(__args)..., _CUDA_VSTD::get<_Ip>(_CUDA_VSTD::forward<_BoundArgs>(__bound_args))...))53 { return _CUDA_VSTD::invoke(_CUDA_VSTD::forward<_Fn>(__f), _CUDA_VSTD::forward<_Args>(__args)..., _CUDA_VSTD::get<_Ip>(_CUDA_VSTD::forward<_BoundArgs>(__bound_args))...); }54};55 56template <class _Fn, class _BoundArgs>57struct __bind_back_t : __perfect_forward<__bind_back_op<tuple_size_v<_BoundArgs>>, _Fn, _BoundArgs> {58 using __perfect_forward<__bind_back_op<tuple_size_v<_BoundArgs>>, _Fn, _BoundArgs>::__perfect_forward;59};60 61template <class _Fn, class ..._Args, class = enable_if_t<62 _And<63 is_constructible<decay_t<_Fn>, _Fn>,64 is_move_constructible<decay_t<_Fn>>,65 is_constructible<decay_t<_Args>, _Args>...,66 is_move_constructible<decay_t<_Args>>...67 >::value68>>69_LIBCUDACXX_HIDE_FROM_ABI _LIBCUDACXX_INLINE_VISIBILITY70constexpr auto __bind_back(_Fn&& __f, _Args&&... __args)71 noexcept(noexcept(__bind_back_t<decay_t<_Fn>, tuple<decay_t<_Args>...>>(_CUDA_VSTD::forward<_Fn>(__f), _CUDA_VSTD::forward_as_tuple(_CUDA_VSTD::forward<_Args>(__args)...))))72 -> decltype( __bind_back_t<decay_t<_Fn>, tuple<decay_t<_Args>...>>(_CUDA_VSTD::forward<_Fn>(__f), _CUDA_VSTD::forward_as_tuple(_CUDA_VSTD::forward<_Args>(__args)...)))73 { return __bind_back_t<decay_t<_Fn>, tuple<decay_t<_Args>...>>(_CUDA_VSTD::forward<_Fn>(__f), _CUDA_VSTD::forward_as_tuple(_CUDA_VSTD::forward<_Args>(__args)...)); }74 75#endif // _LIBCUDACXX_STD_VER > 1476 77_LIBCUDACXX_END_NAMESPACE_STD78 79#endif // _LIBCUDACXX___FUNCTIONAL_BIND_BACK_H80 