24 using row_iter_t =
typename SpMat::InnerIterator;
25 guanaqo::iter_range_adapter<row_iter_t> col_range{{sp_mat, column}};
27 static constexpr auto proj_row = [](
const row_iter_t &it) {
28 return static_cast<typename MaskVec::value_type
>(it.row());
31 auto intersection = guanaqo::iter_set_intersection(
32 std::move(col_range), std::ranges::ref_view{mask}, std::less{},
35 auto extract_eigen_iter = []<
class T>(T &&tup) ->
decltype(
auto) {
36 return std::get<0>(std::forward<T>(tup));
38 return std::views::transform(std::move(intersection), extract_eigen_iter);
46 using row_iter_t =
typename SpMat::InnerIterator;
47 guanaqo::iter_range_adapter<row_iter_t> col_range{{sp_mat, column}};
49 static constexpr auto proj_row = [](
const row_iter_t &it) {
50 return static_cast<typename MaskVec::value_type
>(it.row());
53 auto iota_mask = guanaqo::enumerate(std::ranges::ref_view{mask});
55 static constexpr auto proj_mask = [](
const auto &tup) ->
decltype(
auto) {
56 return std::get<1>(tup);
59 auto intersection = guanaqo::iter_set_intersection(
60 std::move(col_range), std::move(iota_mask), std::less{}, proj_row,
63 auto extract_eigen_iter_and_index = []<
class T>(T &&tup)
64 requires(std::is_rvalue_reference_v<T &&>)
66 auto &[eigen_iter, enum_tup] = tup;
67 auto &mask_index = std::get<0>(enum_tup);
68 return std::tuple{std::move(eigen_iter), std::move(mask_index)};
70 return std::views::transform(std::move(intersection),
71 extract_eigen_iter_and_index);