_Coroutine Filter { protected: _Exception Eof {}; // no more characters Filter * next; // next filter in chain unsigned char ch; // communication variable public: Filter( Filter * next ) : next{ next } {} void put( unsigned char c ) { ch = c; resume(); } }; _Coroutine Reader : public Filter { // YOU ADD PRIVATE MEMBERS public: Reader( Filter * f, std::istream & i ); }; _Coroutine Writer : public Filter { // YOU ADD PRIVATE MEMBERS public: Writer( std::ostream & o ); }; _Coroutine filter-name : public Filter { // YOU ADD PRIVATE MEMBERS public: filter-name( Filter * f, ... ); };