1#ifndef _BBM_MULTI_RANGE_FOR_H_
2#define _BBM_MULTI_RANGE_FOR_H_
42 template<
typename FUNC,
typename... Ts>
46 if constexpr (
sizeof...(Ts) == 0)
return;
56 auto itr = std::make_tuple( (
bbm::begin(containers))... );
59 auto idx = std::make_index_sequence<
sizeof...(Ts)>{};
60 auto incr = []<
typename C>(C&& ,
auto& itr) {
if constexpr (std::ranges::range<C>)
return ++itr; };
61 auto incr_all = [&]<
size_t... IDX>(std::index_sequence<IDX...>) { (incr(containers, std::get<IDX>(itr)), ...); };
62 auto apply_all = [&]<
size_t... IDX>(std::index_sequence<IDX...>) { std::invoke(std::forward<FUNC>(func), (*std::get<IDX>(itr))...); };
65 for(
size_t i=0; i !=
size; ++i, incr_all(idx))
Predefined exceptions for common errors.
#define bbm_size_error
Definition: error.h:45
Extensions for STL iterators/ranges.
Definition: aggregatebsdf.h:29
auto apply_all(const FUNC &func, const T &... t)
Apply a function.
Definition: apply_all.h:42
void multirange_for(FUNC &&func, Ts &&... containers)
ranged for loop over multiple containers at once
Definition: multirange_for.h:43
size_t size(T &&t)
Definition: iterator_util.h:22
auto begin(T &&t)
Definition: iterator_util.h:29
Additional basic helper concepts.