7#if !defined(ASYNC_MQTT_UTIL_STREAM_TRAITS_HPP)
8#define ASYNC_MQTT_UTIL_STREAM_TRAITS_HPP
13#include <boost/asio/buffer.hpp>
14#include <boost/asio/any_completion_handler.hpp>
15#include <boost/asio/any_io_executor.hpp>
17#include <async_mqtt/error.hpp>
21namespace as = boost::asio;
26std::false_type has_next_layer_impl(
void*);
29auto has_next_layer_impl(
decltype(
nullptr)) ->
30 decltype(std::declval<T&>().next_layer(), std::true_type{});
35using has_next_layer =
decltype(detail::has_next_layer_impl<T>(
nullptr));
40template<typename T, bool = has_next_layer<T>::value>
41struct lowest_layer_type_impl {
42 using type =
typename std::remove_reference<T>::type;
46struct lowest_layer_type_impl<T, true> {
47 using type =
typename lowest_layer_type_impl<
48 decltype(std::declval<T&>().next_layer())>::type;
54using lowest_layer_type =
typename detail::lowest_layer_type_impl<T>::type;
60get_lowest_layer_impl(T& t, std::false_type)
noexcept {
66get_lowest_layer_impl(T& t, std::true_type)
noexcept {
68 get_lowest_layer_impl(
70 has_next_layer<
typename std::decay<
decltype(t.next_layer())>::type>{}
78using executor_type =
decltype(std::declval<T>().get_executor());
81lowest_layer_type<T>& get_lowest_layer(T& t)
noexcept {
83 detail::get_lowest_layer_impl(
100template <
typename Layer>
105template <
typename Layer,
typename =
void>
106struct has_initialize : std::false_type {};
108template <
typename Layer>
109struct has_initialize<
112 decltype(layer_customize<Layer>::initialize(std::declval<Layer&>()))
114> : std::true_type {};
118template <
typename Layer,
typename =
void>
119struct has_async_read : std::false_type {};
121template <
typename Layer>
122struct has_async_read<
126 layer_customize<Layer>::async_read(
127 std::declval<Layer&>(),
128 std::declval<as::mutable_buffer const&>(),
129 std::declval<as::any_completion_handler<void(error_code const&, std::size_t)>>()
133> : std::true_type {};
137template <
typename Layer,
typename =
void>
138struct has_async_read_some : std::false_type {};
140template <
typename Layer>
141struct has_async_read_some<
145 layer_customize<Layer>::async_read_some(
146 std::declval<Layer&>(),
147 std::declval<as::mutable_buffer const&>(),
148 std::declval<as::any_completion_handler<void(error_code const&, std::size_t)>>()
152> : std::true_type {};
156template <
typename Layer,
typename =
void>
157struct has_async_write : std::false_type {};
159template <
typename Layer>
160struct has_async_write<
164 layer_customize<Layer>::async_write(
165 std::declval<Layer&>(),
166 std::declval<std::vector<as::const_buffer> const&>(),
167 std::declval<as::any_completion_handler<void(error_code const&, std::size_t)>>()
171> : std::true_type {};
175template <
typename Layer,
typename =
void>
176struct has_async_close : std::false_type {};
178template <
typename Layer>
179struct has_async_close<
183 layer_customize<Layer>::async_close(
184 std::declval<Layer&>(),
185 std::declval<as::any_completion_handler<void(error_code const&)>>()
189> : std::true_type {};
customization class template for underlying layer In order to adapt your layer to async_mqtt,...
Definition stream_traits.hpp:101