// // Copyright (c) 2019-2025 Ruben Perez Hidalgo (rubenperez038 at gmail dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef BOOST_MYSQL_DETAIL_INTERMEDIATE_HANDLER_HPP #define BOOST_MYSQL_DETAIL_INTERMEDIATE_HANDLER_HPP #include #include namespace boost { namespace mysql { namespace detail { // An intermediate handler that propagates associated characteristics. // HandlerFn must be a function void(Handler&&, args...) that calls the handler template struct intermediate_handler { HandlerFn fn; FinalHandler handler; template void operator()(Args&&... args) { fn(std::move(handler), std::forward(args)...); } }; template intermediate_handler::type, typename std::decay::type> make_intermediate_handler( HandlerFn&& fn, FinalHandler&& handler ) { return {std::forward(fn), std::forward(handler)}; } } // namespace detail } // namespace mysql namespace asio { template < template class Associator, class HandlerFn, class FinalHandler, typename DefaultCandidate> struct associator, DefaultCandidate> : Associator { static typename Associator::type get( const mysql::detail::intermediate_handler& h ) noexcept { return Associator::get(h.handler); } static auto get( const mysql::detail::intermediate_handler& h, const DefaultCandidate& c ) noexcept -> decltype(Associator::get(h.handler, c)) { return Associator::get(h.handler, c); } }; } // namespace asio } // namespace boost #endif