2 // Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
4 // Distributed under the Boost Software License, Version 1.0. (See accompanying
5 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7 // Official repository: https://github.com/boostorg/beast
10 #ifndef BOOST_BEAST_IMPL_HANDLER_PTR_HPP
11 #define BOOST_BEAST_IMPL_HANDLER_PTR_HPP
13 #include <boost/asio/associated_allocator.hpp>
14 #include <boost/assert.hpp>
20 template<class T, class Handler>
21 template<class DeducedHandler, class... Args>
23 handler_ptr<T, Handler>::P::
24 P(DeducedHandler&& h, Args&&... args)
26 , handler(std::forward<DeducedHandler>(h))
28 typename std::allocator_traits<
29 boost::asio::associated_allocator_t<Handler>>::
30 template rebind_alloc<T> alloc{
31 boost::asio::get_associated_allocator(handler)};
32 t = std::allocator_traits<decltype(alloc)>::allocate(alloc, 1);
36 std::forward<Args>(args)...};
40 std::allocator_traits<
41 decltype(alloc)>::deallocate(alloc, t, 1);
46 template<class T, class Handler>
47 handler_ptr<T, Handler>::
57 typename std::allocator_traits<
58 boost::asio::associated_allocator_t<Handler>>::
59 template rebind_alloc<T> alloc{
60 boost::asio::get_associated_allocator(
62 std::allocator_traits<
63 decltype(alloc)>::deallocate(alloc, p_->t, 1);
68 template<class T, class Handler>
69 handler_ptr<T, Handler>::
70 handler_ptr(handler_ptr&& other)
76 template<class T, class Handler>
77 handler_ptr<T, Handler>::
78 handler_ptr(handler_ptr const& other)
85 template<class T, class Handler>
86 template<class... Args>
87 handler_ptr<T, Handler>::
88 handler_ptr(Handler&& handler, Args&&... args)
89 : p_(new P{std::move(handler),
90 std::forward<Args>(args)...})
92 BOOST_STATIC_ASSERT(! std::is_array<T>::value);
95 template<class T, class Handler>
96 template<class... Args>
97 handler_ptr<T, Handler>::
98 handler_ptr(Handler const& handler, Args&&... args)
99 : p_(new P{handler, std::forward<Args>(args)...})
101 BOOST_STATIC_ASSERT(! std::is_array<T>::value);
104 template<class T, class Handler>
106 handler_ptr<T, Handler>::
113 typename std::allocator_traits<
114 boost::asio::associated_allocator_t<Handler>>::
115 template rebind_alloc<T> alloc{
116 boost::asio::get_associated_allocator(
118 std::allocator_traits<
119 decltype(alloc)>::deallocate(alloc, p_->t, 1);
121 return std::move(p_->handler);
124 template<class T, class Handler>
125 template<class... Args>
127 handler_ptr<T, Handler>::
128 invoke(Args&&... args)
133 typename std::allocator_traits<
134 boost::asio::associated_allocator_t<Handler>>::
135 template rebind_alloc<T> alloc{
136 boost::asio::get_associated_allocator(
138 std::allocator_traits<
139 decltype(alloc)>::deallocate(alloc, p_->t, 1);
141 p_->handler(std::forward<Args>(args)...);