/src/contrib/boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp

http://pythonocc.googlecode.com/ · C++ Header · 101 lines · 75 code · 19 blank · 7 comment · 2 complexity · a770bb06c6f6bd4c7a90fa6aa73e9e24 MD5 · raw file

  1. /*=============================================================================
  2. Copyright (c) 2005-2007 Dan Marsden
  3. Copyright (c) 2005-2007 Joel de Guzman
  4. Distributed under the Boost Software License, Version 1.0. (See accompanying
  5. file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  6. ==============================================================================*/
  7. #ifndef BOOST_PP_IS_ITERATING
  8. #ifndef PHOENIX_STATEMENT_DETAIL_CATCH_ALL_EVAL_HPP
  9. #define PHOENIX_STATEMENT_DETAIL_CATCH_ALL_EVAL_HPP
  10. #include <boost/spirit/home/phoenix/core/limits.hpp>
  11. #include <boost/preprocessor/iteration/iterate.hpp>
  12. #include <boost/preprocessor/repetition/enum_params_with_a_default.hpp>
  13. #include <boost/preprocessor/repetition/enum_params_with_defaults.hpp>
  14. #include <boost/preprocessor/repetition/enum_params.hpp>
  15. #include <boost/preprocessor/repetition/enum_binary_params.hpp>
  16. #include <boost/preprocessor/repetition/repeat.hpp>
  17. #include <boost/preprocessor/dec.hpp>
  18. #include <boost/preprocessor/cat.hpp>
  19. #include <boost/mpl/void.hpp>
  20. namespace boost { namespace phoenix {
  21. class catch_all_eval
  22. {
  23. public:
  24. template<typename Env, typename TryBody,
  25. BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(PHOENIX_CATCH_LIMIT, typename CatchBody, mpl::void_),
  26. typename CatchAllBody = mpl::void_>
  27. struct result
  28. {
  29. typedef void type;
  30. };
  31. template<typename Rt, typename Env, typename TryBody,
  32. typename CatchAllBody>
  33. static void eval(
  34. const Env& env, TryBody& tryBody, CatchAllBody& catchAllBody)
  35. {
  36. try
  37. {
  38. tryBody.eval(env);
  39. }
  40. catch(...)
  41. {
  42. catchAllBody.eval(env);
  43. }
  44. }
  45. #define BOOST_PP_ITERATION_PARAMS_1 \
  46. (3, (1, PHOENIX_CATCH_LIMIT, "boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp"))
  47. #include BOOST_PP_ITERATE()
  48. };
  49. }}
  50. #endif
  51. #elif BOOST_PP_ITERATION_DEPTH() == 1
  52. #define PHOENIX_ITERATION BOOST_PP_ITERATION()
  53. template<typename Rt, typename Env, typename TryBody,
  54. BOOST_PP_ENUM_PARAMS(PHOENIX_ITERATION, typename CatchBody),
  55. typename CatchAllBody>
  56. static void eval(
  57. const Env& env, TryBody& tryBody,
  58. BOOST_PP_ENUM_BINARY_PARAMS(PHOENIX_ITERATION, CatchBody, catchBody),
  59. CatchAllBody& catchAllBody)
  60. {
  61. try
  62. {
  63. tryBody.eval(env);
  64. }
  65. #define BOOST_PP_ITERATION_PARAMS_2 \
  66. (3, (0, BOOST_PP_DEC(PHOENIX_ITERATION), "boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp"))
  67. #include BOOST_PP_ITERATE()
  68. catch(...)
  69. {
  70. catchAllBody.eval(env);
  71. }
  72. }
  73. #undef PHOENIX_ITERATION
  74. #elif BOOST_PP_ITERATION_DEPTH() == 2
  75. #define PHOENIX_ITERATION BOOST_PP_ITERATION()
  76. catch(typename BOOST_PP_CAT(CatchBody, PHOENIX_ITERATION)::exception_type&)
  77. {
  78. BOOST_PP_CAT(catchBody, PHOENIX_ITERATION).eval(env);
  79. }
  80. #undef PHOENIX_ITERATION
  81. #endif