31 requires std::is_scalar_v<T>
34 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const noexcept
40 template <is_express_layout_desire T>
43 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const noexcept
51 requires is_nullable_like<T>
54 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const noexcept
58 if (!a.has_value() && !b.has_value())
63 else if (!a.has_value() || !b.has_value())
77 requires tuple_like<T>
80 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const
82 constexpr std::size_t N = std::tuple_size_v<T>;
86 constexpr std::size_t index =
decltype(i)::value;
87 using tuple_element_type = std::decay_t<std::tuple_element_t<
decltype(i)::value, T>>;
89 const auto& a_val = std::get<index>(a);
90 const auto& b_val = std::get<index>(b);
100 requires(std::ranges::input_range<T> && !tuple_like<T>)
103 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const
105 return std::ranges::equal(a, b,
nested_eq<std::ranges::range_value_t<T>>{});
111 requires variant_like<T>
114 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const
116 if (a.index() != b.index())
121 [&](
const auto& a_val)
123 using value_type = std::decay_t<
decltype(a_val)>;
124 const auto& b_val = std::get<value_type>(b);
bool exitable_for_each_index(F &&f)
constexpr bool operator()(const T &a, const T &b) const
constexpr bool operator()(const T &a, const T &b) const noexcept