3#ifndef __PERCEMON_ITER_PRODUCT_HPP__
4#define __PERCEMON_ITER_PRODUCT_HPP__
11namespace iter_helpers {
16template <
typename Iter>
19 using ElementType =
typename std::iterator_traits<Iter>::value_type;
21 using iterator_category = std::forward_iterator_tag;
22 using difference_type = std::ptrdiff_t;
23 using value_type = std::vector<ElementType>;
24 using pointer = std::vector<ElementType>*;
25 using reference = std::vector<ElementType>&;
28 _begin{first}, _end{last}, _k{k}, _curr{std::vector<Iter>(k, first)} {};
31 for (
size_t i = 0; i < _curr.size(); i++) {
32 if (_curr.at(i) != other._curr.at(i)) {
39 return !(*
this != other);
42 value_type operator*()
const {
43 auto _curr_val = std::vector<ElementType>{};
47 std::back_inserter(_curr_val),
48 [](
const auto i) {
return *i; });
64 _begin{first}, _end{last}, _k{k}, _curr{std::vector<Iter>{k, fill}} {};
79 std::vector<Iter> _curr;
81 bool increment(
int i) {
83 auto& it = _curr.at(i);
86 bool to_reset = increment(i - 1);
104 typename Iter =
decltype(std::begin(std::declval<Container>())),
105 typename =
decltype(std::end(std::declval<Container>()))>
115 std::begin(iterable), std::end(iterable), k);
123 typename Iter =
decltype(std::begin(std::declval<Container>())),
124 typename =
decltype(std::end(std::declval<Container>()))>
125constexpr auto product(Container&& iterable,
size_t k = 1) {
Definition: product.hpp:17
Definition: product.hpp:106