+
+#ifndef P3_FILTER_H
+#define P3_FILTER_H
+
+#include <stdexcept>
+
+
+namespace p3 {
+
+ class Package;
+
+
+
+ class Filter {
+ public:
+ virtual ~Filter(){};
+ virtual Package & process(Package & package) const {
+ return package;
+ };
+ virtual void configure(){};
+
+ // set/get the C++ way .. just as showoff
+
+ // get function - returns copy and keeps object const,
+ // thus is right val in assignment
+ unsigned int max_front_workers() const {
+ return m_max_front;
+ }
+ // set function - returns reference and changes object,
+ // thus is left val in assignment
+ unsigned int & max_front_workers() {
+ return m_max_front;
+ }
+ // more traditional set function, taking const reference
+ // or copy (here const ref for demo), returning ref to object
+ // can be chained with other similar functions!
+ Filter & max_front_workers(const unsigned int & max_front){
+ m_max_front = max_front;
+ return *this;
+ }
+
+ private:
+ unsigned int m_max_front;
+ };
+
+
+ class Filter_Exception : public std::runtime_error {
+ public:
+ Filter_Exception(const std::string message)
+ : std::runtime_error("Filter_Exception: " + message){
+ };
+ };
+
+
+ class Router {
+ public:
+ virtual ~Router(){};
+ virtual const Filter &
+ route(const Filter & filter, Package & package) const {
+ //if (!m_sillyrule)
+ //throw Router_Exception("no routing rules known");
+ return m_sillyrule;
+ };
+ virtual void configure(){};
+ Router & rule(Filter filter){
+ m_sillyrule = filter;
+ return *this;
+ }
+ private:
+ Filter m_sillyrule;
+ };
+
+
+ class Router_Exception : public std::runtime_error {
+ public:
+ Router_Exception(const std::string message)
+ : std::runtime_error("Router_Exception: " + message){};
+ };
+
+
+ class Package {
+ public:
+
+ // send package to it's next filter defined in chain
+ void move() {
+ Filter oldfilter;
+ Filter nextfilter = m_router.route(oldfilter, *this);
+ nextfilter.process(*this);
+ }
+
+
+ // get function - returns copy and keeps object const,
+ // thus is right val in assignment
+ unsigned int data() const {
+ return m_data;
+ }
+ // set function - returns reference and changes object,
+ // thus is left val in assignment
+ unsigned int & data() {
+ return m_data;
+ }
+
+ // more traditional set function, taking const reference
+ // or copy (here const ref for demo), returning ref to object
+ // can be chained with other similar functions!
+ Package & data(const unsigned int & data){
+ m_data = data;
+ return *this;
+ }
+
+ // get function - returns copy and keeps object const,
+ // thus is right val in assignment
+ Router router() const {
+ return m_router;
+ }
+ // set function - returns reference and changes object,
+ // thus is left val in assignment
+ Router & router() {
+ return m_router;
+ }
+ // more traditional set function, taking const reference
+ // or copy (here const ref for demo), returning ref to object
+ // can be chained with other similar functions!
+ Package & router(const Router & router){
+ m_router = router;
+ return *this;
+ }
+
+ private:
+ unsigned int m_data;
+ Router m_router;
+ };
+
+
+ class Package_Exception : public std::runtime_error {
+ public:
+ Package_Exception(const std::string message)
+ : std::runtime_error("Package_Exception: " + message){
+ };
+ };
+
+
+
+
+}
+
+#endif