|
1 // -- Boost Lambda Library -- exceptions.hpp ---------------- |
|
2 // |
|
3 // Copyright (C) 2000 Gary Powell (gwpowell@hotmail.com) |
|
4 // Copyright (C) 1999, 2000 Jaakko Järvi (jaakko.jarvi@cs.utu.fi) |
|
5 // |
|
6 // Distributed under the Boost Software License, Version 1.0. (See |
|
7 // accompanying file LICENSE_1_0.txt or copy at |
|
8 // http://www.boost.org/LICENSE_1_0.txt) |
|
9 // |
|
10 // For more information, see http://www.boost.org |
|
11 |
|
12 // ----------------------------------------------------- |
|
13 |
|
14 #if !defined(BOOST_LAMBDA_EXCEPTIONS_HPP) |
|
15 #define BOOST_LAMBDA_EXCEPTIONS_HPP |
|
16 |
|
17 #include "boost/lambda/detail/control_constructs_common.hpp" |
|
18 |
|
19 namespace boost { |
|
20 namespace lambda { |
|
21 |
|
22 typedef lambda_functor<placeholder<EXCEPTION> > placeholderE_type; |
|
23 |
|
24 namespace { |
|
25 boost::lambda::placeholderE_type freeE; |
|
26 boost::lambda::placeholderE_type& _e = freeE; |
|
27 } |
|
28 |
|
29 // -- exception related actions ------------------- |
|
30 |
|
31 // catch actions. |
|
32 template <class Catch1, class Catch2 = null_type, class Catch3 = null_type, |
|
33 class Catch4 = null_type, class Catch5 = null_type, |
|
34 class Catch6 = null_type, class Catch7 = null_type, |
|
35 class Catch8 = null_type, class Catch9 = null_type, |
|
36 class Catch10 = null_type> |
|
37 struct catch_action {}; |
|
38 |
|
39 struct catch_all_action {}; |
|
40 |
|
41 template<class CatchActions> |
|
42 struct return_try_catch_action {}; |
|
43 |
|
44 template<class CatchActions> |
|
45 struct try_catch_action {}; |
|
46 |
|
47 // rethrow actions |
|
48 struct throw_new_action {}; |
|
49 struct rethrow_action {}; |
|
50 |
|
51 template<class ThrowType> struct throw_action; |
|
52 |
|
53 template<> |
|
54 struct throw_action<rethrow_action> { |
|
55 template<class RET> |
|
56 static RET apply() { |
|
57 throw; |
|
58 } |
|
59 }; |
|
60 |
|
61 template<> struct throw_action<throw_new_action> { |
|
62 template<class RET, class T> |
|
63 static RET apply(T& t) { |
|
64 throw t; |
|
65 } |
|
66 }; |
|
67 |
|
68 // return types for throw_actions -------------------------------------------- |
|
69 |
|
70 template<class T, class Any> |
|
71 struct |
|
72 return_type_N<throw_action<T>, Any> { |
|
73 typedef void type; |
|
74 }; |
|
75 |
|
76 |
|
77 // return types deductions ------------------------------------------------- |
|
78 |
|
79 // the return type of try_catch is the return type of the try lambda_functor |
|
80 // (the return types of try and catch parts must match unless try returns void |
|
81 // or the catch part throws for sure) |
|
82 |
|
83 // NOTE, the exception placeholder deduction rule is defined |
|
84 // in return_type_traits.hpp |
|
85 |
|
86 |
|
87 |
|
88 // defined in control_constructs |
|
89 class ifthenelse_action; |
|
90 |
|
91 namespace detail { |
|
92 |
|
93 // Templates for deducing, wether a lambda_functor throws inevitably of not - |
|
94 // This mechanism is needed to make the compiler happy about |
|
95 // return types of try and catch parts. |
|
96 |
|
97 // a lambda_functor throws for sure if: |
|
98 // - it is a throw expression |
|
99 // - it is a comma expression, and one of its arguments throws for sure |
|
100 // - it is an if_then_else expression and either the if statement or both |
|
101 // the then and else throw. |
|
102 // (there are other cases as well, but we do not cover them) |
|
103 // e.g. _1 + (rethrow(), 3) does throw for sure but this is not checked |
|
104 // This implies, that in such a case, the return types of try and catch parts |
|
105 // must match if the try part returns other than void. |
|
106 // (Such checks could be done though) |
|
107 |
|
108 template <class Arg> |
|
109 struct throws_for_sure_phase2 { |
|
110 static const bool value = false; |
|
111 }; |
|
112 |
|
113 template <int N, class ThrowType, class Args> |
|
114 struct throws_for_sure_phase2< |
|
115 lambda_functor< |
|
116 lambda_functor_base<action<N, throw_action<ThrowType> >, Args> |
|
117 > |
|
118 > |
|
119 { |
|
120 static const bool value = true; |
|
121 }; |
|
122 |
|
123 // Both then and else or the if throw of an if_then_else. |
|
124 template <class Args> |
|
125 struct throws_for_sure_phase2< |
|
126 lambda_functor< |
|
127 lambda_functor_base< |
|
128 ifthenelse_action, Args |
|
129 > |
|
130 > |
|
131 > |
|
132 { |
|
133 static const bool value = |
|
134 throws_for_sure_phase2< |
|
135 typename boost::tuples::element<0, Args>::type>::value |
|
136 || |
|
137 ( |
|
138 throws_for_sure_phase2< |
|
139 typename boost::tuples::element<1, Args>::type |
|
140 >::value |
|
141 && |
|
142 throws_for_sure_phase2< |
|
143 typename boost::tuples::element<2, Args>::type |
|
144 >::value |
|
145 ); |
|
146 }; |
|
147 |
|
148 template <class Args> |
|
149 struct throws_for_sure_phase2< |
|
150 lambda_functor< |
|
151 lambda_functor_base< other_action<comma_action>, Args> |
|
152 > |
|
153 > |
|
154 { |
|
155 static const bool value = |
|
156 throws_for_sure_phase2< |
|
157 typename boost::tuples::element<0, Args>::type |
|
158 >::value |
|
159 || |
|
160 throws_for_sure_phase2< |
|
161 typename boost::tuples::element<1, Args>::type |
|
162 >::value; |
|
163 }; |
|
164 |
|
165 // get rid of any qualifiers and references |
|
166 // lambda_functors should be stored like that, so this is to be extra sure |
|
167 template <class Arg> |
|
168 struct throws_for_sure { |
|
169 static const bool value |
|
170 = throws_for_sure_phase2< |
|
171 typename detail::remove_reference_and_cv<Arg>::type |
|
172 >::value; |
|
173 }; |
|
174 |
|
175 |
|
176 // -- return_or_throw templates ----------------------------- |
|
177 |
|
178 // false case, catch and try return types are incompatible |
|
179 // Now the catch part must throw for sure, otherwise a compile time error |
|
180 // occurs. |
|
181 template<bool is_conversion> |
|
182 struct return_or_throw_phase2 { |
|
183 template<class RET, class Arg, CALL_TEMPLATE_ARGS> |
|
184 static RET call(Arg& arg, CALL_FORMAL_ARGS) { |
|
185 BOOST_STATIC_ASSERT(throws_for_sure<Arg>::value); |
|
186 detail::select(arg, CALL_ACTUAL_ARGS); // this line throws |
|
187 throw 1; // this line is never performed, hence 1 is just a dummy |
|
188 // The line is needed to make compiler happy and not require |
|
189 // a matching return type |
|
190 } |
|
191 }; |
|
192 |
|
193 // the try and catch return types are compatible |
|
194 template<> |
|
195 struct return_or_throw_phase2<true> { |
|
196 template<class RET, class Arg, CALL_TEMPLATE_ARGS> |
|
197 static RET call(Arg& arg, CALL_FORMAL_ARGS) { |
|
198 return detail::select(arg, CALL_ACTUAL_ARGS); |
|
199 } |
|
200 }; |
|
201 |
|
202 |
|
203 // the non-void case. Try part returns a value, so catch parts must |
|
204 // return a value of the same type or throw |
|
205 template<class RET, class ARG> |
|
206 struct return_or_throw { |
|
207 // Arg should be equal to ARG except that ARG may be a reference |
|
208 // to be sure, that there are no suprises for peculiarly defined return types |
|
209 // ARG is passed explicitely |
|
210 template<class Arg, CALL_TEMPLATE_ARGS> |
|
211 static RET call(Arg& arg, CALL_FORMAL_ARGS) |
|
212 { |
|
213 // typedef typename Arg::return_type<ARG, open_args<A&, B&, C&> >::type RT; |
|
214 typedef typename as_lambda_functor<ARG>::type lf_type; |
|
215 typedef typename lf_type::inherited::template |
|
216 sig<tuple<CALL_REFERENCE_TYPES> >::type RT; |
|
217 |
|
218 return |
|
219 return_or_throw_phase2< |
|
220 ::boost::is_convertible<RT, RET>::value |
|
221 >::template call<RET>(arg, CALL_ACTUAL_ARGS); |
|
222 } |
|
223 }; |
|
224 |
|
225 // if try part returns void, we do not return the catch parts either |
|
226 template<class ARG> |
|
227 struct return_or_throw<void, ARG> { |
|
228 template<class Arg, CALL_TEMPLATE_ARGS> |
|
229 static void call(Arg& arg, CALL_FORMAL_ARGS) { detail::select(arg, CALL_ACTUAL_ARGS); } |
|
230 }; |
|
231 |
|
232 } // end detail |
|
233 |
|
234 // Throwing exceptions --------------------------------------------- |
|
235 |
|
236 namespace detail { |
|
237 |
|
238 template <class T> struct catch_block {}; |
|
239 struct catch_all_block {}; |
|
240 |
|
241 template <class T> struct exception_catch_tag {}; |
|
242 |
|
243 // normal catch block is represented as |
|
244 // tagged_lambda_functor<exception_catch_tag<catch_type<T> > >, LambdaFunctor> |
|
245 |
|
246 // the default catch all block as: |
|
247 // tagged_lambda_functor<exception_catch_tag<catch_all_block> >, LambdaFunctor> |
|
248 |
|
249 |
|
250 } // end detail |
|
251 |
|
252 // the code is RETHROW, this ensures that a compile time error results, |
|
253 // if this lambda_functor is used outside a delayed catch_expression |
|
254 inline const |
|
255 lambda_functor< |
|
256 lambda_functor_base< |
|
257 action<0, throw_action<rethrow_action> >, |
|
258 null_type |
|
259 > |
|
260 > |
|
261 rethrow() { |
|
262 return |
|
263 lambda_functor_base< |
|
264 action<0, throw_action<rethrow_action> >, |
|
265 null_type |
|
266 > |
|
267 ( null_type() ); |
|
268 } |
|
269 |
|
270 template <class Arg1> |
|
271 inline const |
|
272 lambda_functor< |
|
273 lambda_functor_base< |
|
274 action<1, throw_action<throw_new_action> >, |
|
275 tuple<typename const_copy_argument<const Arg1>::type> |
|
276 > |
|
277 > |
|
278 throw_exception(const Arg1& a1) { |
|
279 return |
|
280 lambda_functor_base< |
|
281 action<1, throw_action<throw_new_action> >, |
|
282 tuple<typename const_copy_argument<const Arg1>::type> |
|
283 > |
|
284 ( tuple<typename const_copy_argument<const Arg1>::type>(a1)); |
|
285 } |
|
286 |
|
287 // create catch blocks |
|
288 template <class CatchType, class Arg> |
|
289 inline const |
|
290 tagged_lambda_functor< |
|
291 detail::exception_catch_tag<detail::catch_block<CatchType> >, |
|
292 lambda_functor<Arg> |
|
293 > |
|
294 catch_exception(const lambda_functor<Arg>& a) { |
|
295 // the third placeholder cannot be used in catch_exception |
|
296 // BOOST_STATIC_ASSERT((!has_placeholder<Arg, THIRD>::value)); |
|
297 return |
|
298 tagged_lambda_functor< |
|
299 detail::exception_catch_tag<detail::catch_block<CatchType> >, |
|
300 lambda_functor<Arg> |
|
301 > (a); |
|
302 } |
|
303 |
|
304 // catch and do nothing case. |
|
305 template <class CatchType> |
|
306 inline const |
|
307 tagged_lambda_functor< |
|
308 detail::exception_catch_tag<detail::catch_block<CatchType> >, |
|
309 lambda_functor< |
|
310 lambda_functor_base< |
|
311 do_nothing_action, |
|
312 null_type |
|
313 > |
|
314 > |
|
315 > |
|
316 catch_exception() { |
|
317 return |
|
318 tagged_lambda_functor< |
|
319 detail::exception_catch_tag<detail::catch_block<CatchType> >, |
|
320 lambda_functor< |
|
321 lambda_functor_base< |
|
322 do_nothing_action, |
|
323 null_type |
|
324 > |
|
325 > |
|
326 > (); |
|
327 } |
|
328 |
|
329 // create catch(...) blocks |
|
330 template <class Arg> |
|
331 inline const |
|
332 tagged_lambda_functor< |
|
333 detail::exception_catch_tag<detail::catch_all_block>, |
|
334 lambda_functor<Arg> |
|
335 > |
|
336 catch_all(const lambda_functor<Arg>& a) { |
|
337 // the third placeholder cannot be used in catch_exception |
|
338 BOOST_STATIC_ASSERT((!has_placeholder<Arg, THIRD>::value)); |
|
339 return |
|
340 tagged_lambda_functor< |
|
341 detail::exception_catch_tag<detail::catch_all_block>, |
|
342 lambda_functor<Arg> |
|
343 > (a); |
|
344 } |
|
345 |
|
346 // catch(...) and do nothing case. |
|
347 inline const |
|
348 tagged_lambda_functor< |
|
349 detail::exception_catch_tag<detail::catch_all_block>, |
|
350 lambda_functor< |
|
351 lambda_functor_base< |
|
352 do_nothing_action, |
|
353 null_type |
|
354 > |
|
355 > |
|
356 > |
|
357 catch_all() { |
|
358 return |
|
359 tagged_lambda_functor< |
|
360 detail::exception_catch_tag<detail::catch_all_block>, |
|
361 lambda_functor< |
|
362 lambda_functor_base< |
|
363 do_nothing_action, |
|
364 null_type |
|
365 > |
|
366 > |
|
367 > (); |
|
368 } |
|
369 |
|
370 // try_catch functions -------------------------------- |
|
371 // The second -> N argument(s) are must be catch lambda_functors |
|
372 template <class TryArg, class Catch1, class LF1> |
|
373 inline const |
|
374 lambda_functor< |
|
375 lambda_functor_base< |
|
376 action<2, try_catch_action<catch_action<Catch1> > >, |
|
377 tuple<lambda_functor<TryArg>, LF1> |
|
378 > |
|
379 > |
|
380 try_catch( |
|
381 const lambda_functor<TryArg>& a1, |
|
382 const tagged_lambda_functor<detail::exception_catch_tag<Catch1>, LF1>& a2) |
|
383 { |
|
384 return |
|
385 lambda_functor_base< |
|
386 action<2, try_catch_action<catch_action<Catch1> > >, |
|
387 tuple<lambda_functor<TryArg>, LF1> |
|
388 > |
|
389 ( tuple< lambda_functor<TryArg>, LF1>(a1, a2)); |
|
390 } |
|
391 |
|
392 template <class TryArg, class Catch1, class LF1, |
|
393 class Catch2, class LF2> |
|
394 inline const |
|
395 lambda_functor< |
|
396 lambda_functor_base< |
|
397 action<3, try_catch_action<catch_action<detail::catch_block<Catch1>, Catch2> > >, |
|
398 tuple<lambda_functor<TryArg>, LF1, LF2> |
|
399 > |
|
400 > |
|
401 try_catch( |
|
402 const lambda_functor<TryArg>& a1, |
|
403 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, |
|
404 const tagged_lambda_functor<detail::exception_catch_tag<Catch2>, LF2>& a3) |
|
405 { |
|
406 return |
|
407 lambda_functor_base< |
|
408 action<3, try_catch_action<catch_action<detail::catch_block<Catch1>, Catch2> > >, |
|
409 tuple<lambda_functor<TryArg>, LF1, LF2> |
|
410 > |
|
411 ( tuple<lambda_functor<TryArg>, LF1, LF2>(a1, a2, a3)); |
|
412 } |
|
413 |
|
414 template <class TryArg, class Catch1, class LF1, |
|
415 class Catch2, class LF2, |
|
416 class Catch3, class LF3> |
|
417 inline const lambda_functor< |
|
418 lambda_functor_base< |
|
419 action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, Catch3> > >, |
|
420 tuple<lambda_functor<TryArg>, LF1, LF2, LF3> |
|
421 > |
|
422 > |
|
423 try_catch( |
|
424 const lambda_functor<TryArg>& a1, |
|
425 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, |
|
426 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, |
|
427 const tagged_lambda_functor<detail::exception_catch_tag<Catch3>, LF3>& a4) |
|
428 { |
|
429 return |
|
430 lambda_functor_base< |
|
431 action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, Catch3> > >, |
|
432 tuple<lambda_functor<TryArg>, LF1, LF2, LF3> |
|
433 > |
|
434 ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3>(a1, a2, a3, a4)); |
|
435 } |
|
436 |
|
437 template <class TryArg, class Catch1, class LF1, |
|
438 class Catch2, class LF2, |
|
439 class Catch3, class LF3, |
|
440 class Catch4, class LF4> |
|
441 inline const |
|
442 lambda_functor< |
|
443 lambda_functor_base< |
|
444 action< |
|
445 5, |
|
446 try_catch_action< |
|
447 catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, Catch4> |
|
448 > |
|
449 >, |
|
450 tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4> |
|
451 > |
|
452 > |
|
453 try_catch( |
|
454 const lambda_functor<TryArg>& a1, |
|
455 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, |
|
456 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, |
|
457 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, |
|
458 const tagged_lambda_functor<detail::exception_catch_tag<Catch4>, LF4>& a5) |
|
459 { |
|
460 return |
|
461 lambda_functor_base< |
|
462 action< |
|
463 5, |
|
464 try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, Catch4> > |
|
465 >, |
|
466 tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4> |
|
467 > |
|
468 ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4>(a1, a2, a3, a4, a5)); |
|
469 } |
|
470 |
|
471 template <class TryArg, class Catch1, class LF1, |
|
472 class Catch2, class LF2, |
|
473 class Catch3, class LF3, |
|
474 class Catch4, class LF4, |
|
475 class Catch5, class LF5> |
|
476 inline const |
|
477 lambda_functor< |
|
478 lambda_functor_base< |
|
479 action< |
|
480 6, |
|
481 try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, Catch5> > |
|
482 >, |
|
483 tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5> |
|
484 > |
|
485 > |
|
486 try_catch( |
|
487 const lambda_functor<TryArg>& a1, |
|
488 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, |
|
489 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, |
|
490 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, |
|
491 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, |
|
492 const tagged_lambda_functor<detail::exception_catch_tag<Catch5>, LF5>& a6) |
|
493 { |
|
494 return |
|
495 lambda_functor_base< |
|
496 action< |
|
497 6, |
|
498 try_catch_action< |
|
499 catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, Catch5> |
|
500 > |
|
501 >, |
|
502 tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5> |
|
503 > |
|
504 ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5> |
|
505 (a1, a2, a3, a4, a5, a6) |
|
506 ); |
|
507 } |
|
508 |
|
509 template <class TryArg, class Catch1, class LF1, |
|
510 class Catch2, class LF2, |
|
511 class Catch3, class LF3, |
|
512 class Catch4, class LF4, |
|
513 class Catch5, class LF5, |
|
514 class Catch6, class LF6> |
|
515 inline const |
|
516 lambda_functor< |
|
517 lambda_functor_base< |
|
518 action< |
|
519 7, |
|
520 try_catch_action< |
|
521 catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, Catch6> |
|
522 > |
|
523 >, |
|
524 tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6> |
|
525 > |
|
526 > |
|
527 try_catch( |
|
528 const lambda_functor<TryArg>& a1, |
|
529 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, |
|
530 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, |
|
531 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, |
|
532 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, |
|
533 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, |
|
534 const tagged_lambda_functor<detail::exception_catch_tag<Catch6>, LF6>& a7) |
|
535 { |
|
536 return |
|
537 lambda_functor_base< |
|
538 action< |
|
539 7, |
|
540 try_catch_action< |
|
541 catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>,Catch6> |
|
542 > |
|
543 >, |
|
544 tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6> |
|
545 > |
|
546 ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6> |
|
547 (a1, a2, a3, a4, a5, a6, a7)); |
|
548 } |
|
549 |
|
550 template <class TryArg, class Catch1, class LF1, |
|
551 class Catch2, class LF2, |
|
552 class Catch3, class LF3, |
|
553 class Catch4, class LF4, |
|
554 class Catch5, class LF5, |
|
555 class Catch6, class LF6, |
|
556 class Catch7, class LF7> |
|
557 inline const |
|
558 lambda_functor< |
|
559 lambda_functor_base< |
|
560 action< |
|
561 8, |
|
562 try_catch_action< |
|
563 catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, Catch7> |
|
564 > |
|
565 >, |
|
566 tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7> |
|
567 > |
|
568 > |
|
569 try_catch( |
|
570 const lambda_functor<TryArg>& a1, |
|
571 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, |
|
572 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, |
|
573 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, |
|
574 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, |
|
575 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, |
|
576 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch6> >, LF6>& a7, |
|
577 const tagged_lambda_functor<detail::exception_catch_tag<Catch7>, LF7>& a8) |
|
578 { |
|
579 return |
|
580 lambda_functor_base< |
|
581 action< |
|
582 8, |
|
583 try_catch_action< |
|
584 catch_action< |
|
585 detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, Catch7 |
|
586 > |
|
587 > |
|
588 >, |
|
589 tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7> |
|
590 > |
|
591 ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7> |
|
592 (a1, a2, a3, a4, a5, a6, a7, a8)); |
|
593 } |
|
594 |
|
595 template <class TryArg, class Catch1, class LF1, |
|
596 class Catch2, class LF2, |
|
597 class Catch3, class LF3, |
|
598 class Catch4, class LF4, |
|
599 class Catch5, class LF5, |
|
600 class Catch6, class LF6, |
|
601 class Catch7, class LF7, |
|
602 class Catch8, class LF8> |
|
603 inline const |
|
604 lambda_functor< |
|
605 lambda_functor_base< |
|
606 action< |
|
607 9, |
|
608 try_catch_action< |
|
609 catch_action< |
|
610 detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, detail::catch_block<Catch7>, Catch8 |
|
611 > |
|
612 > |
|
613 >, |
|
614 tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8> |
|
615 > |
|
616 > |
|
617 try_catch( |
|
618 const lambda_functor<TryArg>& a1, |
|
619 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, |
|
620 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, |
|
621 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, |
|
622 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, |
|
623 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, |
|
624 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch6> >, LF6>& a7, |
|
625 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch7> >, LF7>& a8, |
|
626 const tagged_lambda_functor<detail::exception_catch_tag<Catch8>, LF8>& a9) |
|
627 { |
|
628 return |
|
629 lambda_functor_base< |
|
630 action< |
|
631 9, |
|
632 try_catch_action< |
|
633 catch_action< |
|
634 detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, detail::catch_block<Catch7>, Catch8 |
|
635 > |
|
636 > |
|
637 >, |
|
638 tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8> |
|
639 > |
|
640 ( tuple<lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8> |
|
641 (a1, a2, a3, a4, a5, a6, a7, a8, a9)); |
|
642 } |
|
643 |
|
644 template <class TryArg, class Catch1, class LF1, |
|
645 class Catch2, class LF2, |
|
646 class Catch3, class LF3, |
|
647 class Catch4, class LF4, |
|
648 class Catch5, class LF5, |
|
649 class Catch6, class LF6, |
|
650 class Catch7, class LF7, |
|
651 class Catch8, class LF8, |
|
652 class Catch9, class LF9> |
|
653 inline const |
|
654 lambda_functor< |
|
655 lambda_functor_base< |
|
656 action< |
|
657 10, |
|
658 try_catch_action< |
|
659 catch_action< |
|
660 detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, detail::catch_block<Catch7>, detail::catch_block<Catch8>, |
|
661 Catch9 |
|
662 > |
|
663 > |
|
664 >, |
|
665 tuple< |
|
666 lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8, LF9 |
|
667 > |
|
668 > |
|
669 > |
|
670 try_catch( |
|
671 const lambda_functor<TryArg>& a1, |
|
672 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch1> >, LF1>& a2, |
|
673 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch2> >, LF2>& a3, |
|
674 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch3> >, LF3>& a4, |
|
675 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch4> >, LF4>& a5, |
|
676 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch5> >, LF5>& a6, |
|
677 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch6> >, LF6>& a7, |
|
678 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch7> >, LF7>& a8, |
|
679 const tagged_lambda_functor<detail::exception_catch_tag<detail::catch_block<Catch8> >, LF8>& a9, |
|
680 const tagged_lambda_functor<detail::exception_catch_tag<Catch9>, LF9>& a10) |
|
681 { |
|
682 return |
|
683 lambda_functor_base< |
|
684 action< |
|
685 10, |
|
686 try_catch_action< |
|
687 catch_action< |
|
688 detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, detail::catch_block<Catch7>, detail::catch_block<Catch8>, |
|
689 Catch9 |
|
690 > |
|
691 > |
|
692 >, |
|
693 tuple< |
|
694 lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8, LF9 |
|
695 > |
|
696 > |
|
697 ( tuple< |
|
698 lambda_functor<TryArg>, LF1, LF2, LF3, LF4, LF5, LF6, LF7, LF8, LF9 |
|
699 >(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)); |
|
700 } |
|
701 |
|
702 |
|
703 // --------------------------------------------------------------------------- |
|
704 // Specializations for lambda_functor_base of try_catch ---------------------- |
|
705 |
|
706 // 1 catch type case |
|
707 |
|
708 template<class Args, class Catch1> |
|
709 class lambda_functor_base< |
|
710 action<2, try_catch_action<catch_action<detail::catch_block<Catch1> > > >, |
|
711 Args |
|
712 > |
|
713 { |
|
714 public: |
|
715 Args args; |
|
716 public: |
|
717 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
718 |
|
719 // the return type of try_catch is the return type of the try lambda_functor |
|
720 // (the return types of try and catch parts must match unless try returns void |
|
721 // or the catch part throws for sure) |
|
722 |
|
723 template <class SigArgs> struct sig { |
|
724 typedef typename |
|
725 as_lambda_functor< |
|
726 typename boost::tuples::element<0, Args>::type |
|
727 >::type lf_type; |
|
728 |
|
729 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
730 }; |
|
731 |
|
732 template<class RET, CALL_TEMPLATE_ARGS> |
|
733 RET call(CALL_FORMAL_ARGS) const { |
|
734 try |
|
735 { |
|
736 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
737 } |
|
738 catch (Catch1& e) |
|
739 { |
|
740 return |
|
741 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
742 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
743 } |
|
744 } |
|
745 }; |
|
746 |
|
747 |
|
748 |
|
749 template<class Args> |
|
750 class lambda_functor_base<action<2, try_catch_action<catch_action<detail::catch_all_block> > >, Args> { |
|
751 public: |
|
752 Args args; |
|
753 public: |
|
754 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
755 |
|
756 template <class SigArgs> struct sig { |
|
757 typedef typename |
|
758 as_lambda_functor< |
|
759 typename boost::tuples::element<0, Args>::type |
|
760 >::type lf_type; |
|
761 |
|
762 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
763 }; |
|
764 |
|
765 template<class RET, CALL_TEMPLATE_ARGS> |
|
766 RET call(CALL_FORMAL_ARGS) const { |
|
767 try |
|
768 { |
|
769 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
770 } |
|
771 catch (...) |
|
772 { |
|
773 return |
|
774 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
775 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS); |
|
776 } |
|
777 } |
|
778 }; |
|
779 |
|
780 |
|
781 // 2 catch types case |
|
782 template<class Args, class Catch1, class Catch2> |
|
783 class lambda_functor_base<action<3, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2> > > >, Args> { |
|
784 public: |
|
785 Args args; |
|
786 public: |
|
787 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
788 |
|
789 template <class SigArgs> struct sig { |
|
790 typedef typename |
|
791 as_lambda_functor< |
|
792 typename boost::tuples::element<0, Args>::type |
|
793 >::type lf_type; |
|
794 |
|
795 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
796 }; |
|
797 |
|
798 template<class RET, CALL_TEMPLATE_ARGS> |
|
799 RET call(CALL_FORMAL_ARGS) const { |
|
800 try |
|
801 { |
|
802 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
803 } |
|
804 catch (Catch1& e) |
|
805 { |
|
806 return |
|
807 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
808 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
809 } |
|
810 catch (Catch2& e) |
|
811 { |
|
812 return |
|
813 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
814 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
815 } |
|
816 } |
|
817 }; |
|
818 |
|
819 template<class Args, class Catch1> |
|
820 class lambda_functor_base<action<3, try_catch_action<catch_action<detail::catch_block<Catch1>,detail::catch_all_block> > >, Args> { |
|
821 public: |
|
822 Args args; |
|
823 public: |
|
824 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
825 |
|
826 template <class SigArgs> struct sig { |
|
827 typedef typename |
|
828 as_lambda_functor< |
|
829 typename boost::tuples::element<0, Args>::type |
|
830 >::type lf_type; |
|
831 |
|
832 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
833 }; |
|
834 |
|
835 template<class RET, CALL_TEMPLATE_ARGS> |
|
836 RET call(CALL_FORMAL_ARGS) const { |
|
837 try |
|
838 { |
|
839 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
840 } |
|
841 catch (Catch1& e) |
|
842 { |
|
843 return |
|
844 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
845 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
846 } |
|
847 catch (...) |
|
848 { |
|
849 return |
|
850 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
851 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS); |
|
852 } |
|
853 } |
|
854 }; |
|
855 |
|
856 // 3 catch types case |
|
857 template<class Args, class Catch1, class Catch2, class Catch3> |
|
858 class lambda_functor_base<action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3> > > >, Args> { |
|
859 public: |
|
860 Args args; |
|
861 public: |
|
862 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
863 |
|
864 template <class SigArgs> struct sig { |
|
865 typedef typename |
|
866 as_lambda_functor< |
|
867 typename boost::tuples::element<0, Args>::type |
|
868 >::type lf_type; |
|
869 |
|
870 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
871 }; |
|
872 |
|
873 template<class RET, CALL_TEMPLATE_ARGS> |
|
874 RET call(CALL_FORMAL_ARGS) const { |
|
875 try |
|
876 { |
|
877 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
878 } |
|
879 catch (Catch1& e) |
|
880 { |
|
881 return |
|
882 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
883 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
884 |
|
885 } |
|
886 catch (Catch2& e) |
|
887 { |
|
888 return |
|
889 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
890 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
891 |
|
892 } |
|
893 catch (Catch3& e) |
|
894 { |
|
895 return |
|
896 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
897 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
898 } |
|
899 } |
|
900 }; |
|
901 |
|
902 template<class Args, class Catch1, class Catch2> |
|
903 class lambda_functor_base<action<4, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>,detail::catch_all_block> > >, Args> { |
|
904 public: |
|
905 Args args; |
|
906 public: |
|
907 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
908 |
|
909 template <class SigArgs> struct sig { |
|
910 typedef typename |
|
911 as_lambda_functor< |
|
912 typename boost::tuples::element<0, Args>::type |
|
913 >::type lf_type; |
|
914 |
|
915 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
916 }; |
|
917 |
|
918 template<class RET, CALL_TEMPLATE_ARGS> |
|
919 RET call(CALL_FORMAL_ARGS) const { |
|
920 try |
|
921 { |
|
922 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
923 } |
|
924 catch (Catch1& e) |
|
925 { |
|
926 return |
|
927 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
928 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
929 } |
|
930 catch (Catch2& e) |
|
931 { |
|
932 return |
|
933 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
934 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
935 } |
|
936 catch (...) |
|
937 { |
|
938 return |
|
939 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
940 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS); |
|
941 } |
|
942 } |
|
943 }; |
|
944 |
|
945 // 4 catch types case |
|
946 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4> |
|
947 class lambda_functor_base<action<5, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4> > > >, Args> { |
|
948 public: |
|
949 Args args; |
|
950 public: |
|
951 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
952 |
|
953 template <class SigArgs> struct sig { |
|
954 typedef typename |
|
955 as_lambda_functor< |
|
956 typename boost::tuples::element<0, Args>::type |
|
957 >::type lf_type; |
|
958 |
|
959 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
960 }; |
|
961 |
|
962 template<class RET, CALL_TEMPLATE_ARGS> |
|
963 RET call(CALL_FORMAL_ARGS) const { |
|
964 try |
|
965 { |
|
966 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
967 } |
|
968 catch (Catch1& e) |
|
969 { |
|
970 return |
|
971 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
972 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
973 } |
|
974 catch (Catch2& e) |
|
975 { |
|
976 return |
|
977 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
978 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
979 } |
|
980 catch (Catch3& e) |
|
981 { |
|
982 return |
|
983 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
984 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
985 } |
|
986 catch (Catch4& e) |
|
987 { |
|
988 return |
|
989 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
990 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
991 } |
|
992 } |
|
993 }; |
|
994 |
|
995 template<class Args, class Catch1, class Catch2, class Catch3> |
|
996 class lambda_functor_base<action<5, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>,detail::catch_all_block> > >, Args> { |
|
997 public: |
|
998 Args args; |
|
999 public: |
|
1000 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1001 |
|
1002 template <class SigArgs> struct sig { |
|
1003 typedef typename |
|
1004 as_lambda_functor< |
|
1005 typename boost::tuples::element<0, Args>::type |
|
1006 >::type lf_type; |
|
1007 |
|
1008 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1009 }; |
|
1010 |
|
1011 template<class RET, CALL_TEMPLATE_ARGS> |
|
1012 RET call(CALL_FORMAL_ARGS) const { |
|
1013 try |
|
1014 { |
|
1015 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1016 } |
|
1017 catch (Catch1& e) |
|
1018 { |
|
1019 return |
|
1020 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1021 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1022 } |
|
1023 catch (Catch2& e) |
|
1024 { |
|
1025 return |
|
1026 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1027 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1028 } |
|
1029 catch (Catch3& e) |
|
1030 { |
|
1031 return |
|
1032 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1033 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1034 } |
|
1035 catch (...) |
|
1036 { |
|
1037 return |
|
1038 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1039 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS); |
|
1040 } |
|
1041 } |
|
1042 }; |
|
1043 |
|
1044 // 5 catch types case |
|
1045 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5> |
|
1046 class lambda_functor_base<action<6, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5> > > >, Args> { |
|
1047 public: |
|
1048 Args args; |
|
1049 public: |
|
1050 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1051 |
|
1052 template <class SigArgs> struct sig { |
|
1053 typedef typename |
|
1054 as_lambda_functor< |
|
1055 typename boost::tuples::element<0, Args>::type |
|
1056 >::type lf_type; |
|
1057 |
|
1058 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1059 }; |
|
1060 |
|
1061 template<class RET, CALL_TEMPLATE_ARGS> |
|
1062 RET call(CALL_FORMAL_ARGS) const { |
|
1063 try |
|
1064 { |
|
1065 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1066 } |
|
1067 catch (Catch1& e) |
|
1068 { |
|
1069 return |
|
1070 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1071 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1072 } |
|
1073 catch (Catch2& e) |
|
1074 { |
|
1075 return |
|
1076 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1077 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1078 } |
|
1079 catch (Catch3& e) |
|
1080 { |
|
1081 return |
|
1082 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1083 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1084 } |
|
1085 catch (Catch4& e) |
|
1086 { |
|
1087 return |
|
1088 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1089 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1090 } |
|
1091 catch (Catch5& e) |
|
1092 { |
|
1093 return |
|
1094 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1095 ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1096 } |
|
1097 } |
|
1098 }; |
|
1099 |
|
1100 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4> |
|
1101 class lambda_functor_base<action<6, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>,detail::catch_all_block> > >, Args> { |
|
1102 public: |
|
1103 Args args; |
|
1104 public: |
|
1105 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1106 |
|
1107 template <class SigArgs> struct sig { |
|
1108 typedef typename |
|
1109 as_lambda_functor< |
|
1110 typename boost::tuples::element<0, Args>::type |
|
1111 >::type lf_type; |
|
1112 |
|
1113 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1114 }; |
|
1115 |
|
1116 template<class RET, CALL_TEMPLATE_ARGS> |
|
1117 RET call(CALL_FORMAL_ARGS) const { |
|
1118 try |
|
1119 { |
|
1120 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1121 } |
|
1122 catch (Catch1& e) |
|
1123 { |
|
1124 return |
|
1125 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1126 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1127 } |
|
1128 catch (Catch2& e) |
|
1129 { |
|
1130 return |
|
1131 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1132 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1133 } |
|
1134 catch (Catch3& e) |
|
1135 { |
|
1136 return |
|
1137 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1138 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1139 } |
|
1140 catch (Catch4& e) |
|
1141 { |
|
1142 return |
|
1143 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1144 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1145 } |
|
1146 catch (...) |
|
1147 { |
|
1148 return |
|
1149 detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> |
|
1150 ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS); |
|
1151 } |
|
1152 } |
|
1153 }; |
|
1154 |
|
1155 // 6 catch types case |
|
1156 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6> |
|
1157 class lambda_functor_base<action<7, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6> > > >, Args> { |
|
1158 public: |
|
1159 Args args; |
|
1160 public: |
|
1161 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1162 |
|
1163 template <class SigArgs> struct sig { |
|
1164 typedef typename |
|
1165 as_lambda_functor< |
|
1166 typename boost::tuples::element<0, Args>::type |
|
1167 >::type lf_type; |
|
1168 |
|
1169 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1170 }; |
|
1171 |
|
1172 template<class RET, CALL_TEMPLATE_ARGS> |
|
1173 RET call(CALL_FORMAL_ARGS) const { |
|
1174 try |
|
1175 { |
|
1176 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1177 } |
|
1178 catch (Catch1& e) |
|
1179 { |
|
1180 return |
|
1181 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1182 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1183 } |
|
1184 catch (Catch2& e) |
|
1185 { |
|
1186 return |
|
1187 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1188 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1189 } |
|
1190 catch (Catch3& e) |
|
1191 { |
|
1192 return |
|
1193 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1194 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1195 } |
|
1196 catch (Catch4& e) |
|
1197 { |
|
1198 return |
|
1199 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1200 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1201 } |
|
1202 catch (Catch5& e) |
|
1203 { |
|
1204 return |
|
1205 detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> |
|
1206 ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1207 } |
|
1208 catch (Catch6& e) |
|
1209 { |
|
1210 return |
|
1211 detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> |
|
1212 ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1213 } |
|
1214 } |
|
1215 }; |
|
1216 |
|
1217 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5> |
|
1218 class lambda_functor_base<action<7, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>,detail::catch_all_block> > >, Args> { |
|
1219 public: |
|
1220 Args args; |
|
1221 public: |
|
1222 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1223 |
|
1224 template <class SigArgs> struct sig { |
|
1225 typedef typename |
|
1226 as_lambda_functor< |
|
1227 typename boost::tuples::element<0, Args>::type |
|
1228 >::type lf_type; |
|
1229 |
|
1230 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1231 }; |
|
1232 |
|
1233 template<class RET, CALL_TEMPLATE_ARGS> |
|
1234 RET call(CALL_FORMAL_ARGS) const { |
|
1235 try |
|
1236 { |
|
1237 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1238 } |
|
1239 catch (Catch1& e) |
|
1240 { |
|
1241 return |
|
1242 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1243 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1244 } |
|
1245 catch (Catch2& e) |
|
1246 { |
|
1247 return |
|
1248 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1249 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1250 } |
|
1251 catch (Catch3& e) |
|
1252 { |
|
1253 return |
|
1254 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1255 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1256 } |
|
1257 catch (Catch4& e) |
|
1258 { |
|
1259 return |
|
1260 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1261 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1262 } |
|
1263 catch (Catch5& e) |
|
1264 { |
|
1265 return |
|
1266 detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> |
|
1267 ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1268 } |
|
1269 catch (...) |
|
1270 { |
|
1271 return |
|
1272 detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> |
|
1273 ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS); |
|
1274 } |
|
1275 } |
|
1276 }; |
|
1277 |
|
1278 // 7 catch types case |
|
1279 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, |
|
1280 class Catch7> |
|
1281 class lambda_functor_base<action<8, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, detail::catch_block<Catch7> > > >, Args> { |
|
1282 public: |
|
1283 Args args; |
|
1284 public: |
|
1285 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1286 |
|
1287 template <class SigArgs> struct sig { |
|
1288 typedef typename |
|
1289 as_lambda_functor< |
|
1290 typename boost::tuples::element<0, Args>::type |
|
1291 >::type lf_type; |
|
1292 |
|
1293 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1294 }; |
|
1295 |
|
1296 template<class RET, CALL_TEMPLATE_ARGS> |
|
1297 RET call(CALL_FORMAL_ARGS) const { |
|
1298 try |
|
1299 { |
|
1300 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1301 } |
|
1302 catch (Catch1& e) |
|
1303 { |
|
1304 return |
|
1305 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1306 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1307 } |
|
1308 catch (Catch2& e) |
|
1309 { |
|
1310 return |
|
1311 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1312 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1313 } |
|
1314 catch (Catch3& e) |
|
1315 { |
|
1316 return |
|
1317 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1318 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1319 } |
|
1320 catch (Catch4& e) |
|
1321 { |
|
1322 return |
|
1323 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1324 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1325 } |
|
1326 catch (Catch5& e) |
|
1327 { |
|
1328 return |
|
1329 detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> |
|
1330 ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1331 } |
|
1332 catch (Catch6& e) |
|
1333 { |
|
1334 return |
|
1335 detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> |
|
1336 ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1337 } |
|
1338 catch (Catch7& e) |
|
1339 { |
|
1340 return |
|
1341 detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> |
|
1342 ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1343 } |
|
1344 } |
|
1345 }; |
|
1346 |
|
1347 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6> |
|
1348 class lambda_functor_base<action<8, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, |
|
1349 detail::catch_all_block> > >, Args> { |
|
1350 public: |
|
1351 Args args; |
|
1352 public: |
|
1353 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1354 |
|
1355 template <class SigArgs> struct sig { |
|
1356 typedef typename |
|
1357 as_lambda_functor< |
|
1358 typename boost::tuples::element<0, Args>::type |
|
1359 >::type lf_type; |
|
1360 |
|
1361 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1362 }; |
|
1363 |
|
1364 template<class RET, CALL_TEMPLATE_ARGS> |
|
1365 RET call(CALL_FORMAL_ARGS) const { |
|
1366 try |
|
1367 { |
|
1368 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1369 } |
|
1370 catch (Catch1& e) |
|
1371 { |
|
1372 return |
|
1373 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1374 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1375 } |
|
1376 catch (Catch2& e) |
|
1377 { |
|
1378 return |
|
1379 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1380 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1381 } |
|
1382 catch (Catch3& e) |
|
1383 { |
|
1384 return |
|
1385 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1386 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1387 } |
|
1388 catch (Catch4& e) |
|
1389 { |
|
1390 return |
|
1391 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1392 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1393 } |
|
1394 catch (Catch5& e) |
|
1395 { |
|
1396 return |
|
1397 detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> |
|
1398 ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1399 } |
|
1400 catch (Catch6& e) |
|
1401 { |
|
1402 return |
|
1403 detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> |
|
1404 ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1405 } |
|
1406 catch (...) |
|
1407 { |
|
1408 return |
|
1409 detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> |
|
1410 ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS); |
|
1411 } |
|
1412 } |
|
1413 }; |
|
1414 |
|
1415 // 8 catch types case |
|
1416 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, |
|
1417 class Catch7, class Catch8> |
|
1418 class lambda_functor_base<action<9, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, |
|
1419 detail::catch_block<Catch7>, detail::catch_block<Catch8> > > >, Args> { |
|
1420 public: |
|
1421 Args args; |
|
1422 public: |
|
1423 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1424 |
|
1425 template <class SigArgs> struct sig { |
|
1426 typedef typename |
|
1427 as_lambda_functor< |
|
1428 typename boost::tuples::element<0, Args>::type |
|
1429 >::type lf_type; |
|
1430 |
|
1431 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1432 }; |
|
1433 |
|
1434 template<class RET, CALL_TEMPLATE_ARGS> |
|
1435 RET call(CALL_FORMAL_ARGS) const { |
|
1436 try |
|
1437 { |
|
1438 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1439 } |
|
1440 catch (Catch1& e) |
|
1441 { |
|
1442 return |
|
1443 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1444 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1445 } |
|
1446 catch (Catch2& e) |
|
1447 { |
|
1448 return |
|
1449 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1450 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1451 } |
|
1452 catch (Catch3& e) |
|
1453 { |
|
1454 return |
|
1455 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1456 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1457 } |
|
1458 catch (Catch4& e) |
|
1459 { |
|
1460 return |
|
1461 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1462 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1463 } |
|
1464 catch (Catch5& e) |
|
1465 { |
|
1466 return |
|
1467 detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> |
|
1468 ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1469 } |
|
1470 catch (Catch6& e) |
|
1471 { |
|
1472 return |
|
1473 detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> |
|
1474 ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1475 } |
|
1476 catch (Catch7& e) |
|
1477 { |
|
1478 return |
|
1479 detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> |
|
1480 ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1481 } |
|
1482 catch (Catch8& e) |
|
1483 { |
|
1484 return |
|
1485 detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> |
|
1486 ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1487 } |
|
1488 } |
|
1489 }; |
|
1490 |
|
1491 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, |
|
1492 class Catch7> |
|
1493 class lambda_functor_base<action<9, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, |
|
1494 detail::catch_block<Catch7>,detail::catch_all_block> > >, Args> { |
|
1495 public: |
|
1496 Args args; |
|
1497 public: |
|
1498 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1499 |
|
1500 template <class SigArgs> struct sig { |
|
1501 typedef typename |
|
1502 as_lambda_functor< |
|
1503 typename boost::tuples::element<0, Args>::type |
|
1504 >::type lf_type; |
|
1505 |
|
1506 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1507 }; |
|
1508 |
|
1509 template<class RET, CALL_TEMPLATE_ARGS> |
|
1510 RET call(CALL_FORMAL_ARGS) const { |
|
1511 try |
|
1512 { |
|
1513 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1514 } |
|
1515 catch (Catch1& e) |
|
1516 { |
|
1517 return |
|
1518 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1519 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1520 } |
|
1521 catch (Catch2& e) |
|
1522 { |
|
1523 return |
|
1524 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1525 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1526 } |
|
1527 catch (Catch3& e) |
|
1528 { |
|
1529 return |
|
1530 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1531 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1532 } |
|
1533 catch (Catch4& e) |
|
1534 { |
|
1535 return |
|
1536 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1537 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1538 } |
|
1539 catch (Catch5& e) |
|
1540 { |
|
1541 return |
|
1542 detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> |
|
1543 ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1544 } |
|
1545 catch (Catch6& e) |
|
1546 { |
|
1547 return |
|
1548 detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> |
|
1549 ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1550 } |
|
1551 catch (Catch7& e) |
|
1552 { |
|
1553 return |
|
1554 detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> |
|
1555 ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1556 } |
|
1557 catch (...) |
|
1558 { |
|
1559 return |
|
1560 detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> |
|
1561 ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS); |
|
1562 } |
|
1563 } |
|
1564 }; |
|
1565 |
|
1566 // 9 catch types case |
|
1567 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, |
|
1568 class Catch7, class Catch8, class Catch9> |
|
1569 class lambda_functor_base<action<10, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, |
|
1570 detail::catch_block<Catch7>, detail::catch_block<Catch8>, detail::catch_block<Catch9> > > >, Args> { |
|
1571 public: |
|
1572 Args args; |
|
1573 public: |
|
1574 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1575 |
|
1576 template <class SigArgs> struct sig { |
|
1577 typedef typename |
|
1578 as_lambda_functor< |
|
1579 typename boost::tuples::element<0, Args>::type |
|
1580 >::type lf_type; |
|
1581 |
|
1582 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1583 }; |
|
1584 |
|
1585 template<class RET, CALL_TEMPLATE_ARGS> |
|
1586 RET call(CALL_FORMAL_ARGS) const { |
|
1587 try |
|
1588 { |
|
1589 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1590 } |
|
1591 catch (Catch1& e) |
|
1592 { |
|
1593 return |
|
1594 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1595 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1596 } |
|
1597 catch (Catch2& e) |
|
1598 { |
|
1599 return |
|
1600 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1601 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1602 } |
|
1603 catch (Catch3& e) |
|
1604 { |
|
1605 return |
|
1606 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1607 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1608 } |
|
1609 catch (Catch4& e) |
|
1610 { |
|
1611 return |
|
1612 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1613 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1614 } |
|
1615 catch (Catch5& e) |
|
1616 { |
|
1617 return |
|
1618 detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> |
|
1619 ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1620 } |
|
1621 catch (Catch6& e) |
|
1622 { |
|
1623 return |
|
1624 detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> |
|
1625 ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1626 } |
|
1627 catch (Catch7& e) |
|
1628 { |
|
1629 return |
|
1630 detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> |
|
1631 ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1632 } |
|
1633 catch (Catch8& e) |
|
1634 { |
|
1635 return |
|
1636 detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> |
|
1637 ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1638 } |
|
1639 catch (Catch9& e) |
|
1640 { |
|
1641 return |
|
1642 detail::return_or_throw<RET, typename ::boost::tuples::element<9, Args>::type> |
|
1643 ::call(::boost::tuples::get<9>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1644 } |
|
1645 } |
|
1646 }; |
|
1647 |
|
1648 template<class Args, class Catch1, class Catch2, class Catch3, class Catch4, class Catch5, class Catch6, |
|
1649 class Catch7, class Catch8> |
|
1650 class lambda_functor_base<action<10, try_catch_action<catch_action<detail::catch_block<Catch1>, detail::catch_block<Catch2>, detail::catch_block<Catch3>, detail::catch_block<Catch4>, detail::catch_block<Catch5>, detail::catch_block<Catch6>, |
|
1651 detail::catch_block<Catch7>, detail::catch_block<Catch8>,detail::catch_all_block> > >, Args> { |
|
1652 public: |
|
1653 Args args; |
|
1654 public: |
|
1655 explicit lambda_functor_base(const Args& a) : args(a) {} |
|
1656 |
|
1657 template <class SigArgs> struct sig { |
|
1658 typedef typename |
|
1659 as_lambda_functor< |
|
1660 typename boost::tuples::element<0, Args>::type |
|
1661 >::type lf_type; |
|
1662 |
|
1663 typedef typename lf_type::inherited::template sig<SigArgs>::type type; |
|
1664 }; |
|
1665 |
|
1666 template<class RET, CALL_TEMPLATE_ARGS> |
|
1667 RET call(CALL_FORMAL_ARGS) const { |
|
1668 try |
|
1669 { |
|
1670 return detail::select(::boost::tuples::get<0>(args), CALL_ACTUAL_ARGS); |
|
1671 } |
|
1672 catch (Catch1& e) |
|
1673 { |
|
1674 return |
|
1675 detail::return_or_throw<RET, typename ::boost::tuples::element<1, Args>::type> |
|
1676 ::call(::boost::tuples::get<1>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1677 } |
|
1678 catch (Catch2& e) |
|
1679 { |
|
1680 return |
|
1681 detail::return_or_throw<RET, typename ::boost::tuples::element<2, Args>::type> |
|
1682 ::call(::boost::tuples::get<2>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1683 } |
|
1684 catch (Catch3& e) |
|
1685 { |
|
1686 return |
|
1687 detail::return_or_throw<RET, typename ::boost::tuples::element<3, Args>::type> |
|
1688 ::call(::boost::tuples::get<3>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1689 } |
|
1690 catch (Catch4& e) |
|
1691 { |
|
1692 return |
|
1693 detail::return_or_throw<RET, typename ::boost::tuples::element<4, Args>::type> |
|
1694 ::call(::boost::tuples::get<4>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1695 } |
|
1696 catch (Catch5& e) |
|
1697 { |
|
1698 return |
|
1699 detail::return_or_throw<RET, typename ::boost::tuples::element<5, Args>::type> |
|
1700 ::call(::boost::tuples::get<5>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1701 } |
|
1702 catch (Catch6& e) |
|
1703 { |
|
1704 return |
|
1705 detail::return_or_throw<RET, typename ::boost::tuples::element<6, Args>::type> |
|
1706 ::call(::boost::tuples::get<6>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1707 } |
|
1708 catch (Catch7& e) |
|
1709 { |
|
1710 return |
|
1711 detail::return_or_throw<RET, typename ::boost::tuples::element<7, Args>::type> |
|
1712 ::call(::boost::tuples::get<7>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1713 } |
|
1714 catch (Catch8& e) |
|
1715 { |
|
1716 return |
|
1717 detail::return_or_throw<RET, typename ::boost::tuples::element<8, Args>::type> |
|
1718 ::call(::boost::tuples::get<8>(args), CALL_ACTUAL_ARGS_NO_ENV, e); |
|
1719 } |
|
1720 catch (...) |
|
1721 { |
|
1722 return |
|
1723 detail::return_or_throw<RET, typename ::boost::tuples::element<9, Args>::type> |
|
1724 ::call(::boost::tuples::get<9>(args), CALL_ACTUAL_ARGS); |
|
1725 } |
|
1726 } |
|
1727 }; |
|
1728 |
|
1729 |
|
1730 } // namespace lambda |
|
1731 } // namespace boost |
|
1732 |
|
1733 |
|
1734 #endif |
|
1735 |
|
1736 |
|
1737 |
|
1738 |
|
1739 |
|
1740 |