File indexing completed on 2025-09-15 08:42:54
0001
0002
0003
0004
0005
0006
0007
0008 #ifndef BOOST_MYSQL_DETAIL_INTERMEDIATE_HANDLER_HPP
0009 #define BOOST_MYSQL_DETAIL_INTERMEDIATE_HANDLER_HPP
0010
0011 #include <boost/asio/associator.hpp>
0012
0013 #include <utility>
0014
0015 namespace boost {
0016 namespace mysql {
0017 namespace detail {
0018
0019
0020
0021 template <class HandlerFn, class FinalHandler>
0022 struct intermediate_handler
0023 {
0024 HandlerFn fn;
0025 FinalHandler handler;
0026
0027 template <class... Args>
0028 void operator()(Args&&... args)
0029 {
0030 fn(std::move(handler), std::forward<Args>(args)...);
0031 }
0032 };
0033
0034 template <class HandlerFn, class FinalHandler>
0035 intermediate_handler<typename std::decay<HandlerFn>::type, typename std::decay<FinalHandler>::type> make_intermediate_handler(
0036 HandlerFn&& fn,
0037 FinalHandler&& handler
0038 )
0039 {
0040 return {std::forward<HandlerFn>(fn), std::forward<FinalHandler>(handler)};
0041 }
0042
0043 }
0044 }
0045
0046 namespace asio {
0047
0048 template <
0049 template <typename, typename>
0050 class Associator,
0051 class HandlerFn,
0052 class FinalHandler,
0053 typename DefaultCandidate>
0054 struct associator<Associator, mysql::detail::intermediate_handler<HandlerFn, FinalHandler>, DefaultCandidate>
0055 : Associator<FinalHandler, DefaultCandidate>
0056 {
0057 static typename Associator<FinalHandler, DefaultCandidate>::type get(
0058 const mysql::detail::intermediate_handler<HandlerFn, FinalHandler>& h
0059 ) noexcept
0060 {
0061 return Associator<FinalHandler, DefaultCandidate>::get(h.handler);
0062 }
0063
0064 static auto get(
0065 const mysql::detail::intermediate_handler<HandlerFn, FinalHandler>& h,
0066 const DefaultCandidate& c
0067 ) noexcept -> decltype(Associator<FinalHandler, DefaultCandidate>::get(h.handler, c))
0068 {
0069 return Associator<FinalHandler, DefaultCandidate>::get(h.handler, c);
0070 }
0071 };
0072
0073 }
0074
0075 }
0076
0077 #endif