mirror of
https://github.com/boostorg/beast.git
synced 2025-07-29 20:37:31 +02:00
Add variadic min/max
This commit is contained in:
@ -6,6 +6,7 @@ Version 100:
|
||||
* Rename test macros
|
||||
* Reorder define test macro params
|
||||
* vcxproj workaround for include symlinks
|
||||
* Add variadic min/max
|
||||
|
||||
WebSocket:
|
||||
|
||||
|
@ -180,6 +180,80 @@ struct is_contiguous_container<T, E, void_t<
|
||||
>::type>>: std::true_type
|
||||
{};
|
||||
|
||||
template<class...>
|
||||
struct unwidest_unsigned;
|
||||
|
||||
template<class U0>
|
||||
struct unwidest_unsigned<U0>
|
||||
{
|
||||
using type = U0;
|
||||
};
|
||||
|
||||
template<class U0, class... UN>
|
||||
struct unwidest_unsigned<U0, UN...>
|
||||
{
|
||||
BOOST_STATIC_ASSERT(std::is_unsigned<U0>::value);
|
||||
using type = typename std::conditional<
|
||||
(sizeof(U0) < sizeof(typename unwidest_unsigned<UN...>::type)),
|
||||
U0, typename unwidest_unsigned<UN...>::type>::type;
|
||||
};
|
||||
|
||||
template<class...>
|
||||
struct widest_unsigned;
|
||||
|
||||
template<class U0>
|
||||
struct widest_unsigned<U0>
|
||||
{
|
||||
using type = U0;
|
||||
};
|
||||
|
||||
template<class U0, class... UN>
|
||||
struct widest_unsigned<U0, UN...>
|
||||
{
|
||||
BOOST_STATIC_ASSERT(std::is_unsigned<U0>::value);
|
||||
using type = typename std::conditional<
|
||||
(sizeof(U0) > sizeof(typename widest_unsigned<UN...>::type)),
|
||||
U0, typename widest_unsigned<UN...>::type>::type;
|
||||
};
|
||||
|
||||
template<class U>
|
||||
inline
|
||||
constexpr
|
||||
U
|
||||
min_all(U u)
|
||||
{
|
||||
BOOST_STATIC_ASSERT(std::is_unsigned<U>::value);
|
||||
return u;
|
||||
}
|
||||
|
||||
template<class U0, class U1, class... UN>
|
||||
inline
|
||||
constexpr
|
||||
typename unwidest_unsigned<U0, U1, UN...>::type
|
||||
min_all(U0 u0, U1 u1, UN... un)
|
||||
{
|
||||
return u0 < u1? min_all(u0, un...) : min_all(u1, un...);
|
||||
}
|
||||
|
||||
template<class U>
|
||||
inline
|
||||
constexpr
|
||||
U
|
||||
max_all(U u)
|
||||
{
|
||||
BOOST_STATIC_ASSERT(std::is_unsigned<U>::value);
|
||||
return u;
|
||||
}
|
||||
|
||||
template<class U0, class U1, class... UN>
|
||||
inline
|
||||
constexpr
|
||||
typename widest_unsigned<U0, U1, UN...>::type
|
||||
max_all(U0 u0, U1 u1, UN... un)
|
||||
{
|
||||
return u0 > u1? max_all(u0, un...) : max_all(u1, un...);
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
|
@ -94,6 +94,29 @@ BOOST_STATIC_ASSERT(std::is_same<get_lowest_layer<F4<F2>>::type, F2>::value);
|
||||
BOOST_STATIC_ASSERT(std::is_same<get_lowest_layer<F4<F3<F1>>>::type, F1>::value);
|
||||
BOOST_STATIC_ASSERT(std::is_same<get_lowest_layer<F4<F3<F2>>>::type, F2>::value);
|
||||
|
||||
//
|
||||
// min_all, max_all
|
||||
//
|
||||
|
||||
BOOST_STATIC_ASSERT(std::is_same<std::size_t,
|
||||
widest_unsigned<unsigned short, std::size_t>::type>::value);
|
||||
BOOST_STATIC_ASSERT(std::is_same<std::uint64_t,
|
||||
widest_unsigned<unsigned short, std::uint32_t, std::uint64_t>::type>::value);
|
||||
BOOST_STATIC_ASSERT(! std::is_same<std::uint64_t,
|
||||
widest_unsigned<unsigned short, std::uint32_t>::type>::value);
|
||||
BOOST_STATIC_ASSERT(std::is_same<unsigned short,
|
||||
unwidest_unsigned<unsigned short, std::size_t>::type>::value);
|
||||
BOOST_STATIC_ASSERT(std::is_same<unsigned short,
|
||||
unwidest_unsigned<unsigned short, std::uint32_t, std::uint64_t>::type>::value);
|
||||
BOOST_STATIC_ASSERT(! std::is_same<std::uint32_t,
|
||||
unwidest_unsigned<unsigned short, std::uint32_t>::type>::value);
|
||||
BOOST_STATIC_ASSERT(max_all(1u) == 1);
|
||||
BOOST_STATIC_ASSERT(max_all(1u, 2u) == 2);
|
||||
BOOST_STATIC_ASSERT(max_all(1u, 2u, static_cast<std::uint64_t>(3)) == 3);
|
||||
BOOST_STATIC_ASSERT(min_all(1u) == 1);
|
||||
BOOST_STATIC_ASSERT(min_all(1u, 2u) == 1);
|
||||
BOOST_STATIC_ASSERT(min_all(1u, 2u, static_cast<std::uint64_t>(3)) == 1);
|
||||
|
||||
} // (anonymous)
|
||||
|
||||
} // detail
|
||||
|
Reference in New Issue
Block a user