// // Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco 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) // // Official repository: https://github.com/boostorg/beast // #ifndef BOOST_BEAST_DETAIL_GET_IO_CONTEXT_HPP #define BOOST_BEAST_DETAIL_GET_IO_CONTEXT_HPP #include #include #include #include #include #include namespace boost { namespace beast { namespace detail { //------------------------------------------------------------------------------ inline net::io_context* get_io_context(net::io_context& ioc) { return std::addressof(ioc); } inline net::io_context* get_io_context(net::io_context::executor_type const& ex) { return std::addressof(ex.context()); } inline net::io_context* get_io_context(net::strand< net::io_context::executor_type> const& ex) { return std::addressof( ex.get_inner_executor().context()); } template net::io_context* get_io_context(net::strand const& ex) { return get_io_context(ex.get_inner_executor()); } template< class T, class = typename std::enable_if< std::is_same::value>::type> net::io_context* get_io_context(T const& ex) { auto p = ex.template target(); if(! p) return nullptr; return std::addressof(p->context()); } inline net::io_context* get_io_context(...) { return nullptr; } //------------------------------------------------------------------------------ template net::io_context* get_io_context_impl(T& t, std::true_type) { return get_io_context( t.get_executor()); } template net::io_context* get_io_context_impl(T const&, std::false_type) { return nullptr; } // Returns the io_context*, or nullptr, for any object. template net::io_context* get_io_context(T& t) { return get_io_context_impl(t, has_get_executor{}); } } // detail } // beast } // boost #endif