Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2005-2007 Dan Marsden
|
Chris@16
|
3 Copyright (c) 2005-2007 Joel de Guzman
|
Chris@16
|
4
|
Chris@16
|
5 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
6 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
7 ==============================================================================*/
|
Chris@16
|
8
|
Chris@16
|
9 #ifndef PHOENIX_STATEMENT_TRY_CATCH_HPP
|
Chris@16
|
10 #define PHOENIX_STATEMENT_TRY_CATCH_HPP
|
Chris@16
|
11
|
Chris@16
|
12 #include <boost/spirit/home/phoenix/core/actor.hpp>
|
Chris@16
|
13 #include <boost/spirit/home/phoenix/core/composite.hpp>
|
Chris@16
|
14
|
Chris@16
|
15 #include <boost/fusion/include/push_back.hpp>
|
Chris@16
|
16 #include <boost/fusion/include/as_vector.hpp>
|
Chris@16
|
17
|
Chris@16
|
18 #include <boost/spirit/home/phoenix/statement/detail/catch_composite.hpp>
|
Chris@16
|
19 #include <boost/spirit/home/phoenix/statement/detail/catch_eval.hpp>
|
Chris@16
|
20 #include <boost/spirit/home/phoenix/statement/detail/catch_all_eval.hpp>
|
Chris@16
|
21
|
Chris@16
|
22 #if defined(BOOST_MSVC)
|
Chris@16
|
23 # pragma warning(push)
|
Chris@16
|
24 # pragma warning(disable:4355)
|
Chris@16
|
25 #endif
|
Chris@16
|
26
|
Chris@16
|
27 namespace boost { namespace phoenix {
|
Chris@16
|
28
|
Chris@16
|
29 template<typename Tuple> struct try_catch_composite;
|
Chris@16
|
30
|
Chris@16
|
31 namespace meta
|
Chris@16
|
32 {
|
Chris@16
|
33 template<typename Composite, typename Actor>
|
Chris@16
|
34 struct try_catch_composite_push_back
|
Chris@16
|
35 {
|
Chris@16
|
36 typedef typename Composite::base_type actor_tuple;
|
Chris@16
|
37 typedef try_catch_composite<
|
Chris@16
|
38 typename fusion::result_of::as_vector<
|
Chris@16
|
39 typename fusion::result_of::push_back<
|
Chris@16
|
40 actor_tuple, Actor>::type>::type> type;
|
Chris@16
|
41 };
|
Chris@16
|
42
|
Chris@16
|
43 template<typename Composite, typename Actor>
|
Chris@16
|
44 struct catch_all_composite_push_back
|
Chris@16
|
45 {
|
Chris@16
|
46 typedef typename Composite::base_type actor_tuple;
|
Chris@16
|
47
|
Chris@16
|
48 typedef composite<
|
Chris@16
|
49 catch_all_eval,
|
Chris@16
|
50 typename fusion::result_of::as_vector<
|
Chris@16
|
51 typename fusion::result_of::push_back<
|
Chris@16
|
52 actor_tuple, Actor>::type>::type> type;
|
Chris@16
|
53 };
|
Chris@16
|
54 }
|
Chris@16
|
55
|
Chris@16
|
56 namespace detail
|
Chris@16
|
57 {
|
Chris@16
|
58 struct try_catch_composite_push_back
|
Chris@16
|
59 {
|
Chris@16
|
60 template<typename Composite, typename Actor>
|
Chris@16
|
61 struct result
|
Chris@16
|
62 : meta::try_catch_composite_push_back<Composite, Actor>
|
Chris@16
|
63 {};
|
Chris@16
|
64
|
Chris@16
|
65 template<typename Composite, typename Actor>
|
Chris@16
|
66 typename result<Composite, Actor>::type
|
Chris@16
|
67 operator()(
|
Chris@16
|
68 const Composite& composite, const Actor& actor) const
|
Chris@16
|
69 {
|
Chris@16
|
70 typedef typename result<Composite, Actor>::type result;
|
Chris@16
|
71 return result(
|
Chris@16
|
72 fusion::as_vector(
|
Chris@16
|
73 fusion::push_back(composite, actor)));
|
Chris@16
|
74 }
|
Chris@16
|
75 };
|
Chris@16
|
76
|
Chris@16
|
77 struct catch_all_composite_push_back
|
Chris@16
|
78 {
|
Chris@16
|
79 template<typename Composite, typename Actor>
|
Chris@16
|
80 struct result
|
Chris@16
|
81 : meta::catch_all_composite_push_back<Composite, Actor>
|
Chris@16
|
82 {};
|
Chris@16
|
83
|
Chris@16
|
84 template<typename Composite, typename Actor>
|
Chris@16
|
85 typename result<Composite, Actor>::type
|
Chris@16
|
86 operator()(
|
Chris@16
|
87 const Composite& composite, const Actor& actor) const
|
Chris@16
|
88 {
|
Chris@16
|
89 typedef typename result<Composite, Actor>::type result;
|
Chris@16
|
90 return result(
|
Chris@16
|
91 fusion::as_vector(
|
Chris@16
|
92 fusion::push_back(composite, actor)));
|
Chris@16
|
93 }
|
Chris@16
|
94 };
|
Chris@16
|
95
|
Chris@16
|
96 }
|
Chris@16
|
97
|
Chris@16
|
98 detail::try_catch_composite_push_back const try_catch_composite_push_back
|
Chris@16
|
99 = detail::try_catch_composite_push_back();
|
Chris@16
|
100 detail::catch_all_composite_push_back const catch_all_composite_push_back
|
Chris@16
|
101 = detail::catch_all_composite_push_back();
|
Chris@16
|
102
|
Chris@16
|
103 template<typename Exception, typename SourceComposite>
|
Chris@16
|
104 struct catch_gen
|
Chris@16
|
105 {
|
Chris@16
|
106 explicit catch_gen(
|
Chris@16
|
107 const SourceComposite& sourceComposite)
|
Chris@16
|
108 : mSourceComposite(sourceComposite) { }
|
Chris@16
|
109
|
Chris@16
|
110 template<typename Actor>
|
Chris@16
|
111 actor<typename meta::try_catch_composite_push_back<
|
Chris@16
|
112 SourceComposite,
|
Chris@16
|
113 detail::catch_composite<Exception, Actor> >::type>
|
Chris@16
|
114 operator[](const Actor& actor) const
|
Chris@16
|
115 {
|
Chris@16
|
116 return try_catch_composite_push_back(
|
Chris@16
|
117 mSourceComposite, detail::catch_composite<Exception, Actor>(actor));
|
Chris@16
|
118 }
|
Chris@16
|
119
|
Chris@16
|
120 const SourceComposite& mSourceComposite;
|
Chris@16
|
121 };
|
Chris@16
|
122
|
Chris@16
|
123 template<typename SourceComposite>
|
Chris@16
|
124 struct catch_all_gen
|
Chris@16
|
125 {
|
Chris@16
|
126 explicit catch_all_gen(
|
Chris@16
|
127 const SourceComposite& sourceComposite)
|
Chris@16
|
128 : mSourceComposite(sourceComposite) { }
|
Chris@16
|
129
|
Chris@16
|
130 template<typename Actor>
|
Chris@16
|
131 actor<typename meta::catch_all_composite_push_back<SourceComposite, Actor>::type>
|
Chris@16
|
132 operator[](const Actor& actor) const
|
Chris@16
|
133 {
|
Chris@16
|
134 return catch_all_composite_push_back(
|
Chris@16
|
135 mSourceComposite, actor);
|
Chris@16
|
136 }
|
Chris@16
|
137
|
Chris@16
|
138 const SourceComposite& mSourceComposite;
|
Chris@16
|
139 };
|
Chris@16
|
140
|
Chris@16
|
141 template<typename Tuple>
|
Chris@16
|
142 struct try_catch_composite
|
Chris@16
|
143 : composite<catch_eval, Tuple>
|
Chris@16
|
144 {
|
Chris@16
|
145 explicit try_catch_composite(
|
Chris@16
|
146 const Tuple& t)
|
Chris@16
|
147 :
|
Chris@16
|
148 composite<catch_eval, Tuple>(t),
|
Chris@16
|
149 catch_all(*this) { }
|
Chris@16
|
150
|
Chris@16
|
151 try_catch_composite(
|
Chris@16
|
152 const try_catch_composite& rhs)
|
Chris@16
|
153 : composite<catch_eval, Tuple>(rhs),
|
Chris@16
|
154 catch_all(*this) { }
|
Chris@16
|
155
|
Chris@16
|
156 template<typename Exception>
|
Chris@16
|
157 catch_gen<Exception, try_catch_composite> catch_() const
|
Chris@16
|
158 {
|
Chris@16
|
159 return catch_gen<Exception, try_catch_composite>(
|
Chris@16
|
160 *this);
|
Chris@16
|
161 }
|
Chris@16
|
162
|
Chris@16
|
163 const catch_all_gen<try_catch_composite> catch_all;
|
Chris@16
|
164
|
Chris@16
|
165 private:
|
Chris@16
|
166 try_catch_composite& operator=(const try_catch_composite&);
|
Chris@16
|
167 };
|
Chris@16
|
168
|
Chris@16
|
169 struct try_gen
|
Chris@16
|
170 {
|
Chris@16
|
171 template<typename Try>
|
Chris@16
|
172 try_catch_composite<fusion::vector<Try> > operator[](
|
Chris@16
|
173 const Try& try_) const
|
Chris@16
|
174 {
|
Chris@16
|
175 typedef fusion::vector<Try> tuple_type;
|
Chris@16
|
176 return try_catch_composite<tuple_type>(
|
Chris@16
|
177 tuple_type(try_));
|
Chris@16
|
178 }
|
Chris@16
|
179 };
|
Chris@16
|
180
|
Chris@16
|
181 try_gen const try_ = try_gen();
|
Chris@16
|
182 }}
|
Chris@16
|
183
|
Chris@16
|
184 #if defined(BOOST_MSVC)
|
Chris@16
|
185 # pragma warning(pop)
|
Chris@16
|
186 #endif
|
Chris@16
|
187
|
Chris@16
|
188 #endif
|