18#ifndef TRINITY_ADVSTD_H
19#define TRINITY_ADVSTD_H
23#ifdef __cpp_lib_bit_cast
34[[nodiscard]]
constexpr bool is_eq(std::partial_ordering cmp)
noexcept {
return cmp == 0; }
35[[nodiscard]]
constexpr bool is_neq(std::partial_ordering cmp)
noexcept {
return cmp != 0; }
37#ifdef __cpp_lib_bit_cast
41template <
typename To,
typename From,
42 std::enable_if_t<std::conjunction_v<
43 std::bool_constant<
sizeof(To) ==
sizeof(From)>,
44 std::is_trivially_copyable<To>,
45 std::is_trivially_copyable<From>>,
int> = 0>
46[[nodiscard]]
constexpr To
bit_cast(From
const& from)
noexcept
49 std::memcpy(&to, &from,
sizeof(To));
56#ifdef __cpp_lib_forward_like
60using std::forward_like;
65template <
class T,
class U>
66[[nodiscard]]
constexpr decltype(
auto)
forward_like(U&& value)
noexcept
68 using ValueU = std::remove_reference_t<U>;
69 using ValueConstU = std::conditional_t<std::is_const_v<std::remove_reference_t<T>>, ValueU
const, ValueU>;
70 return static_cast<std::conditional_t<std::is_rvalue_reference_v<T&&>, ValueConstU&&, ValueConstU&
>>(value);
77#ifndef __cpp_lib_ranges_contains
84#ifndef __cpp_lib_ranges_contains
87 template<std::input_iterator I, std::sentinel_for<I> S,
class T,
class Proj = std::
identity>
88 requires std::indirect_binary_predicate<std::ranges::equal_to, std::projected<I, Proj>, T
const*>
89 [[nodiscard]]
inline constexpr bool operator()(I first, S last, T
const& value, Proj proj = {})
const
91 return std::ranges::find(std::move(first), last, value, proj) != last;
94 template<std::ranges::input_range R,
class T,
class Proj = std::
identity>
95 requires std::indirect_binary_predicate<std::ranges::equal_to, std::projected<std::ranges::iterator_t<R>, Proj>, T
const*>
96 [[nodiscard]]
inline constexpr bool operator()(R&& r, T
const& value, Proj proj = {})
const
98 auto first = std::ranges::begin(r);
99 auto last = std::ranges::end(r);
100 return std::ranges::find(std::move(first), last, value, proj) != last;
104using std::ranges::contains;
struct advstd::ranges::Contains contains
constexpr bool is_eq(std::partial_ordering cmp) noexcept
constexpr decltype(auto) forward_like(U &&value) noexcept
constexpr bool is_neq(std::partial_ordering cmp) noexcept
constexpr To bit_cast(From const &from) noexcept
constexpr bool operator()(R &&r, T const &value, Proj proj={}) const
constexpr bool operator()(I first, S last, T const &value, Proj proj={}) const