diff --git a/old_style_generator.cpp b/old_style_generator.cpp new file mode 100644 index 0000000..fe94527 --- /dev/null +++ b/old_style_generator.cpp @@ -0,0 +1,74 @@ +#include + +template +struct Generator { + typedef state_t(*initializer_t)(); + typedef state_t(*advancer_t)(state_t&&); + typedef result(*extractor_t)(state_t&); + state_t state; + initializer_t initializer; + advancer_t advancer; + extractor_t extractor; + Generator( + initializer_t init, + advancer_t adv, + extractor_t extr + ) + : state{init()} + , initializer{init} + , advancer{adv} + , extractor{extr} + {} + + bool next() { + state = advancer(std::move(state)); + return static_cast(state); + } + + result value() { + return extractor(state); + } + + void reset() { + state = initializer(); + } + + operator bool() { return static_cast(state); } +}; + +struct int_advance_state { + int current; + bool done; + + operator bool() const { + return !done; + } +}; + +int_advance_state init() { + return {0, false}; +} + +int_advance_state advancer(int_advance_state&& prev) { + if (static_cast(prev)) return {prev.current + 1, prev.current >= 10}; + return {0, true}; +} + +int extractor(int_advance_state& prev) { + return prev.current; +} + +int main() { + Generator gen{ + init, + advancer, + extractor + }; + + while (gen) { + std::cout << gen.value() << std::endl; + gen.next(); + } + + return 0; +}