#ifndef BOOST_COMPAT_BIND_FRONT_HPP_INCLUDED #define BOOST_COMPAT_BIND_FRONT_HPP_INCLUDED // Copyright 2024 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include #include #include #include #include namespace boost { namespace compat { namespace detail { #if BOOST_WORKAROUND(BOOST_MSVC, < 1910) # pragma warning(push) # pragma warning(disable: 4100) // 'a': unreferenced formal parameter #endif template static constexpr auto invoke_bind_front_( F&& f, A&& a, index_sequence, B&&... b ) BOOST_COMPAT_RETURNS( compat::invoke( std::forward(f), std::get( std::forward(a) )..., std::forward(b)... ) ) #if BOOST_WORKAROUND(BOOST_MSVC, < 1910) # pragma warning(pop) #endif template class bind_front_ { private: F f_; std::tuple a_; public: template constexpr bind_front_( F2&& f2, A2&&... a2 ): f_( std::forward(f2) ), a_( std::forward(a2)... ) {} public: template BOOST_CXX14_CONSTEXPR auto operator()( B&&... b ) & BOOST_COMPAT_RETURNS( detail::invoke_bind_front_( f_, a_, make_index_sequence(), std::forward(b)... ) ) template constexpr auto operator()( B&&... b ) const & BOOST_COMPAT_RETURNS( detail::invoke_bind_front_( f_, a_, make_index_sequence(), std::forward(b)... ) ) template BOOST_CXX14_CONSTEXPR auto operator()( B&&... b ) && BOOST_COMPAT_RETURNS( detail::invoke_bind_front_( std::move(f_), std::move(a_), make_index_sequence(), std::forward(b)... ) ) template constexpr auto operator()( B&&... b ) const && BOOST_COMPAT_RETURNS( detail::invoke_bind_front_( std::move(f_), std::move(a_), make_index_sequence(), std::forward(b)... ) ) }; } // namespace detail template constexpr auto bind_front( F&& f, A&&... a ) -> detail::bind_front_< decay_t, decay_t... > { return { std::forward(f), std::forward(a)... }; } } // namespace compat } // namespace boost #endif // BOOST_COMPAT_BIND_FRONT_HPP_INCLUDED