|
|
|
@ -0,0 +1,74 @@ |
|
|
|
#include <iostream>
|
|
|
|
|
|
|
|
template<typename result, typename state_t> |
|
|
|
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<bool>(state); |
|
|
|
} |
|
|
|
|
|
|
|
result value() { |
|
|
|
return extractor(state); |
|
|
|
} |
|
|
|
|
|
|
|
void reset() { |
|
|
|
state = initializer(); |
|
|
|
} |
|
|
|
|
|
|
|
operator bool() { return static_cast<bool>(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<bool>(prev)) return {prev.current + 1, prev.current >= 10}; |
|
|
|
return {0, true}; |
|
|
|
} |
|
|
|
|
|
|
|
int extractor(int_advance_state& prev) { |
|
|
|
return prev.current; |
|
|
|
} |
|
|
|
|
|
|
|
int main() { |
|
|
|
Generator<int, int_advance_state> gen{ |
|
|
|
init, |
|
|
|
advancer, |
|
|
|
extractor |
|
|
|
}; |
|
|
|
|
|
|
|
while (gen) { |
|
|
|
std::cout << gen.value() << std::endl; |
|
|
|
gen.next(); |
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
} |