18namespace stratax::core::comparison_detail {
35template<Array L, Array R,
typename Op>
47 const auto result_shape =
48 stratax::core::broadcast_detail::array_result_shape(lhs, rhs);
50 result_type result(result_shape);
52 for (std::size_t i = 0; i < result.size(); ++i)
54 const std::size_t lhs_index =
55 stratax::core::broadcast_detail::flat_operand_index(
60 const std::size_t rhs_index =
61 stratax::core::broadcast_detail::flat_operand_index(
67 op(lhs[lhs_index], rhs[rhs_index]));
80template<Array A, DType Scalar,
typename Op>
91 result_type result(lhs.shape());
93 auto out = result.begin();
95 for (
auto it = lhs.begin(); it != lhs.end(); ++it, ++out)
111template<DType Scalar, Array A,
typename Op>
122 result_type result(rhs.shape());
124 auto out = result.begin();
126 for (
auto it = rhs.begin(); it != rhs.end(); ++it, ++out)
142template<Array L, Array R>
145 if (lhs.shape() != rhs.shape())
150 auto lhs_it = lhs.begin();
151 auto rhs_it = rhs.begin();
153 for (; lhs_it != lhs.end(); ++lhs_it, ++rhs_it)
155 if (*lhs_it != *rhs_it)
172template<Array L, Array R>
173auto equal(
const L& lhs,
const R& rhs)
175 return stratax::core::comparison_detail::comparison_op(
176 lhs, rhs, std::equal_to<>{});
185template<Array L, Array R>
188 return stratax::core::comparison_detail::comparison_op(
189 lhs, rhs, std::not_equal_to<>{});
199template<Array L, Array R>
204auto less(
const L& lhs,
const R& rhs)
206 return stratax::core::comparison_detail::comparison_op(
207 lhs, rhs, std::less<>{});
217template<Array L, Array R>
224 return stratax::core::comparison_detail::comparison_op(
225 lhs, rhs, std::less_equal<>{});
235template<Array L, Array R>
242 return stratax::core::comparison_detail::comparison_op(
243 lhs, rhs, std::greater<>{});
253template<Array L, Array R>
260 return stratax::core::comparison_detail::comparison_op(
261 lhs, rhs, std::greater_equal<>{});
269template<Array A, DType Scalar>
270auto equal(
const A& lhs,
const Scalar& rhs)
272 return stratax::core::comparison_detail::comparison_scalar_op(
273 lhs, rhs, std::equal_to<>{});
281template<DType Scalar, Array A>
282auto equal(
const Scalar& lhs,
const A& rhs)
284 return stratax::core::comparison_detail::comparison_scalar_op(
285 lhs, rhs, std::equal_to<>{});
293template<Array A, DType Scalar>
296 return stratax::core::comparison_detail::comparison_scalar_op(
297 lhs, rhs, std::not_equal_to<>{});
305template<DType Scalar, Array A>
308 return stratax::core::comparison_detail::comparison_scalar_op(
309 lhs, rhs, std::not_equal_to<>{});
317template<Array A, Ordered Scalar>
319auto less(
const A& lhs,
const Scalar& rhs)
321 return stratax::core::comparison_detail::comparison_scalar_op(
322 lhs, rhs, std::less<>{});
330template<Ordered Scalar, Array A>
332auto less(
const Scalar& lhs,
const A& rhs)
334 return stratax::core::comparison_detail::comparison_scalar_op(
335 lhs, rhs, std::less<>{});
343template<Array A, Ordered Scalar>
347 return stratax::core::comparison_detail::comparison_scalar_op(
348 lhs, rhs, std::less_equal<>{});
356template<Ordered Scalar, Array A>
360 return stratax::core::comparison_detail::comparison_scalar_op(
361 lhs, rhs, std::less_equal<>{});
369template<Array A, Ordered Scalar>
373 return stratax::core::comparison_detail::comparison_scalar_op(
374 lhs, rhs, std::greater<>{});
382template<Ordered Scalar, Array A>
386 return stratax::core::comparison_detail::comparison_scalar_op(
387 lhs, rhs, std::greater<>{});
395template<Array A, Ordered Scalar>
399 return stratax::core::comparison_detail::comparison_scalar_op(
400 lhs, rhs, std::greater_equal<>{});
408template<Ordered Scalar, Array A>
412 return stratax::core::comparison_detail::comparison_scalar_op(
413 lhs, rhs, std::greater_equal<>{});
420template<Array L, Array R>
423 return equal(lhs, rhs);
430template<Array L, Array R>
440template<Array L, Array R>
445auto operator<(
const L& lhs,
const R& rhs)
447 return less(lhs, rhs);
454template<Array L, Array R>
459auto operator<=(
const L& lhs,
const R& rhs)
468template<Array L, Array R>
473auto operator>(
const L& lhs,
const R& rhs)
482template<Array L, Array R>
487auto operator>=(
const L& lhs,
const R& rhs)
496template<Array A, DType Scalar>
499 return equal(lhs, rhs);
506template<DType Scalar, Array A>
509 return equal(lhs, rhs);
516template<Array A, DType Scalar>
526template<DType Scalar, Array A>
536template<Array A, Ordered Scalar>
540 return less(lhs, rhs);
547template<Ordered Scalar, Array A>
551 return less(lhs, rhs);
558template<Array A, Ordered Scalar>
569template<Ordered Scalar, Array A>
580template<Array A, Ordered Scalar>
591template<Ordered Scalar, Array A>
602template<Array A, Ordered Scalar>
613template<Ordered Scalar, Array A>
Result-container rebinding and promotion for owning arrays.
typename PromoteArray< std::remove_cvref_t< L >, std::remove_cvref_t< R >, std::remove_cvref_t< T > >::type promote_array_t
Convenience alias for the promoted array container type.
typename RebindArray< std::remove_cvref_t< A >, std::remove_cvref_t< T > >::type rebind_array_t
Convenience alias for rebinding an array to a new value type.
Trailing-axis shape compatibility and element projection.
auto operator==(const L &lhs, const R &rhs)
Element-wise array equality shorthand for equal().
auto operator<(const L &lhs, const R &rhs)
Element-wise array less-than shorthand for less().
auto operator>=(const L &lhs, const R &rhs)
Element-wise array greater-than-or-equal shorthand for greater_equal().
auto greater(const L &lhs, const R &rhs)
Tests each broadcasted left element for strict ordering above the corresponding right element.
auto operator!=(const L &lhs, const R &rhs)
Element-wise array inequality shorthand for not_equal().
auto comparison_op(const L &lhs, const R &rhs, Op op)
Applies an element-wise comparison to two broadcast-compatible arrays.
auto equal(const L &lhs, const R &rhs)
Compares two arrays for element-wise equality with broadcasting.
auto greater_equal(const L &lhs, const R &rhs)
Tests each broadcasted left element for ordering above or equal to the corresponding right element.
auto operator<=(const L &lhs, const R &rhs)
Element-wise array less-than-or-equal shorthand for less_equal().
auto less_equal(const L &lhs, const R &rhs)
Tests each broadcasted left element for ordering below or equal to the corresponding right element.
auto less(const L &lhs, const R &rhs)
Tests each broadcasted left element for strict ordering below the corresponding right element.
bool array_equal(const L &lhs, const R &rhs)
Tests whether two arrays have identical shapes and element values.
auto comparison_scalar_op(const A &lhs, const Scalar &rhs, Op op)
Compares every array element with a scalar on the right.
auto not_equal(const L &lhs, const R &rhs)
Compares two arrays for element-wise inequality with broadcasting.
auto operator>(const L &lhs, const R &rhs)
Element-wise array greater-than shorthand for greater().
Dtype and array interface concepts.
Supported scalar dtype aliases.
Supported non-complex dtype, including bool; floating-point NaNs need not compare ordered.