#include <iostream>
#include <functional>
#include <vector>
bool increase(const std::vector<std::function<std::size_t()>>& v,
std::vector<std::size_t>& it)
{
for (std::size_t i = 0, size = it.size(); i != size; ++i) {
const std::size_t index = size - 1 - i;
++it[index];
if (it[index] > v[index]()) {
it[index] = 0;
} else {
return true;
}
}
return false;
}
void do_job(const std::vector<std::size_t>& it)
{
for (const auto e : it) {
std::cout << e << " ";
}
std::cout << std::endl;
}
void iterate(std::vector<std::size_t>& it,
const std::vector<std::function<std::size_t()>>& v)
{
do {
do_job(it);
} while (increase(v, it));
}
int main(int argc, char *argv[])
{
std::vector<std::size_t> its(3, 0);
std::vector<std::function<std::size_t()>> bounds = {
[]{ return 2; },
[]{ return 3; },
[&its]{ return its[0] + its[1]; },
};
iterate(its, bounds);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHZlY3Rvcj4KIApib29sIGluY3JlYXNlKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248c3RkOjpzaXplX3QoKT4+JiB2LAogICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiYgaXQpCnsKICAgIGZvciAoc3RkOjpzaXplX3QgaSA9IDAsIHNpemUgPSBpdC5zaXplKCk7IGkgIT0gc2l6ZTsgKytpKSB7CiAgICAgICAgY29uc3Qgc3RkOjpzaXplX3QgaW5kZXggPSBzaXplIC0gMSAtIGk7CiAgICAgICAgKytpdFtpbmRleF07CiAgICAgICAgaWYgKGl0W2luZGV4XSA+IHZbaW5kZXhdKCkpIHsKICAgICAgICAgICAgaXRbaW5kZXhdID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7Cn0KIAp2b2lkIGRvX2pvYihjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGl0KQp7CiAgICBmb3IgKGNvbnN0IGF1dG8gZSA6IGl0KSB7CiAgICAgICAgc3RkOjpjb3V0IDw8IGUgPDwgIiAiOwogICAgfQogICAgc3RkOjpjb3V0IDw8IHN0ZDo6ZW5kbDsKfQogCnZvaWQgaXRlcmF0ZShzdGQ6OnZlY3RvcjxzdGQ6OnNpemVfdD4mIGl0LAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjxzdGQ6OnNpemVfdCgpPj4mIHYpCnsKICAgIGRvIHsKICAgICAgICBkb19qb2IoaXQpOwogICAgfSB3aGlsZSAoaW5jcmVhc2UodiwgaXQpKTsKfQogCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2l6ZV90PiBpdHMoMywgMCk7CiAgICBzdGQ6OnZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2l6ZV90KCk+PiBib3VuZHMgPSB7CiAgICAgICAgW117IHJldHVybiAyOyB9LAogICAgICAgIFtdeyByZXR1cm4gMzsgfSwKICAgICAgICBbJml0c117IHJldHVybiBpdHNbMF0gKyBpdHNbMV07IH0sCiAgICB9OwogCiAgICBpdGVyYXRlKGl0cywgYm91bmRzKTsKfQ==