X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Fdesign.h;h=10e06a6516adb7430943312ba38d6a6553441cb5;hb=bf8d8e49d8c9a4713b4c56b668846ccd733f136d;hp=bb6f5b1a1030ece1821e8e46c6e5df64846876a5;hpb=1500d350bb472bc50d36642060e559bb67c1d185;p=metaproxy-moved-to-github.git diff --git a/src/design.h b/src/design.h index bb6f5b1..10e06a6 100644 --- a/src/design.h +++ b/src/design.h @@ -1,147 +1,174 @@ -#ifndef P3_FILTER_H -#define P3_FILTER_H +#ifndef DESIGN_H +#define DESIGN_H #include +#include +namespace yp2 { -namespace p3 { - - class Package; - - - - class Filter { - public: - virtual ~Filter(){}; - virtual Package & process(Package & package) const { - return package; + 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 + std::string name() const { + return m_name; + } + // set function - returns reference and changes object, + // thus is left val in assignment + std::string & name() { + return m_name; + } + // 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 & name(const std::string & name){ + m_name = name; + return *this; + } + + private: + std::string m_name; }; - 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 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; + Router(){}; + virtual ~Router(){}; + virtual const Filter * + move(const Filter *filter, const Package *package) const { + std::list::const_iterator it; + it = m_filter_list.begin(); + if (filter) + { + for (; it != m_filter_list.end(); it++) + if (*it == filter) + { + it++; + break; + } + } + if (it == m_filter_list.end()) + { + //throw Router_Exception("no routing rules known"); + return 0; + } + return *it; + }; + virtual void configure(){}; + Router & rule(const Filter &filter){ + m_filter_list.push_back(&filter); return *this; - } + } private: - Filter m_sillyrule; + Router(const Router &); + Router& operator=(const Router &); + std::list m_filter_list; }; class Router_Exception : public std::runtime_error { public: - Router_Exception(const std::string message) - : std::runtime_error("Router_Exception: " + message){}; + 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; - } - + + // send package to it's next filter defined in chain + Package & move() { + m_filter = m_router->move(m_filter, this); + if (m_filter) + return m_filter->process(*this); + else + return *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_filter = 0; + m_router = &router; + return *this; + } + Package() { + m_filter = 0; + m_router = 0; + m_data = 0; + } + private: - unsigned int m_data; - Router m_router; + unsigned int m_data; + const Filter *m_filter; + const Router *m_router; }; - - + + class Package_Exception : public std::runtime_error { public: - Package_Exception(const std::string message) - : std::runtime_error("Package_Exception: " + message){ - }; + Package_Exception(const std::string message) + : std::runtime_error("Package_Exception: " + message){ + }; }; - - - } #endif +/* + * Local variables: + * c-basic-offset: 4 + * indent-tabs-mode: nil + * End: + * vim: shiftwidth=4 tabstop=8 expandtab + */