mirror of
https://github.com/boostorg/beast.git
synced 2025-07-30 12:57:31 +02:00
Add detail::aligned_union and tidy up
Signed-off-by: Damian Jarek <damian.jarek93@gmail.com>
This commit is contained in:
committed by
Vinnie Falco
parent
fb0d82245f
commit
332c2fe0cb
@ -4,6 +4,7 @@ Version 146:
|
|||||||
* Faster ascii_tolower
|
* Faster ascii_tolower
|
||||||
* Documentation tidying
|
* Documentation tidying
|
||||||
* Fix typo in examples documentation
|
* Fix typo in examples documentation
|
||||||
|
* Add detail::aligned_union and tidy up
|
||||||
|
|
||||||
API Changes:
|
API Changes:
|
||||||
|
|
||||||
|
@ -22,25 +22,8 @@ namespace boost {
|
|||||||
namespace beast {
|
namespace beast {
|
||||||
namespace detail {
|
namespace detail {
|
||||||
|
|
||||||
//
|
|
||||||
// utilities
|
|
||||||
//
|
|
||||||
|
|
||||||
template<class... Ts>
|
|
||||||
struct make_void
|
|
||||||
{
|
|
||||||
using type = void;
|
|
||||||
};
|
|
||||||
|
|
||||||
template<class... Ts>
|
|
||||||
using void_t = typename make_void<Ts...>::type;
|
|
||||||
|
|
||||||
template<class T>
|
|
||||||
inline
|
|
||||||
void
|
|
||||||
accept_rv(T){}
|
|
||||||
|
|
||||||
template<class U>
|
template<class U>
|
||||||
|
inline
|
||||||
std::size_t constexpr
|
std::size_t constexpr
|
||||||
max_sizeof()
|
max_sizeof()
|
||||||
{
|
{
|
||||||
@ -48,6 +31,7 @@ max_sizeof()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class U0, class U1, class... Us>
|
template<class U0, class U1, class... Us>
|
||||||
|
inline
|
||||||
std::size_t constexpr
|
std::size_t constexpr
|
||||||
max_sizeof()
|
max_sizeof()
|
||||||
{
|
{
|
||||||
@ -57,6 +41,7 @@ max_sizeof()
|
|||||||
}
|
}
|
||||||
|
|
||||||
template<class U>
|
template<class U>
|
||||||
|
inline
|
||||||
std::size_t constexpr
|
std::size_t constexpr
|
||||||
max_alignof()
|
max_alignof()
|
||||||
{
|
{
|
||||||
@ -72,6 +57,36 @@ max_alignof()
|
|||||||
max_alignof<U0>() : max_alignof<U1, Us...>();
|
max_alignof<U0>() : max_alignof<U1, Us...>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// (since C++17)
|
||||||
|
template<class... Ts> struct make_void { using type = void; };
|
||||||
|
template<class... Ts> using void_t = typename make_void<Ts...>::type;
|
||||||
|
|
||||||
|
// (since C++11) missing from g++4.8
|
||||||
|
template<std::size_t Len, class... Ts>
|
||||||
|
struct aligned_union
|
||||||
|
{
|
||||||
|
static
|
||||||
|
std::size_t constexpr alignment_value =
|
||||||
|
max_alignof<Ts...>();
|
||||||
|
|
||||||
|
using type = typename std::aligned_storage<
|
||||||
|
(Len > max_sizeof<Ts...>()) ? Len : (max_sizeof<Ts...>()),
|
||||||
|
alignment_value>::type;
|
||||||
|
};
|
||||||
|
|
||||||
|
template<std::size_t Len, class... Ts>
|
||||||
|
using aligned_union_t =
|
||||||
|
typename aligned_union<Len, Ts...>::type;
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline
|
||||||
|
void
|
||||||
|
accept_rv(T){}
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
template<unsigned N, class T, class... Tn>
|
template<unsigned N, class T, class... Tn>
|
||||||
struct repeat_tuple_impl
|
struct repeat_tuple_impl
|
||||||
{
|
{
|
||||||
@ -98,6 +113,8 @@ struct repeat_tuple<0, T>
|
|||||||
using type = std::tuple<>;
|
using type = std::tuple<>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
template<class R, class C, class ...A>
|
template<class R, class C, class ...A>
|
||||||
auto
|
auto
|
||||||
is_invocable_test(C&& c, int, A&& ...a)
|
is_invocable_test(C&& c, int, A&& ...a)
|
||||||
@ -132,6 +149,8 @@ struct is_invocable<C, R(A...)>
|
|||||||
};
|
};
|
||||||
/** @} */
|
/** @} */
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
// for span
|
// for span
|
||||||
template<class T, class E, class = void>
|
template<class T, class E, class = void>
|
||||||
struct is_contiguous_container: std::false_type {};
|
struct is_contiguous_container: std::false_type {};
|
||||||
@ -154,6 +173,8 @@ struct is_contiguous_container<T, E, void_t<
|
|||||||
>::type>>: std::true_type
|
>::type>>: std::true_type
|
||||||
{};
|
{};
|
||||||
|
|
||||||
|
//------------------------------------------------------------------------------
|
||||||
|
|
||||||
template<class...>
|
template<class...>
|
||||||
struct unwidest_unsigned;
|
struct unwidest_unsigned;
|
||||||
|
|
||||||
|
@ -31,10 +31,7 @@ namespace detail {
|
|||||||
template<class... TN>
|
template<class... TN>
|
||||||
class variant
|
class variant
|
||||||
{
|
{
|
||||||
typename std::aligned_storage<
|
detail::aligned_union_t<1, TN...> buf_;
|
||||||
max_sizeof<TN...>(),
|
|
||||||
max_alignof<TN...>()
|
|
||||||
>::type buf_;
|
|
||||||
unsigned char i_ = 0;
|
unsigned char i_ = 0;
|
||||||
|
|
||||||
template<std::size_t I>
|
template<std::size_t I>
|
||||||
|
Reference in New Issue
Block a user