#define GENERATOR(name) \
struct name \
{ \
template<typename F> \
void operator()(F yield) \
/**/
#define _ };
template<typename Gen>
struct Adaptor
{
Gen f;
template<typename C>
void operator*(C cont)
{
f(cont);
}
};
template<typename Gen>
Adaptor<Gen> make_adaptor(Gen gen)
{
return {gen};
}
#define FOREACH(arg, gen) make_adaptor(gen) * [&](arg)
/******************************************************/
#include <iostream>
using namespace std;
GENERATOR(integers)
{
yield(1);
yield(2);
yield(4);
yield(8);
yield(16777216);
}_
int main()
{
FOREACH(int i, integers())
{
cout << i << endl;
};
}
I2RlZmluZSBHRU5FUkFUT1IobmFtZSkgXApzdHJ1Y3QgbmFtZSBcCnsgXAogICAgdGVtcGxhdGU8dHlwZW5hbWUgRj4gXAogICAgdm9pZCBvcGVyYXRvcigpKEYgeWllbGQpIFwKLyoqLwojZGVmaW5lIF8gfTsKCnRlbXBsYXRlPHR5cGVuYW1lIEdlbj4Kc3RydWN0IEFkYXB0b3IKewogICAgR2VuIGY7CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgogICAgdm9pZCBvcGVyYXRvciooQyBjb250KQogICAgewogICAgICAgIGYoY29udCk7CiAgICB9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBHZW4+CkFkYXB0b3I8R2VuPiBtYWtlX2FkYXB0b3IoR2VuIGdlbikKewogICAgcmV0dXJuIHtnZW59Owp9CgojZGVmaW5lIEZPUkVBQ0goYXJnLCBnZW4pIG1ha2VfYWRhcHRvcihnZW4pICogWyZdKGFyZykKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpHRU5FUkFUT1IoaW50ZWdlcnMpCnsKICAgIHlpZWxkKDEpOwogICAgeWllbGQoMik7CiAgICB5aWVsZCg0KTsKICAgIHlpZWxkKDgpOwogICAgeWllbGQoMTY3NzcyMTYpOwp9XwoKaW50IG1haW4oKQp7CiAgICBGT1JFQUNIKGludCBpLCBpbnRlZ2VycygpKQogICAgewogICAgICAgIGNvdXQgPDwgaSA8PCBlbmRsOwogICAgfTsKfQ==