| 172 | // the value type is a tuple of values. |
| 173 | template<std::ranges::range... Rs, std::size_t... Indices> |
| 174 | co_context::generator< |
| 175 | std::tuple<std::ranges::range_reference_t<Rs>...>, |
| 176 | std::tuple<std::ranges::range_value_t<Rs>...>> |
| 177 | zip_impl(std::index_sequence<Indices...>, Rs... rs) { |
| 178 | std::tuple<std::ranges::iterator_t<Rs>...> its{std::ranges::begin(rs)...}; |
| 179 | std::tuple<std::ranges::sentinel_t<Rs>...> itEnds{std::ranges::end(rs)...}; |
| 180 | while (((std::get<Indices>(its) != std::get<Indices>(itEnds)) && ...)) { |
| 181 | co_yield {*std::get<Indices>(its)...}; |
| 182 | (++std::get<Indices>(its), ...); |
| 183 | } |
| 184 | } |
| 185 | |
| 186 | template<std::ranges::range... Rs> |
| 187 | co_context::generator< |