#include <iostream>
#include <iterator>
struct Generator : std::iterator<std::input_iterator_tag, int>
{
Generator &operator++()
{
++n;
gen = false;
}
Generator operator++(int)
{
Generator t = *this;
++*this;
return t;
}
bool operator==(Generator const &g)
{
return n == g.n;
}
bool operator!=(Generator const &g)
{
return n != g.n;
}
int operator*()
{
if(!gen)
{
val = n*n*n;
gen = true;
std::cout << "Generated " << n << " -> " << val << std::endl;
}
return val;
}
private:
int n = 0;
bool gen = false;
int val;
};
int main()
{
Generator g;
for(unsigned i = 0; i < 100; ++i, ++g)
{
if(i%3 == 0)
{
std::cout << *g << std::endl;
}
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CgpzdHJ1Y3QgR2VuZXJhdG9yIDogc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywgaW50Pgp7CglHZW5lcmF0b3IgJm9wZXJhdG9yKysoKQoJewoJCSsrbjsKCQlnZW4gPSBmYWxzZTsKCX0KCUdlbmVyYXRvciBvcGVyYXRvcisrKGludCkKCXsKCQlHZW5lcmF0b3IgdCA9ICp0aGlzOwoJCSsrKnRoaXM7CgkJcmV0dXJuIHQ7Cgl9Cglib29sIG9wZXJhdG9yPT0oR2VuZXJhdG9yIGNvbnN0ICZnKQoJewoJCXJldHVybiBuID09IGcubjsKCX0KCWJvb2wgb3BlcmF0b3IhPShHZW5lcmF0b3IgY29uc3QgJmcpCgl7CgkJcmV0dXJuIG4gIT0gZy5uOwoJfQoJaW50IG9wZXJhdG9yKigpCgl7CgkJaWYoIWdlbikKCQl7CgkJCXZhbCA9IG4qbipuOwoJCQlnZW4gPSB0cnVlOwoJCQlzdGQ6OmNvdXQgPDwgIkdlbmVyYXRlZCAiIDw8IG4gPDwgIiAtPiAiIDw8IHZhbCA8PCBzdGQ6OmVuZGw7CgkJfQoJCXJldHVybiB2YWw7Cgl9CnByaXZhdGU6CglpbnQgbiA9IDA7Cglib29sIGdlbiA9IGZhbHNlOwoJaW50IHZhbDsKfTsKCmludCBtYWluKCkKewoJR2VuZXJhdG9yIGc7Cglmb3IodW5zaWduZWQgaSA9IDA7IGkgPCAxMDA7ICsraSwgKytnKQoJewoJCWlmKGklMyA9PSAwKQoJCXsKCQkJc3RkOjpjb3V0IDw8ICpnIDw8IHN0ZDo6ZW5kbDsKCQl9Cgl9Cn0K