Browse Source

Add 'old_style_generator.cpp'

master
Archivist 4 days ago
parent
commit
6fdd3d71f3
1 changed files with 74 additions and 0 deletions
  1. +74
    -0
      old_style_generator.cpp

+ 74
- 0
old_style_generator.cpp View File

@ -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;
}

Loading…
Cancel
Save