7#include <dr/concepts/concepts.hpp>
8#include <dr/mp/algorithms/reduce.hpp>
9#include <dr/mp/algorithms/transform.hpp>
10#include <dr/mp/views/zip.hpp>
12namespace dr::mp::_detail {
13template <dr::distributed_range R1, dr::distributed_range R2>
14 requires std::equality_comparable_with<rng::range_value_t<R1>,
15 rng::range_value_t<R2>>
16bool equal(std::size_t root,
bool root_provided, R1 &&r1, R2 &&r2) {
18 if (rng::distance(r1) != rng::distance(r2)) {
24 auto compare = [](
auto &&elems) {
25 return elems.first == elems.second ? 1 : 0;
28 auto zipped_views = views::zip(r1, r2);
29 auto compared = dr::mp::views::transform(zipped_views, compare);
31 auto min = [](
double x,
double y) {
return std::min(x, y); };
33 auto result = mp::reduce(root, compared, 1, min);
36 auto result = mp::reduce(compared, 1, min);
43template <dr::distributed_range R1, dr::distributed_range R2>
44 requires std::equality_comparable_with<rng::range_value_t<R1>,
45 rng::range_value_t<R2>>
46bool equal(std::size_t root, R1 &&r1, R2 &&r2) {
47 return _detail::equal(root,
true, r1, r2);
50template <dr::distributed_range R1, dr::distributed_range R2>
51 requires std::equality_comparable_with<rng::range_value_t<R1>,
52 rng::range_value_t<R2>>
53bool equal(R1 &&r1, R2 &&r2) {
54 return _detail::equal(0,
false, r1, r2);