/** * pipesandfilters.cpp */ #include "pipesandfilters.h" /** * Default constructor. */ Packet::Packet() { }; /** * Default constructor. */ Pipe::Pipe() { }; int Pipe::size() { return (int) packets.size(); }; Packet& Pipe::read() { if( size() == 0 ) { throw new EmptyPipeException(); } Packet packet = packets.back(); packets.pop_back(); return packet; }; void Pipe::write( Packet& packet ) { packets.push_front( packet ); observer -> notify(); }; void Pipe::setObserver( DataSink* observer ) { this -> observer = observer; }; DataSink* Pipe::getObserver() { return observer; }; /** * Default constructor. */ DataSource::DataSource() { output = (Pipe *) 0; }; void DataSource::add( Packet& packet ) { if( output != (Pipe *) 0 ) { output -> write( packet ); } else { throw new NoOutputPipeException(); } }; void DataSource::setOutput( Pipe* output ) { this -> output = output; }; Pipe* DataSource::getOutput() { return output; }; DataSink::DataSink() { input = (Pipe *) 0; observer = (Filter *) 0; }; int DataSink::size() { return received.size(); }; Packet& DataSink::nextPacket() { Packet packet = received.back(); received.pop_back(); return packet; }; void DataSink::notify() { while( input -> size() > 0 ) { received.push_front( input -> read() ); } if( observer ) { observer -> notify(); } }; void DataSink::setInput( Pipe* newinput ) { input = newinput; }; Pipe* DataSink::getInput() { return input; }; void DataSink::setObserver( Filter* filter ) { this -> observer = filter; } Filter* DataSink::getObserver() { return observer; } /** * Default constructor. */ Filter::Filter() { }; void Filter::transform() { while( input -> size() > 0 ) { output -> add( input -> nextPacket() ); } } void Filter::notify() { transform(); } void Filter::setDataSource( DataSource* ds ) { output = ds; }; DataSource* Filter::getDataSource() { return output; }; void Filter::setDataSink( DataSink* ds ) { input = ds; }; DataSink* Filter::getDataSink() { return input; };