/* Eratosthenes' Sieve */ /* Data driven discipline */ /* File Eratosthenes_data_driven.c */ #include class Item { protected: Item *destination; public: virtual void in(int n, Item *src) {} friend class Sieve; }; class Generator: public Item { int value; public: void start(int maximum){ while (valuein(value++,this);} } Generator(Item *dst){destination = dst; value = 2; } }; class Filter: public Item { int factor; public: void in(int n, Item *src) { if (n%factor) { destination->in(n, this); } } Filter(int f, Item *dst){ factor = f; destination = dst; } }; class Sieve: public Item{ public: void in(int n, Item *src) { cout << n << " "; src->destination = new Filter(n,this); } }; main() { Sieve s; Generator g(&s); int max; cout << "Input the upper bound" << '\n'; cin >> max; cout << "These are the prime numbers between " << 2 << " and " << max << '\n'; g.start(max); cout << '\n'; }