-#ifndef P3_FILTER_H
-#define P3_FILTER_H
+#ifndef DESIGN_H
+#define DESIGN_H
#include <stdexcept>
-namespace p3 {
+namespace yp2 {
class Package;
-
-
class Filter {
public:
virtual ~Filter(){};
// get function - returns copy and keeps object const,
// thus is right val in assignment
- unsigned int max_front_workers() const {
- return m_max_front;
+ std::string name() const {
+ return m_name;
}
// set function - returns reference and changes object,
// thus is left val in assignment
- unsigned int & max_front_workers() {
- return m_max_front;
+ 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 & max_front_workers(const unsigned int & max_front){
- m_max_front = max_front;
+ Filter & name(const std::string & name){
+ m_name = name;
return *this;
}
private:
- unsigned int m_max_front;
+ std::string m_name;
};
class Router {
public:
+ Router(){};
virtual ~Router(){};
- virtual const Filter &
- route(const Filter & filter, Package & package) const {
+ virtual const Filter *
+ route(const Filter *filter, const Package *package) const {
//if (!m_sillyrule)
//throw Router_Exception("no routing rules known");
- return m_sillyrule;
+ return m_filter;
};
virtual void configure(){};
- Router & rule(Filter filter){
- m_sillyrule = filter;
+ Router & rule(const Filter &filter){
+ m_filter = &filter;
return *this;
}
private:
- Filter m_sillyrule;
+ Router(const Router &);
+ Router& operator=(const Router &);
+ const Filter *m_filter;
};
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);
- }
+ void move()
+ {
+ m_filter = m_router->route(m_filter, this);
+ if (m_filter)
+ m_filter->process(*this);
+ }
// get function - returns copy and keeps object const,
// get function - returns copy and keeps object const,
// thus is right val in assignment
- Router router() const {
- return m_router;
- }
+ //Router router() const {
+ // return m_router;
+ //}
// set function - returns reference and changes object,
// thus is left val in assignment
- Router & router() {
- return m_router;
- }
+ //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;
+ Package & router(const Router &router){
+ m_router = &router;
return *this;
}
private:
unsigned int m_data;
- Router m_router;
+ const Filter *m_filter;
+ const Router *m_router;
};
// test filter set/get/exception
try {
std::cout << "\nTRY" << "\n";
- p3::Filter filter;
- unsigned int tmp;
+ yp2::Filter filter;
- filter.max_front_workers(1).max_front_workers(2);
- tmp = filter.max_front_workers();
- std::cout << "workers: " << tmp << "\n";
+ filter.name("filter1");
+ std::cout << "filter: " << filter.name() << "\n";
- filter.max_front_workers() = 3;
- tmp = filter.max_front_workers();
- std::cout << "workers: " << tmp << "\n";
+ filter.name() = "filter1 rename";
+ std::cout << "filter: " << filter.name() << "\n";
- throw p3::Filter_Exception("finished");
+ throw yp2::Filter_Exception("finished");
}
catch (std::exception &e) {
std::cout << e.what() << "\n";
try {
std::cout << "\nTRY" << "\n";
- p3::Filter filter1;
- p3::Filter filter2;
+ yp2::Filter filter1;
+ filter1.name("filter1");
+
+ yp2::Filter filter2;
+ filter2.name() = "filter2";
std::cout << "filter1 filter2" << "\n";
- p3::Router router1;
+ yp2::Router router1;
router1.rule(filter1);
std::cout << "router1.rule(filter1)" << "\n";
- p3::Router router2;
+ yp2::Router router2;
router2.rule(filter2);
std::cout << "router2.rule(filter2)" << "\n";
- p3::Package pack_in;
+ yp2::Package pack_in;
pack_in.data(7).router(router1);
std::cout << "pack_in.data(7).router(router1)" << "\n";
pack_in.move();
std::cout << "pack_in.move()" << "\n";
- throw p3::Router_Exception("finished");
+ throw yp2::Router_Exception("finished");
}
catch (std::exception &e) {