2 /* Do not edit! -- generated file */
3 #ifndef _SIGC_ADAPTORS_MACROS_EXCEPTION_CATCHHM4_
4 #define _SIGC_ADAPTORS_MACROS_EXCEPTION_CATCHHM4_
5 #include <sigc++/adaptors/adaptor_trait.h>
10 functor adaptor: exception_catch(functor, catcher)
16 The catcher should be told what type of return it needs to
17 return for multiple type functors, to do this the user
18 will need to derive from catcher_base.
20 /** @defgroup exception_catch exception_catch()
21 * sigc::exception_catch() catches an exception thrown from within
22 * the wrapped functor and directs it to a catcher functor.
23 * This catcher can then rethrow the exception and catch it with the proper type.
25 * Note that the catcher is expected to return the same type
26 * as the wrapped functor so that normal flow can continue.
28 * Catchers can be cascaded to catch multiple types because uncaught
29 * rethrown exceptions proceed to the next catcher adaptor.
38 * catch (std::range_error e) // catch what types we know
39 * { std::cerr << "caught " << e.what() << std::endl; }
43 * int foo(); // throws std::range_error
44 * sigc::exception_catch(&foo, my_catch())();
47 * The functor sigc::execption_catch() returns can be passed into
48 * sigc::signal::connect() directly.
52 * sigc::signal<int> some_signal;
53 * some_signal.connect(sigc::exception_catch(&foo, my_catch));
59 template <class T_functor, class T_catcher, class T_return = typename adapts<T_functor>::result_type>
60 struct exception_catch_functor : public adapts<T_functor>
62 typedef typename adapts<T_functor>::adaptor_type adaptor_type;
64 template <class T_arg1=void,class T_arg2=void,class T_arg3=void,class T_arg4=void,class T_arg5=void,class T_arg6=void,class T_arg7=void>
65 struct deduce_result_type
66 { typedef typename adaptor_type::template deduce_result_type<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass,typename type_trait<T_arg4>::pass,typename type_trait<T_arg5>::pass,typename type_trait<T_arg6>::pass,typename type_trait<T_arg7>::pass>::type type; };
67 typedef T_return result_type;
72 template <class T_arg1>
73 typename deduce_result_type<T_arg1>::type
74 operator()(T_arg1 _A_a1)
78 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass>
82 { return catcher_(); }
85 template <class T_arg1,class T_arg2>
86 typename deduce_result_type<T_arg1,T_arg2>::type
87 operator()(T_arg1 _A_a1,T_arg2 _A_a2)
91 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass>
95 { return catcher_(); }
98 template <class T_arg1,class T_arg2,class T_arg3>
99 typename deduce_result_type<T_arg1,T_arg2,T_arg3>::type
100 operator()(T_arg1 _A_a1,T_arg2 _A_a2,T_arg3 _A_a3)
104 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass>
108 { return catcher_(); }
111 template <class T_arg1,class T_arg2,class T_arg3,class T_arg4>
112 typename deduce_result_type<T_arg1,T_arg2,T_arg3,T_arg4>::type
113 operator()(T_arg1 _A_a1,T_arg2 _A_a2,T_arg3 _A_a3,T_arg4 _A_a4)
117 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass,typename type_trait<T_arg4>::pass>
118 (_A_a1,_A_a2,_A_a3,_A_a4);
121 { return catcher_(); }
124 template <class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
125 typename deduce_result_type<T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::type
126 operator()(T_arg1 _A_a1,T_arg2 _A_a2,T_arg3 _A_a3,T_arg4 _A_a4,T_arg5 _A_a5)
130 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass,typename type_trait<T_arg4>::pass,typename type_trait<T_arg5>::pass>
131 (_A_a1,_A_a2,_A_a3,_A_a4,_A_a5);
134 { return catcher_(); }
137 template <class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
138 typename deduce_result_type<T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::type
139 operator()(T_arg1 _A_a1,T_arg2 _A_a2,T_arg3 _A_a3,T_arg4 _A_a4,T_arg5 _A_a5,T_arg6 _A_a6)
143 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass,typename type_trait<T_arg4>::pass,typename type_trait<T_arg5>::pass,typename type_trait<T_arg6>::pass>
144 (_A_a1,_A_a2,_A_a3,_A_a4,_A_a5,_A_a6);
147 { return catcher_(); }
150 template <class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6,class T_arg7>
151 typename deduce_result_type<T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::type
152 operator()(T_arg1 _A_a1,T_arg2 _A_a2,T_arg3 _A_a3,T_arg4 _A_a4,T_arg5 _A_a5,T_arg6 _A_a6,T_arg7 _A_a7)
156 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass,typename type_trait<T_arg4>::pass,typename type_trait<T_arg5>::pass,typename type_trait<T_arg6>::pass,typename type_trait<T_arg7>::pass>
157 (_A_a1,_A_a2,_A_a3,_A_a4,_A_a5,_A_a6,_A_a7);
160 { return catcher_(); }
163 exception_catch_functor(const T_functor& _A_func,
164 const T_catcher& _A_catcher)
165 : adapts<T_functor>(_A_func), catcher_(_A_catcher)
172 template <class T_functor, class T_catcher, class T_return>
173 typename exception_catch_functor<T_functor, T_catcher, T_return>::result_type
174 exception_catch_functor<T_functor, T_catcher, T_return>::operator()()
177 { return this->functor_(); }
179 { return catcher_(); }
182 // void specialization
183 template <class T_functor, class T_catcher>
184 struct exception_catch_functor<T_functor, T_catcher, void> : public adapts<T_functor>
186 typedef void result_type;
187 typedef typename adapts<T_functor>::adaptor_type adaptor_type;
192 template <class T_arg1>
193 typename deduce_result_type<T_arg1>::type
194 operator()(T_arg1 _A_a1)
198 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass>
202 { return catcher_(); }
205 template <class T_arg1,class T_arg2>
206 typename deduce_result_type<T_arg1,T_arg2>::type
207 operator()(T_arg1 _A_a1,T_arg2 _A_a2)
211 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass>
215 { return catcher_(); }
218 template <class T_arg1,class T_arg2,class T_arg3>
219 typename deduce_result_type<T_arg1,T_arg2,T_arg3>::type
220 operator()(T_arg1 _A_a1,T_arg2 _A_a2,T_arg3 _A_a3)
224 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass>
228 { return catcher_(); }
231 template <class T_arg1,class T_arg2,class T_arg3,class T_arg4>
232 typename deduce_result_type<T_arg1,T_arg2,T_arg3,T_arg4>::type
233 operator()(T_arg1 _A_a1,T_arg2 _A_a2,T_arg3 _A_a3,T_arg4 _A_a4)
237 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass,typename type_trait<T_arg4>::pass>
238 (_A_a1,_A_a2,_A_a3,_A_a4);
241 { return catcher_(); }
244 template <class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5>
245 typename deduce_result_type<T_arg1,T_arg2,T_arg3,T_arg4,T_arg5>::type
246 operator()(T_arg1 _A_a1,T_arg2 _A_a2,T_arg3 _A_a3,T_arg4 _A_a4,T_arg5 _A_a5)
250 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass,typename type_trait<T_arg4>::pass,typename type_trait<T_arg5>::pass>
251 (_A_a1,_A_a2,_A_a3,_A_a4,_A_a5);
254 { return catcher_(); }
257 template <class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6>
258 typename deduce_result_type<T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6>::type
259 operator()(T_arg1 _A_a1,T_arg2 _A_a2,T_arg3 _A_a3,T_arg4 _A_a4,T_arg5 _A_a5,T_arg6 _A_a6)
263 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass,typename type_trait<T_arg4>::pass,typename type_trait<T_arg5>::pass,typename type_trait<T_arg6>::pass>
264 (_A_a1,_A_a2,_A_a3,_A_a4,_A_a5,_A_a6);
267 { return catcher_(); }
270 template <class T_arg1,class T_arg2,class T_arg3,class T_arg4,class T_arg5,class T_arg6,class T_arg7>
271 typename deduce_result_type<T_arg1,T_arg2,T_arg3,T_arg4,T_arg5,T_arg6,T_arg7>::type
272 operator()(T_arg1 _A_a1,T_arg2 _A_a2,T_arg3 _A_a3,T_arg4 _A_a4,T_arg5 _A_a5,T_arg6 _A_a6,T_arg7 _A_a7)
276 return this->functor_.SIGC_WORKAROUND_OPERATOR_PARENTHESES<typename type_trait<T_arg1>::pass,typename type_trait<T_arg2>::pass,typename type_trait<T_arg3>::pass,typename type_trait<T_arg4>::pass,typename type_trait<T_arg5>::pass,typename type_trait<T_arg6>::pass,typename type_trait<T_arg7>::pass>
277 (_A_a1,_A_a2,_A_a3,_A_a4,_A_a5,_A_a6,_A_a7);
280 { return catcher_(); }
283 exception_catch_functor() {}
284 exception_catch_functor(const T_functor& _A_func,
285 const T_catcher& _A_catcher)
286 : adapts<T_functor>(_A_func), catcher_(_A_catcher)
288 ~exception_catch_functor() {}
294 template <class T_functor, class T_catcher>
295 void exception_catch_functor<T_functor, T_catcher, void>::operator()()
298 { this->functor_(); } // I don't understand why void return doesn't work here (Martin)
300 { this->catcher_(); }
304 template <class T_action, class T_functor, class T_catcher, class T_return>
305 void visit_each(const T_action& _A_action,
306 const exception_catch_functor<T_functor, T_catcher, T_return>& _A_target)
308 visit_each(_A_action, _A_target.functor_);
309 visit_each(_A_action, _A_target.catcher_);
313 template <class T_functor, class T_catcher>
314 inline exception_catch_functor<T_functor, T_catcher>
315 exception_catch(const T_functor& _A_func, const T_catcher& _A_catcher)
316 { return exception_catch_functor<T_functor, T_catcher>(_A_func, _A_catcher); }
318 } /* namespace sigc */
319 #endif /* _SIGC_ADAPTORS_MACROS_EXCEPTION_CATCHHM4_ */