Initial revision
[metaproxy-moved-to-github.git] / src / p3_filter.h
1
2 #ifndef P3_FILTER_H
3 #define P3_FILTER_H
4
5 #include <stdexcept>
6
7
8 namespace p3 {
9
10   class Package;
11   
12
13   
14   class Filter {
15   public:
16     virtual ~Filter(){};
17     virtual  Package & process(Package & package) const {
18       return package;
19     };
20     virtual  void configure(){};
21
22     // set/get the C++ way .. just as showoff
23
24     // get function - returns copy and keeps object const, 
25     // thus is right val in assignment
26     unsigned int max_front_workers() const {
27       return m_max_front;
28     }
29     // set function - returns reference and changes object,
30     // thus is left val in assignment
31     unsigned int & max_front_workers() {
32       return m_max_front;
33     }
34     // more traditional set function, taking const reference 
35     // or copy (here const ref for demo), returning ref to object
36     // can be chained with other similar functions!
37     Filter & max_front_workers(const unsigned int & max_front){
38       m_max_front = max_front;
39       return *this;
40     }
41     
42   private:
43     unsigned int m_max_front;
44   };
45
46
47   class Filter_Exception : public std::runtime_error {
48   public:
49     Filter_Exception(const std::string message)
50       : std::runtime_error("Filter_Exception: " + message){
51     };
52   };
53
54
55   class Router {
56   public:
57     virtual ~Router(){};
58     virtual const Filter & 
59       route(const Filter & filter, Package & package) const {
60       //if (!m_sillyrule)
61       //throw Router_Exception("no routing rules known");
62           return m_sillyrule;
63     };
64     virtual void configure(){};
65     Router & rule(Filter filter){
66       m_sillyrule = filter;
67       return *this;
68     }
69   private:
70     Filter m_sillyrule;
71   };
72   
73   
74   class Router_Exception : public std::runtime_error {
75   public:
76     Router_Exception(const std::string message)
77       : std::runtime_error("Router_Exception: " + message){};
78   };
79   
80
81   class Package {
82   public:
83
84     // send package to it's next filter defined in chain
85     void move() {
86       Filter oldfilter;
87       Filter nextfilter = m_router.route(oldfilter, *this);
88       nextfilter.process(*this);
89     }
90     
91
92     // get function - returns copy and keeps object const, 
93     // thus is right val in assignment
94     unsigned int data() const {
95       return m_data;
96     }
97     // set function - returns reference and changes object,
98     // thus is left val in assignment
99     unsigned int & data() {
100       return m_data;
101     }
102
103     // more traditional set function, taking const reference 
104     // or copy (here const ref for demo), returning ref to object
105     // can be chained with other similar functions!
106     Package & data(const unsigned int & data){
107       m_data = data;
108       return *this;
109     }
110
111     // get function - returns copy and keeps object const, 
112     // thus is right val in assignment
113     Router router() const {
114       return m_router;
115     }
116     // set function - returns reference and changes object,
117     // thus is left val in assignment
118     Router & router() {
119       return m_router;
120     }
121     // more traditional set function, taking const reference 
122     // or copy (here const ref for demo), returning ref to object
123     // can be chained with other similar functions!
124     Package & router(const Router & router){
125       m_router = router;
126       return *this;
127     }
128     
129   private:
130     unsigned int m_data;
131     Router m_router;
132   };
133
134
135   class Package_Exception : public std::runtime_error {
136   public:
137     Package_Exception(const std::string message)
138       : std::runtime_error("Package_Exception: " + message){
139     };
140   };
141
142
143
144   
145 }
146
147 #endif