#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;
		}
	}
}
