33 requires std::is_scalar_v<T>
36 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const noexcept
42 template <is_express_layout_desire T>
45 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const noexcept
53 requires is_nullable_like<T>
56 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const noexcept
60 if (!a.has_value() && !b.has_value())
65 else if (!a.has_value() || !b.has_value())
79 requires tuple_like<T>
82 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const
84 constexpr std::size_t N = std::tuple_size_v<T>;
88 constexpr std::size_t index =
decltype(i)::value;
89 using tuple_element_type = std::decay_t<std::tuple_element_t<
decltype(i)::value, T>>;
91 const auto& a_val = std::get<index>(a);
92 const auto& b_val = std::get<index>(b);
102 requires(std::ranges::input_range<T> && !tuple_like<T>)
105 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const
107 return std::ranges::equal(a, b,
nested_eq<std::ranges::range_value_t<T>>{});
113 requires variant_like<T>
116 [[nodiscard]]
constexpr bool operator()(
const T& a,
const T& b)
const
118 if (a.index() != b.index())
123 [&](
const auto& a_val)
125 using value_type = std::decay_t<
decltype(a_val)>;
126 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