sigx++  2.0.1
tunnel_functor.h
Go to the documentation of this file.
1 // -*- c++ -*-
2 /* Do not edit! -- generated file */
3 
4 
5 #ifndef _SIGXMACROS_TUNNEL_FUNCTOR_H_
6 #define _SIGXMACROS_TUNNEL_FUNCTOR_H_
7 
8 
9 /*
10  * Copyright 2007 Klaus Triendl
11  *
12  * This library is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU Library General Public
14  * License as published by the Free Software Foundation; either
15  * version 2 of the License, or (at your option) any later version.
16  *
17  * This library is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20  * Library General Public License for more details.
21  *
22  * You should have received a copy of the GNU Library General Public
23  * License along with this library; if not, write to the Free
24  * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
25 */
26 
31 #include <sigc++/sigc++.h>
32 #include <sigx/types.h>
33 #include <sigx/internal_types.h>
34 #include <sigx/tunnel_base.h>
35 #include <sigx/tunnel_context.h>
36 #include <sigx/ref.h>
37 
38 
39 namespace sigx
40 {
41 
42 
43 template<sync_type I_sync, typename T_functor>
44 struct tunnel_functor;
45 
81 template<typename T_functor>
82 struct tunnel_functor<ASYNC, T_functor>: public sigc::adapts<T_functor>, public tunnel_base
83 {
84  typedef typename sigc::adapts<T_functor>::adaptor_type adaptor_type;
85  typedef typename adaptor_type::result_type result_type;
86 
87  template<typename T_arg1 = void, typename T_arg2 = void, typename T_arg3 = void, typename T_arg4 = void, typename T_arg5 = void, typename T_arg6 = void, typename T_arg7 = void>
88  struct deduce_result_type
89  {
90  // we could also use sigc::deduce_result_type but this saves another
91  // level of indirection and does what sigc++ does internally
92  typedef typename adaptor_type::template deduce_result_type<typename sigc::type_trait<T_arg1>::pass, typename sigc::type_trait<T_arg2>::pass, typename sigc::type_trait<T_arg3>::pass, typename sigc::type_trait<T_arg4>::pass, typename sigc::type_trait<T_arg5>::pass, typename sigc::type_trait<T_arg6>::pass, typename sigc::type_trait<T_arg7>::pass>::type type;
93  };
94 
95 
96  result_type operator()()
97  {
98  return make_new_tunnel_context<ASYNC, result_type>(m_disp, m_validity_tracker, this->functor_)->tunnel();
99  }
100 
101  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
102  result_type sun_forte_workaround()
103  {
104  return make_new_tunnel_context<I_sync, result_type>(m_disp, m_validity_tracker, this->functor_)->tunnel();
105  }
106  #endif
107 
108  template<typename T_arg1>
109  typename deduce_result_type<T_arg1>::type
110  operator()(T_arg1 _A_arg1)
111  {
112  typedef typename deduce_result_type<T_arg1>::type deduced_result_type;
113  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
114  sigc::bind(this->functor_, _A_arg1))->tunnel();
115  }
116 
117  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
118  template<typename T_arg1>
119  typename deduce_result_type<T_arg1>::type
120  sun_forte_workaround(T_arg1 _A_arg1)
121  {
122  typedef typename deduce_result_type<T_arg1>::type deduced_result_type;
123  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
124  sigc::bind(this->functor_, _A_arg1))->tunnel();
125  }
126  #endif
127 
128  template<typename T_arg1, typename T_arg2>
129  typename deduce_result_type<T_arg1, T_arg2>::type
130  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2)
131  {
132  typedef typename deduce_result_type<T_arg1, T_arg2>::type deduced_result_type;
133  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
134  sigc::bind(this->functor_, _A_arg1, _A_arg2))->tunnel();
135  }
136 
137  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
138  template<typename T_arg1, typename T_arg2>
139  typename deduce_result_type<T_arg1, T_arg2>::type
140  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2)
141  {
142  typedef typename deduce_result_type<T_arg1, T_arg2>::type deduced_result_type;
143  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
144  sigc::bind(this->functor_, _A_arg1, _A_arg2))->tunnel();
145  }
146  #endif
147 
148  template<typename T_arg1, typename T_arg2, typename T_arg3>
149  typename deduce_result_type<T_arg1, T_arg2, T_arg3>::type
150  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3)
151  {
152  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3>::type deduced_result_type;
153  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
154  sigc::bind(this->functor_, _A_arg1, _A_arg2, _A_arg3))->tunnel();
155  }
156 
157  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
158  template<typename T_arg1, typename T_arg2, typename T_arg3>
159  typename deduce_result_type<T_arg1, T_arg2, T_arg3>::type
160  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3)
161  {
162  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3>::type deduced_result_type;
163  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
164  sigc::bind(this->functor_, _A_arg1, _A_arg2, _A_arg3))->tunnel();
165  }
166  #endif
167 
168  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4>
169  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4>::type
170  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4)
171  {
172  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4>::type deduced_result_type;
173  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
174  sigc::bind(this->functor_, _A_arg1, _A_arg2, _A_arg3, _A_arg4))->tunnel();
175  }
176 
177  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
178  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4>
179  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4>::type
180  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4)
181  {
182  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4>::type deduced_result_type;
183  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
184  sigc::bind(this->functor_, _A_arg1, _A_arg2, _A_arg3, _A_arg4))->tunnel();
185  }
186  #endif
187 
188  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5>
189  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>::type
190  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5)
191  {
192  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>::type deduced_result_type;
193  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
194  sigc::bind(this->functor_, _A_arg1, _A_arg2, _A_arg3, _A_arg4, _A_arg5))->tunnel();
195  }
196 
197  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
198  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5>
199  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>::type
200  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5)
201  {
202  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>::type deduced_result_type;
203  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
204  sigc::bind(this->functor_, _A_arg1, _A_arg2, _A_arg3, _A_arg4, _A_arg5))->tunnel();
205  }
206  #endif
207 
208  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6>
209  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6>::type
210  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5, T_arg6 _A_arg6)
211  {
213  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
214  sigc::bind(this->functor_, _A_arg1, _A_arg2, _A_arg3, _A_arg4, _A_arg5, _A_arg6))->tunnel();
215  }
216 
217  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
218  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6>
219  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6>::type
220  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5, T_arg6 _A_arg6)
221  {
223  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
224  sigc::bind(this->functor_, _A_arg1, _A_arg2, _A_arg3, _A_arg4, _A_arg5, _A_arg6))->tunnel();
225  }
226  #endif
227 
228  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6, typename T_arg7>
229  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7>::type
230  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5, T_arg6 _A_arg6, T_arg7 _A_arg7)
231  {
233  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
234  sigc::bind(this->functor_, _A_arg1, _A_arg2, _A_arg3, _A_arg4, _A_arg5, _A_arg6, _A_arg7))->tunnel();
235  }
236 
237  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
238  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6, typename T_arg7>
239  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7>::type
240  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5, T_arg6 _A_arg6, T_arg7 _A_arg7)
241  {
243  return make_new_tunnel_context<ASYNC, deduced_result_type>(m_disp, m_validity_tracker,
244  sigc::bind(this->functor_, _A_arg1, _A_arg2, _A_arg3, _A_arg4, _A_arg5, _A_arg6, _A_arg7))->tunnel();
245  }
246  #endif
247 
248 
249 
259  explicit tunnel_functor(typename sigc::type_trait<T_functor>::take _A_func):
260  sigc::adapts<T_functor>(_A_func),
261  // find the dispatchable object contained in the functor by
262  // stepping down the functor chain;
263  // dispatchable_constraint finds the dispatchable and issues a compiler
264  // error if the passed in functor is not a functor on a dispatchable's
265  // method or does find a dispatchable in a SIGX_DISPATCH_WITH_FUNCTOR
266  tunnel_base(internal::dispatchable_constraint<adaptor_type>::find_dispatchable(this->functor_))
267  {}
268 
269  // implicit copy ctor is fine
270  // implicit dtor is fine
271  // implicit assignment operator is fine
272 
273 
279  void activate_validity_tracking() const
280  {
281  validity_tracker().activate();
282 
283  // visit each trackable and bind the validity trackable to the sigc trackable and vice versa
284  sigc::visit_each_type<sigc::trackable*>(
285  sigc::mem_fun(validity_tracker(), &tunnel_validity_tracker::do_bind_to_trackable),
286  this->functor_
287  );
288  }
289 };
290 
291 template<typename T_functor>
292 struct tunnel_functor<SYNC, T_functor>: public sigc::adapts<T_functor>, public tunnel_base
293 {
294  typedef typename sigc::adapts<T_functor>::adaptor_type adaptor_type;
295  typedef typename adaptor_type::result_type result_type;
296 
297  template<typename T_arg1 = void, typename T_arg2 = void, typename T_arg3 = void, typename T_arg4 = void, typename T_arg5 = void, typename T_arg6 = void, typename T_arg7 = void>
298  struct deduce_result_type
299  {
300  // we could also use sigc::deduce_result_type but this saves another
301  // level of indirection and does what sigc++ does internally
302  typedef typename adaptor_type::template deduce_result_type<typename sigc::type_trait<T_arg1>::pass, typename sigc::type_trait<T_arg2>::pass, typename sigc::type_trait<T_arg3>::pass, typename sigc::type_trait<T_arg4>::pass, typename sigc::type_trait<T_arg5>::pass, typename sigc::type_trait<T_arg6>::pass, typename sigc::type_trait<T_arg7>::pass>::type type;
303  };
304 
305 
306  result_type operator()()
307  {
308  return make_new_tunnel_context<SYNC, result_type>(m_disp, m_validity_tracker, this->functor_)->tunnel();
309  }
310 
311  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
312  result_type sun_forte_workaround()
313  {
314  return make_new_tunnel_context<I_sync, result_type>(m_disp, m_validity_tracker, this->functor_)->tunnel();
315  }
316  #endif
317 
318  template<typename T_arg1>
319  typename deduce_result_type<T_arg1>::type
320  operator()(T_arg1 _A_arg1)
321  {
322  typedef typename deduce_result_type<T_arg1>::type deduced_result_type;
323  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
324  sigc::bind(this->functor_, sigx::ref(_A_arg1)))->tunnel();
325  }
326 
327  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
328  template<typename T_arg1>
329  typename deduce_result_type<T_arg1>::type
330  sun_forte_workaround(T_arg1 _A_arg1)
331  {
332  typedef typename deduce_result_type<T_arg1>::type deduced_result_type;
333  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
334  sigc::bind(this->functor_, sigx::ref(_A_arg1)))->tunnel();
335  }
336  #endif
337 
338  template<typename T_arg1, typename T_arg2>
339  typename deduce_result_type<T_arg1, T_arg2>::type
340  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2)
341  {
342  typedef typename deduce_result_type<T_arg1, T_arg2>::type deduced_result_type;
343  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
344  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2)))->tunnel();
345  }
346 
347  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
348  template<typename T_arg1, typename T_arg2>
349  typename deduce_result_type<T_arg1, T_arg2>::type
350  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2)
351  {
352  typedef typename deduce_result_type<T_arg1, T_arg2>::type deduced_result_type;
353  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
354  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2)))->tunnel();
355  }
356  #endif
357 
358  template<typename T_arg1, typename T_arg2, typename T_arg3>
359  typename deduce_result_type<T_arg1, T_arg2, T_arg3>::type
360  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3)
361  {
362  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3>::type deduced_result_type;
363  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
364  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2), sigx::ref(_A_arg3)))->tunnel();
365  }
366 
367  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
368  template<typename T_arg1, typename T_arg2, typename T_arg3>
369  typename deduce_result_type<T_arg1, T_arg2, T_arg3>::type
370  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3)
371  {
372  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3>::type deduced_result_type;
373  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
374  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2), sigx::ref(_A_arg3)))->tunnel();
375  }
376  #endif
377 
378  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4>
379  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4>::type
380  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4)
381  {
382  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4>::type deduced_result_type;
383  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
384  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2), sigx::ref(_A_arg3), sigx::ref(_A_arg4)))->tunnel();
385  }
386 
387  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
388  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4>
389  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4>::type
390  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4)
391  {
392  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4>::type deduced_result_type;
393  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
394  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2), sigx::ref(_A_arg3), sigx::ref(_A_arg4)))->tunnel();
395  }
396  #endif
397 
398  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5>
399  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>::type
400  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5)
401  {
402  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>::type deduced_result_type;
403  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
404  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2), sigx::ref(_A_arg3), sigx::ref(_A_arg4), sigx::ref(_A_arg5)))->tunnel();
405  }
406 
407  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
408  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5>
409  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>::type
410  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5)
411  {
412  typedef typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5>::type deduced_result_type;
413  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
414  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2), sigx::ref(_A_arg3), sigx::ref(_A_arg4), sigx::ref(_A_arg5)))->tunnel();
415  }
416  #endif
417 
418  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6>
419  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6>::type
420  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5, T_arg6 _A_arg6)
421  {
423  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
424  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2), sigx::ref(_A_arg3), sigx::ref(_A_arg4), sigx::ref(_A_arg5), sigx::ref(_A_arg6)))->tunnel();
425  }
426 
427  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
428  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6>
429  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6>::type
430  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5, T_arg6 _A_arg6)
431  {
433  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
434  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2), sigx::ref(_A_arg3), sigx::ref(_A_arg4), sigx::ref(_A_arg5), sigx::ref(_A_arg6)))->tunnel();
435  }
436  #endif
437 
438  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6, typename T_arg7>
439  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7>::type
440  operator()(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5, T_arg6 _A_arg6, T_arg7 _A_arg7)
441  {
443  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
444  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2), sigx::ref(_A_arg3), sigx::ref(_A_arg4), sigx::ref(_A_arg5), sigx::ref(_A_arg6), sigx::ref(_A_arg7)))->tunnel();
445  }
446 
447  #ifndef SIGC_TEMPLATE_SPECIALIZATION_OPERATOR_OVERLOAD
448  template<typename T_arg1, typename T_arg2, typename T_arg3, typename T_arg4, typename T_arg5, typename T_arg6, typename T_arg7>
449  typename deduce_result_type<T_arg1, T_arg2, T_arg3, T_arg4, T_arg5, T_arg6, T_arg7>::type
450  sun_forte_workaround(T_arg1 _A_arg1, T_arg2 _A_arg2, T_arg3 _A_arg3, T_arg4 _A_arg4, T_arg5 _A_arg5, T_arg6 _A_arg6, T_arg7 _A_arg7)
451  {
453  return make_new_tunnel_context<SYNC, deduced_result_type>(m_disp, m_validity_tracker,
454  sigc::bind(this->functor_, sigx::ref(_A_arg1), sigx::ref(_A_arg2), sigx::ref(_A_arg3), sigx::ref(_A_arg4), sigx::ref(_A_arg5), sigx::ref(_A_arg6), sigx::ref(_A_arg7)))->tunnel();
455  }
456  #endif
457 
458 
459 
469  explicit tunnel_functor(typename sigc::type_trait<T_functor>::take _A_func):
470  sigc::adapts<T_functor>(_A_func),
471  // find the dispatchable object contained in the functor by
472  // stepping down the functor chain;
473  // dispatchable_constraint finds the dispatchable and issues a compiler
474  // error if the passed in functor is not a functor on a dispatchable's
475  // method or does find a dispatchable in a SIGX_DISPATCH_WITH_FUNCTOR
476  tunnel_base(internal::dispatchable_constraint<adaptor_type>::find_dispatchable(this->functor_))
477  {}
478 
479  // implicit copy ctor is fine
480  // implicit dtor is fine
481  // implicit assignment operator is fine
482 
483 
489  void activate_validity_tracking() const
490  {
491  validity_tracker().activate();
492 
493  // visit each trackable and bind the validity trackable to the sigc trackable and vice versa
494  sigc::visit_each_type<sigc::trackable*>(
495  sigc::mem_fun(validity_tracker(), &tunnel_validity_tracker::do_bind_to_trackable),
496  this->functor_
497  );
498  }
499 };
500 
501 
502 
503 
504 
510 template<typename T_functor>
512 dispatch_with(const T_functor& _A_func, const shared_dispatchable& d)
513 {
514  return sigc::bind(sigc::hide(_A_func), d);
515 }
516 
517 
527 template<typename T_functor>
528 tunnel_functor<ASYNC, T_functor>
529 open_tunnel(const T_functor& _A_func)
530 {
531  return tunnel_functor<ASYNC, T_functor>(_A_func);
532 }
533 
543 template<typename T_functor>
544 tunnel_functor<SYNC, T_functor>
545 open_sync_tunnel(const T_functor& _A_func)
546 {
547  return tunnel_functor<SYNC, T_functor>(_A_func);
548 }
549 
560 template<typename T_functor>
561 tunnel_functor<ASYNC, SIGX_DISPATCH_WITH_FUNCTOR(T_functor)>
562 open_tunnel_with(const T_functor& _A_func, const shared_dispatchable& d)
563 {
564  return tunnel_functor<ASYNC, SIGX_DISPATCH_WITH_FUNCTOR(T_functor)>(dispatch_with(_A_func, d));
565 }
566 
577 template<typename T_functor>
578 tunnel_functor<SYNC, SIGX_DISPATCH_WITH_FUNCTOR(T_functor)>
579 open_sync_tunnel_with(const T_functor& _A_func, const shared_dispatchable& d)
580 {
581  return tunnel_functor<SYNC, SIGX_DISPATCH_WITH_FUNCTOR(T_functor)>(dispatch_with(_A_func, d));
582 }
583 
584 
585 } // namespace sigx
586 
587 
588 namespace sigc
589 {
590 
596 template<typename T_action, typename T_functor, sigx::sync_type I_sync>
597 void visit_each(const T_action& /*_A_action*/, const sigx::tunnel_functor<I_sync, T_functor>& /*_A_func*/)
598 {
599  // do nothing
600 }
601 
602 
603 } // namespace sigc
604 #endif /* _SIGXMACROS_TUNNEL_FUNCTOR_H_ */