5#include <stratax/core/dtypes/Concepts.hpp>
6#include <stratax/core/ArrayTraits.hpp>
7#include <stratax/core/dtypes/Types.hpp>
8#include <stratax/ops/Broadcasting.hpp>
10namespace stratax::core::comparison_detail {
27template<Array L, Array R,
typename Op>
34 stratax::core::promote_array_t<
37 stratax::dtype::bool_>;
39 const auto result_shape =
40 broadcasted_shape(lhs.shape(), rhs.shape());
42 result_type result(result_shape);
44 for (std::size_t i = 0; i < result.size(); ++i)
46 const std::size_t lhs_index =
47 stratax::core::broadcast_detail::flat_operand_index(
52 const std::size_t rhs_index =
53 stratax::core::broadcast_detail::flat_operand_index(
58 result[i] =
static_cast<stratax::dtype::bool_
>(
59 op(lhs[lhs_index], rhs[rhs_index]));
72template<Array A, DType Scalar,
typename Op>
73auto comparison_scalar_op(
79 stratax::core::rebind_array_t<
81 stratax::dtype::bool_>;
83 result_type result(lhs.shape());
85 auto out = result.begin();
87 for (
auto it = lhs.begin(); it != lhs.end(); ++it, ++out)
89 *out =
static_cast<stratax::dtype::bool_
>(
103template<DType Scalar, Array A,
typename Op>
104auto comparison_scalar_op(
110 stratax::core::rebind_array_t<
112 stratax::dtype::bool_>;
114 result_type result(rhs.shape());
116 auto out = result.begin();
118 for (
auto it = rhs.begin(); it != rhs.end(); ++it, ++out)
120 *out =
static_cast<stratax::dtype::bool_
>(
134template<Array L, Array R>
135[[nodiscard]]
bool array_equal(
const L& lhs,
const R& rhs)
137 if (lhs.shape() != rhs.shape())
142 auto lhs_it = lhs.begin();
143 auto rhs_it = rhs.begin();
145 for (; lhs_it != lhs.end(); ++lhs_it, ++rhs_it)
147 if (*lhs_it != *rhs_it)
164template<Array L, Array R>
165auto equal(
const L& lhs,
const R& rhs)
167 return stratax::core::comparison_detail::comparison_op(
168 lhs, rhs, std::equal_to<>{});
177template<Array L, Array R>
178auto not_equal(
const L& lhs,
const R& rhs)
180 return stratax::core::comparison_detail::comparison_op(
181 lhs, rhs, std::not_equal_to<>{});
191template<Array L, Array R>
196auto less(
const L& lhs,
const R& rhs)
198 return stratax::core::comparison_detail::comparison_op(
199 lhs, rhs, std::less<>{});
209template<Array L, Array R>
214auto less_equal(
const L& lhs,
const R& rhs)
216 return stratax::core::comparison_detail::comparison_op(
217 lhs, rhs, std::less_equal<>{});
227template<Array L, Array R>
232auto greater(
const L& lhs,
const R& rhs)
234 return stratax::core::comparison_detail::comparison_op(
235 lhs, rhs, std::greater<>{});
245template<Array L, Array R>
250auto greater_equal(
const L& lhs,
const R& rhs)
252 return stratax::core::comparison_detail::comparison_op(
253 lhs, rhs, std::greater_equal<>{});
261template<Array A, DType Scalar>
262auto equal(
const A& lhs,
const Scalar& rhs)
264 return stratax::core::comparison_detail::comparison_scalar_op(
265 lhs, rhs, std::equal_to<>{});
273template<DType Scalar, Array A>
274auto equal(
const Scalar& lhs,
const A& rhs)
276 return stratax::core::comparison_detail::comparison_scalar_op(
277 lhs, rhs, std::equal_to<>{});
285template<Array A, DType Scalar>
286auto not_equal(
const A& lhs,
const Scalar& rhs)
288 return stratax::core::comparison_detail::comparison_scalar_op(
289 lhs, rhs, std::not_equal_to<>{});
297template<DType Scalar, Array A>
298auto not_equal(
const Scalar& lhs,
const A& rhs)
300 return stratax::core::comparison_detail::comparison_scalar_op(
301 lhs, rhs, std::not_equal_to<>{});
309template<Array A, Ordered Scalar>
311auto less(
const A& lhs,
const Scalar& rhs)
313 return stratax::core::comparison_detail::comparison_scalar_op(
314 lhs, rhs, std::less<>{});
322template<Ordered Scalar, Array A>
324auto less(
const Scalar& lhs,
const A& rhs)
326 return stratax::core::comparison_detail::comparison_scalar_op(
327 lhs, rhs, std::less<>{});
335template<Array A, Ordered Scalar>
337auto less_equal(
const A& lhs,
const Scalar& rhs)
339 return stratax::core::comparison_detail::comparison_scalar_op(
340 lhs, rhs, std::less_equal<>{});
348template<Ordered Scalar, Array A>
350auto less_equal(
const Scalar& lhs,
const A& rhs)
352 return stratax::core::comparison_detail::comparison_scalar_op(
353 lhs, rhs, std::less_equal<>{});
361template<Array A, Ordered Scalar>
363auto greater(
const A& lhs,
const Scalar& rhs)
365 return stratax::core::comparison_detail::comparison_scalar_op(
366 lhs, rhs, std::greater<>{});
374template<Ordered Scalar, Array A>
376auto greater(
const Scalar& lhs,
const A& rhs)
378 return stratax::core::comparison_detail::comparison_scalar_op(
379 lhs, rhs, std::greater<>{});
387template<Array A, Ordered Scalar>
389auto greater_equal(
const A& lhs,
const Scalar& rhs)
391 return stratax::core::comparison_detail::comparison_scalar_op(
392 lhs, rhs, std::greater_equal<>{});
400template<Ordered Scalar, Array A>
402auto greater_equal(
const Scalar& lhs,
const A& rhs)
404 return stratax::core::comparison_detail::comparison_scalar_op(
405 lhs, rhs, std::greater_equal<>{});
412template<Array L, Array R>
413auto operator==(
const L& lhs,
const R& rhs)
415 return equal(lhs, rhs);
422template<Array L, Array R>
423auto operator!=(
const L& lhs,
const R& rhs)
425 return not_equal(lhs, rhs);
432template<Array L, Array R>
437auto operator<(
const L& lhs,
const R& rhs)
439 return less(lhs, rhs);
446template<Array L, Array R>
451auto operator<=(
const L& lhs,
const R& rhs)
453 return less_equal(lhs, rhs);
460template<Array L, Array R>
465auto operator>(
const L& lhs,
const R& rhs)
467 return greater(lhs, rhs);
474template<Array L, Array R>
479auto operator>=(
const L& lhs,
const R& rhs)
481 return greater_equal(lhs, rhs);
488template<Array A, DType Scalar>
489auto operator==(
const A& lhs,
const Scalar& rhs)
491 return equal(lhs, rhs);
498template<DType Scalar, Array A>
499auto operator==(
const Scalar& lhs,
const A& rhs)
501 return equal(lhs, rhs);
508template<Array A, DType Scalar>
509auto operator!=(
const A& lhs,
const Scalar& rhs)
511 return not_equal(lhs, rhs);
518template<DType Scalar, Array A>
519auto operator!=(
const Scalar& lhs,
const A& rhs)
521 return not_equal(lhs, rhs);
528template<Array A, Ordered Scalar>
530auto operator<(
const A& lhs,
const Scalar& rhs)
532 return less(lhs, rhs);
539template<Ordered Scalar, Array A>
541auto operator<(
const Scalar& lhs,
const A& rhs)
543 return less(lhs, rhs);
550template<Array A, Ordered Scalar>
552auto operator<=(
const A& lhs,
const Scalar& rhs)
554 return less_equal(lhs, rhs);
561template<Ordered Scalar, Array A>
563auto operator<=(
const Scalar& lhs,
const A& rhs)
565 return less_equal(lhs, rhs);
572template<Array A, Ordered Scalar>
574auto operator>(
const A& lhs,
const Scalar& rhs)
576 return greater(lhs, rhs);
583template<Ordered Scalar, Array A>
585auto operator>(
const Scalar& lhs,
const A& rhs)
587 return greater(lhs, rhs);
594template<Array A, Ordered Scalar>
596auto operator>=(
const A& lhs,
const Scalar& rhs)
598 return greater_equal(lhs, rhs);
605template<Ordered Scalar, Array A>
607auto operator>=(
const Scalar& lhs,
const A& rhs)
609 return greater_equal(lhs, rhs);