cgv
abst_signal.h
1 #pragma once
2 
3 #include <vector>
4 #include <map>
5 #include <cgv/type/invalid_type.h>
6 #include <cgv/type/func/make_argument.h>
7 
8 #include <cgv/signal/lib_begin.h>
9 
10 namespace cgv {
11  namespace signal {
12 
13 class CGV_API functor_base;
14 class CGV_API tacker;
15 
17 class CGV_API signal_base
18 {
19 protected:
20  std::vector<functor_base*> functors;
21  void link(functor_base* fp);
22  void unlink(functor_base* fp);
23  void connect(functor_base* fp);
24  void disconnect(const functor_base* fp);
25 public:
27  unsigned get_nr_functors() const;
29  void connect_abst(functor_base* fp);
31  virtual ~signal_base();
33  void disconnect(const tacker* t);
35  void disconnect_all();
36 };
37 
39 class CGV_API functor_base
40 {
41 protected:
43  virtual void put_pointers(const void* &p1, const void* &p2) const = 0;
44 public:
46  virtual ~functor_base();
48  virtual const tacker* get_tacker() const;
50  virtual functor_base* clone() const = 0;
52  bool operator == (const functor_base& f) const;
53 };
54 
62 class CGV_API tacker
63 {
64 private:
65  typedef std::map<signal_base*, int> map_type;
66  mutable map_type signals;
67 public:
69  tacker();
71  tacker(const tacker&);
73  void tack(signal_base* s) const;
75  void untack(signal_base* s) const;
77  void untack_all() const;
79  virtual ~tacker();
80 };
81 
82 template <int i, typename T1 = type::invalid_type, typename T2 = type::invalid_type, typename T3 = type::invalid_type, typename T4 = type::invalid_type, typename T5 = type::invalid_type, typename T6 = type::invalid_type, typename T7 = type::invalid_type, typename T8 = type::invalid_type>
83 struct signature;
84 
85 
86 
87 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
88 struct signature<0,T1, T2, T3, T4, T5, T6, T7, T8>
89 {
90 
91 };
92 
93 
94 
95 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
96 struct signature<1,T1, T2, T3, T4, T5, T6, T7, T8>
97 {
98 
99  typedef typename type::func::make_argument<T1>::type A1;
100 
101 };
102 
103 
104 
105 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
106 struct signature<2,T1, T2, T3, T4, T5, T6, T7, T8>
107 {
108 
109  typedef typename type::func::make_argument<T1>::type A1;
110 
111  typedef typename type::func::make_argument<T2>::type A2;
112 
113 };
114 
115 
116 
117 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
118 struct signature<3,T1, T2, T3, T4, T5, T6, T7, T8>
119 {
120 
121  typedef typename type::func::make_argument<T1>::type A1;
122 
123  typedef typename type::func::make_argument<T2>::type A2;
124 
125  typedef typename type::func::make_argument<T3>::type A3;
126 
127 };
128 
129 
130 
131 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
132 struct signature<4,T1, T2, T3, T4, T5, T6, T7, T8>
133 {
134 
135  typedef typename type::func::make_argument<T1>::type A1;
136 
137  typedef typename type::func::make_argument<T2>::type A2;
138 
139  typedef typename type::func::make_argument<T3>::type A3;
140 
141  typedef typename type::func::make_argument<T4>::type A4;
142 
143 };
144 
145 
146 
147 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
148 struct signature<5,T1, T2, T3, T4, T5, T6, T7, T8>
149 {
150 
151  typedef typename type::func::make_argument<T1>::type A1;
152 
153  typedef typename type::func::make_argument<T2>::type A2;
154 
155  typedef typename type::func::make_argument<T3>::type A3;
156 
157  typedef typename type::func::make_argument<T4>::type A4;
158 
159  typedef typename type::func::make_argument<T5>::type A5;
160 
161 };
162 
163 
164 
165 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
166 struct signature<6,T1, T2, T3, T4, T5, T6, T7, T8>
167 {
168 
169  typedef typename type::func::make_argument<T1>::type A1;
170 
171  typedef typename type::func::make_argument<T2>::type A2;
172 
173  typedef typename type::func::make_argument<T3>::type A3;
174 
175  typedef typename type::func::make_argument<T4>::type A4;
176 
177  typedef typename type::func::make_argument<T5>::type A5;
178 
179  typedef typename type::func::make_argument<T6>::type A6;
180 
181 };
182 
183 
184 
185 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
186 struct signature<7,T1, T2, T3, T4, T5, T6, T7, T8>
187 {
188 
189  typedef typename type::func::make_argument<T1>::type A1;
190 
191  typedef typename type::func::make_argument<T2>::type A2;
192 
193  typedef typename type::func::make_argument<T3>::type A3;
194 
195  typedef typename type::func::make_argument<T4>::type A4;
196 
197  typedef typename type::func::make_argument<T5>::type A5;
198 
199  typedef typename type::func::make_argument<T6>::type A6;
200 
201  typedef typename type::func::make_argument<T7>::type A7;
202 
203 };
204 
205 
206 
207 template <typename T1, typename T2, typename T3, typename T4, typename T5, typename T6, typename T7, typename T8>
208 struct signature<8,T1, T2, T3, T4, T5, T6, T7, T8>
209 {
210 
211  typedef typename type::func::make_argument<T1>::type A1;
212 
213  typedef typename type::func::make_argument<T2>::type A2;
214 
215  typedef typename type::func::make_argument<T3>::type A3;
216 
217  typedef typename type::func::make_argument<T4>::type A4;
218 
219  typedef typename type::func::make_argument<T5>::type A5;
220 
221  typedef typename type::func::make_argument<T6>::type A6;
222 
223  typedef typename type::func::make_argument<T7>::type A7;
224 
225  typedef typename type::func::make_argument<T8>::type A8;
226 
227 };
228 
229 
230 
231  }
232 }
233 
234 #include <cgv/config/lib_end.h>
cgv::signal::functor_base::clone
virtual functor_base * clone() const =0
construct a copy of the functor on the heap
cgv::signal::functor_base::put_pointers
virtual void put_pointers(const void *&p1, const void *&p2) const =0
place characteristic pointers into the two passed references, which serve as basis for the comparison...
cgv::signal::tacker
Definition: abst_signal.h:63
cgv::signal::functor_base
base class for all functor classes which provides access to the tacker interface of an involved insta...
Definition: abst_signal.h:40
cgv::signal::signal_base
base functionality of all signals that allows connection and disconnection of abst_functors also to i...
Definition: abst_signal.h:18
cgv
the cgv namespace
Definition: vr_calib.cxx:9