generator

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

 

 

 

posted on 2017-06-07 10:51  abelian  阅读(147)  评论(0编辑  收藏  举报