X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fdesign.h;h=10e06a6516adb7430943312ba38d6a6553441cb5;hb=bf8d8e49d8c9a4713b4c56b668846ccd733f136d;hp=481b70504e459bc52bf4c4224e84f7c46bb02527;hpb=ace216a7a0ef96f3af0bbddd5ba454ef4efa5be2;p=metaproxy-moved-to-github.git diff --git a/src/design.h b/src/design.h index 481b705..10e06a6 100644 --- a/src/design.h +++ b/src/design.h @@ -3,148 +3,172 @@ #define DESIGN_H #include - +#include namespace yp2 { - 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 - 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; - }; - - - 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: - Router(){}; - virtual ~Router(){}; - virtual const Filter * - route(const Filter *filter, const Package *package) const { - //if (!m_sillyrule) - //throw Router_Exception("no routing rules known"); - return m_filter; - }; - virtual void configure(){}; - Router & rule(const Filter &filter){ - m_filter = &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: - Router(const Router &); - Router& operator=(const Router &); - const Filter *m_filter; + 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() - { - m_filter = m_router->route(m_filter, this); - if (m_filter) - m_filter->process(*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; } - - - // 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; - } - + // 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; - const Filter *m_filter; - const 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 + */