Path: blob/main/contrib/llvm-project/libcxx/include/__functional/perfect_forward.h
35260 views
// -*- C++ -*-1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//89#ifndef _LIBCPP___FUNCTIONAL_PERFECT_FORWARD_H10#define _LIBCPP___FUNCTIONAL_PERFECT_FORWARD_H1112#include <__config>13#include <__type_traits/enable_if.h>14#include <__type_traits/invoke.h>15#include <__type_traits/is_constructible.h>16#include <__utility/declval.h>17#include <__utility/forward.h>18#include <__utility/integer_sequence.h>19#include <__utility/move.h>20#include <tuple>2122#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)23# pragma GCC system_header24#endif2526_LIBCPP_PUSH_MACROS27#include <__undef_macros>2829_LIBCPP_BEGIN_NAMESPACE_STD3031#if _LIBCPP_STD_VER >= 173233template <class _Op, class _Indices, class... _BoundArgs>34struct __perfect_forward_impl;3536template <class _Op, size_t... _Idx, class... _BoundArgs>37struct __perfect_forward_impl<_Op, index_sequence<_Idx...>, _BoundArgs...> {38private:39tuple<_BoundArgs...> __bound_args_;4041public:42template <class... _Args, class = enable_if_t< is_constructible_v<tuple<_BoundArgs...>, _Args&&...> >>43_LIBCPP_HIDE_FROM_ABI explicit constexpr __perfect_forward_impl(_Args&&... __bound_args)44: __bound_args_(std::forward<_Args>(__bound_args)...) {}4546_LIBCPP_HIDE_FROM_ABI __perfect_forward_impl(__perfect_forward_impl const&) = default;47_LIBCPP_HIDE_FROM_ABI __perfect_forward_impl(__perfect_forward_impl&&) = default;4849_LIBCPP_HIDE_FROM_ABI __perfect_forward_impl& operator=(__perfect_forward_impl const&) = default;50_LIBCPP_HIDE_FROM_ABI __perfect_forward_impl& operator=(__perfect_forward_impl&&) = default;5152template <class... _Args, class = enable_if_t<is_invocable_v<_Op, _BoundArgs&..., _Args...>>>53_LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Args&&... __args) & noexcept(54noexcept(_Op()(std::get<_Idx>(__bound_args_)..., std::forward<_Args>(__args)...)))55-> decltype(_Op()(std::get<_Idx>(__bound_args_)..., std::forward<_Args>(__args)...)) {56return _Op()(std::get<_Idx>(__bound_args_)..., std::forward<_Args>(__args)...);57}5859template <class... _Args, class = enable_if_t<!is_invocable_v<_Op, _BoundArgs&..., _Args...>>>60auto operator()(_Args&&...) & = delete;6162template <class... _Args, class = enable_if_t<is_invocable_v<_Op, _BoundArgs const&..., _Args...>>>63_LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Args&&... __args) const& noexcept(64noexcept(_Op()(std::get<_Idx>(__bound_args_)..., std::forward<_Args>(__args)...)))65-> decltype(_Op()(std::get<_Idx>(__bound_args_)..., std::forward<_Args>(__args)...)) {66return _Op()(std::get<_Idx>(__bound_args_)..., std::forward<_Args>(__args)...);67}6869template <class... _Args, class = enable_if_t<!is_invocable_v<_Op, _BoundArgs const&..., _Args...>>>70auto operator()(_Args&&...) const& = delete;7172template <class... _Args, class = enable_if_t<is_invocable_v<_Op, _BoundArgs..., _Args...>>>73_LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Args&&... __args) && noexcept(74noexcept(_Op()(std::get<_Idx>(std::move(__bound_args_))..., std::forward<_Args>(__args)...)))75-> decltype(_Op()(std::get<_Idx>(std::move(__bound_args_))..., std::forward<_Args>(__args)...)) {76return _Op()(std::get<_Idx>(std::move(__bound_args_))..., std::forward<_Args>(__args)...);77}7879template <class... _Args, class = enable_if_t<!is_invocable_v<_Op, _BoundArgs..., _Args...>>>80auto operator()(_Args&&...) && = delete;8182template <class... _Args, class = enable_if_t<is_invocable_v<_Op, _BoundArgs const..., _Args...>>>83_LIBCPP_HIDE_FROM_ABI constexpr auto operator()(_Args&&... __args) const&& noexcept(84noexcept(_Op()(std::get<_Idx>(std::move(__bound_args_))..., std::forward<_Args>(__args)...)))85-> decltype(_Op()(std::get<_Idx>(std::move(__bound_args_))..., std::forward<_Args>(__args)...)) {86return _Op()(std::get<_Idx>(std::move(__bound_args_))..., std::forward<_Args>(__args)...);87}8889template <class... _Args, class = enable_if_t<!is_invocable_v<_Op, _BoundArgs const..., _Args...>>>90auto operator()(_Args&&...) const&& = delete;91};9293// __perfect_forward implements a perfect-forwarding call wrapper as explained in [func.require].94template <class _Op, class... _Args>95using __perfect_forward = __perfect_forward_impl<_Op, index_sequence_for<_Args...>, _Args...>;9697#endif // _LIBCPP_STD_VER >= 179899_LIBCPP_END_NAMESPACE_STD100101_LIBCPP_POP_MACROS102103#endif // _LIBCPP___FUNCTIONAL_PERFECT_FORWARD_H104105106