/*
#ifndef __generator_h__
#define __generator_h__
class _generator
{
protected:
int _line;
public:
_generator():_line(0) {}
};
#define $generator(NAME) struct NAME : public _generator
#define $emit(T) bool operator()(T& _rv) { \
switch(_line) { case 0:;
#define $stop } _line = 0; return false; }
#define $yield(V) \
do {\
_line=__LINE__;\
_rv = (V); return true; case __LINE__:;\
} while (0)
#endif
*/
#ifndef __generator_h_
#define __generator_h_
struct _generator
{
int _line;
_generator():_line(-1) {}
operator bool() const { return _line != 0; }
};
#define generator(NAME) struct NAME : public _generator
#define emit(T) T operator()() { \
if(_line < 0) { _line=0;}\
switch(_line) { case 0:;
#define stop(V) } _line = 0; return (V); }
#define yield(V) \
do {\
_line=__LINE__;\
return (V); case __LINE__:;\
} while (0)
#endif
#include "stdio.h"
/*
#include "generator.h"
$generator(descent)
{
// place for all variables used in the generator
int i; // our counter
// place the constructor of our generator, e.g.
// descent(int minv, int maxv) {...}
// from $emit to $stop is a body of our generator:
$emit(int) // will emit int values. Start of body of the generator.
for (i = 10; i > 0; --i)
$yield(i); // a.k.a. yield in Python,
// returns next number in [1..10], reversed.
$stop; // stop, end of sequence. End of body of the generator.
};
int main(int argc, char* argv[])
{
descent gen;
for(int n; gen(n);) // "get next" generator invocation
printf("next number is %d\n", n);
return 0;
}
*/
#include "generator.h"
generator(descent)
{
int i;
emit(int) // will emit int values. Start of body of the generator.
for (i = 10; i > 0; i--)
yield(i); // a.k.a. yield in Python - return next number in [1..10], reversed.
stop(0); // stop, end of sequence. End of body of the generator.
};
int main(int argc, char* argv[])
{
descent gen;
do
printf("next number is %d\n", gen());
while (gen);
return 0;
}