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