mirror of
https://github.com/boostorg/beast.git
synced 2025-07-29 20:37:31 +02:00
Remove handler_pointer (API Change):
API Changes: handler_ptr has been removed. Users should use net::bind_handler and/or bind_front_handler instead. refs #1934
This commit is contained in:
@ -1,9 +1,13 @@
|
||||
* Remove handler_pointer (API Change)
|
||||
* Remove websocket::role_type (API Change)
|
||||
* Remove accept_ex and handshake_ex variants (API Change)
|
||||
* Rename to BOOST_BEAST_ALLOW_DEPRECATED (API Change)
|
||||
|
||||
API Changes:
|
||||
|
||||
* handler_ptr has been removed. Users should use net::bind_handler and/or
|
||||
bind_front_handler instead.
|
||||
|
||||
* websocket::role_type has been removed. Users should use beast::role_type instead.
|
||||
|
||||
* The following deprecated functions have been removed:
|
||||
|
@ -1,229 +0,0 @@
|
||||
//
|
||||
// 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_HANDLER_PTR_HPP
|
||||
#define BOOST_BEAST_HANDLER_PTR_HPP
|
||||
|
||||
#include <boost/beast/core/detail/config.hpp>
|
||||
#include <boost/beast/core/detail/allocator.hpp>
|
||||
#include <boost/assert.hpp>
|
||||
#include <boost/config/pragma_message.hpp>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
#ifndef BOOST_BEAST_DOXYGEN
|
||||
|
||||
BOOST_PRAGMA_MESSAGE("<boost/beast/core/handler_ptr.hpp> is DEPRECATED and will be removed in a future release.")
|
||||
|
||||
namespace boost {
|
||||
namespace beast {
|
||||
|
||||
/** A smart pointer container with associated completion handler.
|
||||
|
||||
This is a smart pointer that retains unique ownership of an
|
||||
object through a pointer. Memory is managed using the allocator
|
||||
associated with a completion handler stored in the object. The
|
||||
managed object is destroyed and its memory deallocated when one
|
||||
of the following occurs:
|
||||
|
||||
@li The function @ref invoke is called.
|
||||
|
||||
@li The function @ref release_handler is called.
|
||||
|
||||
@li The container is destroyed.
|
||||
|
||||
Objects of this type are used in the implementation of composed
|
||||
operations with states that are expensive or impossible to move.
|
||||
This container manages that non-trivial state on behalf of the
|
||||
composed operation.
|
||||
|
||||
@par Thread Safety
|
||||
@e Distinct @e objects: Safe.@n
|
||||
@e Shared @e objects: Unsafe.
|
||||
|
||||
@tparam T The type of the owned object. Must be noexcept destructible.
|
||||
|
||||
@tparam Handler The type of the completion handler.
|
||||
*/
|
||||
template<class T, class Handler>
|
||||
class handler_ptr
|
||||
{
|
||||
#ifndef BOOST_BEAST_ALLOW_DEPRECATED
|
||||
static_assert(sizeof(T) == 0,
|
||||
BOOST_BEAST_DEPRECATION_STRING);
|
||||
#endif
|
||||
|
||||
T* t_ = nullptr;
|
||||
union
|
||||
{
|
||||
Handler h_;
|
||||
};
|
||||
|
||||
void clear();
|
||||
|
||||
public:
|
||||
/// The type of element stored
|
||||
using element_type = T;
|
||||
|
||||
/// The type of handler stored
|
||||
using handler_type = Handler;
|
||||
|
||||
/// Default constructor (deleted).
|
||||
handler_ptr() = delete;
|
||||
|
||||
/// Copy assignment (deleted).
|
||||
handler_ptr& operator=(handler_ptr const&) = delete;
|
||||
|
||||
/// Move assignment (deleted).
|
||||
handler_ptr& operator=(handler_ptr &&) = delete;
|
||||
|
||||
/** Destructor
|
||||
|
||||
If `*this` owns an object the object is destroyed and
|
||||
the memory deallocated using the allocator associated
|
||||
with the handler.
|
||||
*/
|
||||
~handler_ptr();
|
||||
|
||||
/** Move constructor.
|
||||
|
||||
When this call returns, the moved-from container
|
||||
will have no owned object.
|
||||
*/
|
||||
handler_ptr(handler_ptr&& other);
|
||||
|
||||
/// Copy constructor (deleted).
|
||||
handler_ptr(handler_ptr const& other) = delete;
|
||||
|
||||
/** Constructor
|
||||
|
||||
This creates a new container with an owned object of
|
||||
type `T`. The allocator associated with the handler will
|
||||
be used to allocate memory for the owned object. The
|
||||
constructor for the owned object will be called with the
|
||||
following equivalent signature:
|
||||
|
||||
@code
|
||||
T::T(Handler const&, Args&&...)
|
||||
@endcode
|
||||
|
||||
@esafe
|
||||
Strong guarantee.
|
||||
|
||||
@param handler The handler to associate with the owned object.
|
||||
The implementation takes ownership of the handler by performing a decay-copy.
|
||||
|
||||
@param args Optional arguments forwarded to
|
||||
the owned object's constructor.
|
||||
*/
|
||||
template<class DeducedHandler, class... Args>
|
||||
explicit
|
||||
handler_ptr(DeducedHandler&& handler, Args&&... args);
|
||||
|
||||
/// Return a reference to the handler
|
||||
handler_type const&
|
||||
handler() const noexcept
|
||||
{
|
||||
return h_;
|
||||
}
|
||||
|
||||
/// Return a reference to the handler
|
||||
handler_type&
|
||||
handler() noexcept
|
||||
{
|
||||
return h_;
|
||||
}
|
||||
|
||||
/// Return `true` if `*this` owns an object
|
||||
bool
|
||||
has_value() const noexcept
|
||||
{
|
||||
return t_ != nullptr;
|
||||
}
|
||||
|
||||
/** Return a pointer to the owned object.
|
||||
|
||||
@par Preconditions:
|
||||
`has_value() == true`
|
||||
*/
|
||||
T*
|
||||
get() const
|
||||
{
|
||||
BOOST_ASSERT(t_);
|
||||
return t_;
|
||||
}
|
||||
|
||||
/** Return a reference to the owned object.
|
||||
|
||||
@par Preconditions:
|
||||
`has_value() == true`
|
||||
*/
|
||||
T&
|
||||
operator*() const
|
||||
{
|
||||
BOOST_ASSERT(t_);
|
||||
return *t_;
|
||||
}
|
||||
|
||||
/// Return a pointer to the owned object.
|
||||
T*
|
||||
operator->() const
|
||||
{
|
||||
BOOST_ASSERT(t_);
|
||||
return t_;
|
||||
}
|
||||
|
||||
/** Returns ownership of the handler
|
||||
|
||||
Before this function returns, the owned object is
|
||||
destroyed, satisfying the deallocation-before-invocation
|
||||
Asio guarantee.
|
||||
|
||||
@return The released handler.
|
||||
|
||||
@par Preconditions:
|
||||
`has_value() == true`
|
||||
|
||||
@par Postconditions:
|
||||
`has_value() == false`
|
||||
*/
|
||||
handler_type
|
||||
release_handler();
|
||||
|
||||
/** Invoke the handler in the owned object.
|
||||
|
||||
This function invokes the handler in the owned object
|
||||
with a forwarded argument list. Before the invocation,
|
||||
the owned object is destroyed, satisfying the
|
||||
deallocation-before-invocation Asio guarantee.
|
||||
|
||||
@par Preconditions:
|
||||
`has_value() == true`
|
||||
|
||||
@par Postconditions:
|
||||
`has_value() == false`
|
||||
|
||||
@note Care must be taken when the arguments are themselves
|
||||
stored in the owned object. Such arguments must first be
|
||||
moved to the stack or elsewhere, and then passed, or else
|
||||
undefined behavior will result.
|
||||
*/
|
||||
template<class... Args>
|
||||
void
|
||||
invoke(Args&&... args);
|
||||
};
|
||||
|
||||
} // beast
|
||||
} // boost
|
||||
|
||||
#include <boost/beast/core/impl/handler_ptr.hpp>
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
@ -1,132 +0,0 @@
|
||||
//
|
||||
// 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_IMPL_HANDLER_PTR_HPP
|
||||
#define BOOST_BEAST_IMPL_HANDLER_PTR_HPP
|
||||
|
||||
#include <boost/asio/associated_allocator.hpp>
|
||||
#include <boost/assert.hpp>
|
||||
#include <memory>
|
||||
|
||||
namespace boost {
|
||||
namespace beast {
|
||||
|
||||
template<class T, class Handler>
|
||||
void
|
||||
handler_ptr<T, Handler>::
|
||||
clear()
|
||||
{
|
||||
using A = typename detail::allocator_traits<
|
||||
net::associated_allocator_t<
|
||||
Handler>>::template rebind_alloc<T>;
|
||||
using alloc_traits =
|
||||
beast::detail::allocator_traits<A>;
|
||||
A alloc(
|
||||
net::get_associated_allocator(handler()));
|
||||
alloc_traits::destroy(alloc, t_);
|
||||
alloc_traits::deallocate(alloc, t_, 1);
|
||||
t_ = nullptr;
|
||||
}
|
||||
|
||||
template<class T, class Handler>
|
||||
handler_ptr<T, Handler>::
|
||||
~handler_ptr()
|
||||
{
|
||||
if(t_)
|
||||
{
|
||||
clear();
|
||||
h_.~Handler();
|
||||
}
|
||||
}
|
||||
|
||||
template<class T, class Handler>
|
||||
handler_ptr<T, Handler>::
|
||||
handler_ptr(handler_ptr&& other)
|
||||
: t_(other.t_)
|
||||
{
|
||||
if(other.t_)
|
||||
{
|
||||
::new(static_cast<void*>(std::addressof(h_)))
|
||||
Handler(std::move(other.h_));
|
||||
other.h_.~Handler();
|
||||
other.t_ = nullptr;
|
||||
}
|
||||
}
|
||||
|
||||
template<class T, class Handler>
|
||||
template<class DeducedHandler, class... Args>
|
||||
handler_ptr<T, Handler>::
|
||||
handler_ptr(DeducedHandler&& h, Args&&... args)
|
||||
{
|
||||
BOOST_STATIC_ASSERT(! std::is_array<T>::value);
|
||||
using A = typename detail::allocator_traits<
|
||||
net::associated_allocator_t<
|
||||
Handler>>::template rebind_alloc<T>;
|
||||
using alloc_traits =
|
||||
beast::detail::allocator_traits<A>;
|
||||
A alloc{net::get_associated_allocator(h)};
|
||||
bool destroy = false;
|
||||
auto deleter = [&alloc, &destroy](T* p)
|
||||
{
|
||||
if(destroy)
|
||||
alloc_traits::destroy(alloc, p);
|
||||
alloc_traits::deallocate(alloc, p, 1);
|
||||
};
|
||||
std::unique_ptr<T, decltype(deleter)> t{
|
||||
alloc_traits::allocate(alloc, 1), deleter};
|
||||
alloc_traits::construct(alloc, t.get(),
|
||||
static_cast<DeducedHandler const&>(h),
|
||||
std::forward<Args>(args)...);
|
||||
destroy = true;
|
||||
::new(static_cast<void*>(std::addressof(h_)))
|
||||
Handler(std::forward<DeducedHandler>(h));
|
||||
t_ = t.release();
|
||||
}
|
||||
|
||||
template<class T, class Handler>
|
||||
auto
|
||||
handler_ptr<T, Handler>::
|
||||
release_handler() ->
|
||||
handler_type
|
||||
{
|
||||
BOOST_ASSERT(t_);
|
||||
clear();
|
||||
auto deleter = [](Handler* h)
|
||||
{
|
||||
h->~Handler();
|
||||
};
|
||||
std::unique_ptr<
|
||||
Handler, decltype(deleter)> destroyer{
|
||||
std::addressof(h_), deleter};
|
||||
return std::move(h_);
|
||||
}
|
||||
|
||||
template<class T, class Handler>
|
||||
template<class... Args>
|
||||
void
|
||||
handler_ptr<T, Handler>::
|
||||
invoke(Args&&... args)
|
||||
{
|
||||
BOOST_ASSERT(t_);
|
||||
clear();
|
||||
auto deleter = [](Handler* h)
|
||||
{
|
||||
boost::ignore_unused(h); // fix #1119
|
||||
h->~Handler();
|
||||
};
|
||||
std::unique_ptr<
|
||||
Handler, decltype(deleter)> destroyer{
|
||||
std::addressof(h_), deleter};
|
||||
h_(std::forward<Args>(args)...);
|
||||
}
|
||||
|
||||
} // beast
|
||||
} // boost
|
||||
|
||||
#endif
|
Reference in New Issue
Block a user