Chris@16
|
1 ///////////////////////////////////////////////////////////////////////////////
|
Chris@16
|
2 /// \file deep_copy.hpp
|
Chris@16
|
3 /// Replace all nodes stored by reference by nodes stored by value.
|
Chris@16
|
4 //
|
Chris@16
|
5 // Copyright 2008 Eric Niebler. Distributed under the Boost
|
Chris@16
|
6 // Software License, Version 1.0. (See accompanying file
|
Chris@16
|
7 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8 template<typename Expr>
|
Chris@16
|
9 struct deep_copy_impl<Expr, 1>
|
Chris@16
|
10 {
|
Chris@16
|
11 typedef
|
Chris@16
|
12 typename base_expr<
|
Chris@16
|
13 typename Expr::proto_domain
|
Chris@16
|
14 , typename Expr::proto_tag
|
Chris@16
|
15 , list1<
|
Chris@16
|
16 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type
|
Chris@16
|
17 >
|
Chris@16
|
18 >::type
|
Chris@16
|
19 expr_type;
|
Chris@16
|
20 typedef typename Expr::proto_generator proto_generator;
|
Chris@16
|
21 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
|
Chris@16
|
22 template<typename Expr2, typename S, typename D>
|
Chris@16
|
23 result_type operator()(Expr2 const &e, S const &, D const &) const
|
Chris@16
|
24 {
|
Chris@16
|
25 expr_type const that = {
|
Chris@16
|
26 proto::deep_copy(e.proto_base().child0)
|
Chris@16
|
27 };
|
Chris@16
|
28 return proto_generator()(that);
|
Chris@16
|
29 }
|
Chris@16
|
30 };
|
Chris@16
|
31 template<typename Expr>
|
Chris@16
|
32 struct deep_copy_impl<Expr, 2>
|
Chris@16
|
33 {
|
Chris@16
|
34 typedef
|
Chris@16
|
35 typename base_expr<
|
Chris@16
|
36 typename Expr::proto_domain
|
Chris@16
|
37 , typename Expr::proto_tag
|
Chris@16
|
38 , list2<
|
Chris@16
|
39 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child1 >::type::proto_derived_expr >::result_type
|
Chris@16
|
40 >
|
Chris@16
|
41 >::type
|
Chris@16
|
42 expr_type;
|
Chris@16
|
43 typedef typename Expr::proto_generator proto_generator;
|
Chris@16
|
44 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
|
Chris@16
|
45 template<typename Expr2, typename S, typename D>
|
Chris@16
|
46 result_type operator()(Expr2 const &e, S const &, D const &) const
|
Chris@16
|
47 {
|
Chris@16
|
48 expr_type const that = {
|
Chris@16
|
49 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1)
|
Chris@16
|
50 };
|
Chris@16
|
51 return proto_generator()(that);
|
Chris@16
|
52 }
|
Chris@16
|
53 };
|
Chris@16
|
54 template<typename Expr>
|
Chris@16
|
55 struct deep_copy_impl<Expr, 3>
|
Chris@16
|
56 {
|
Chris@16
|
57 typedef
|
Chris@16
|
58 typename base_expr<
|
Chris@16
|
59 typename Expr::proto_domain
|
Chris@16
|
60 , typename Expr::proto_tag
|
Chris@16
|
61 , list3<
|
Chris@16
|
62 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child1 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child2 >::type::proto_derived_expr >::result_type
|
Chris@16
|
63 >
|
Chris@16
|
64 >::type
|
Chris@16
|
65 expr_type;
|
Chris@16
|
66 typedef typename Expr::proto_generator proto_generator;
|
Chris@16
|
67 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
|
Chris@16
|
68 template<typename Expr2, typename S, typename D>
|
Chris@16
|
69 result_type operator()(Expr2 const &e, S const &, D const &) const
|
Chris@16
|
70 {
|
Chris@16
|
71 expr_type const that = {
|
Chris@16
|
72 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1) , proto::deep_copy(e.proto_base().child2)
|
Chris@16
|
73 };
|
Chris@16
|
74 return proto_generator()(that);
|
Chris@16
|
75 }
|
Chris@16
|
76 };
|
Chris@16
|
77 template<typename Expr>
|
Chris@16
|
78 struct deep_copy_impl<Expr, 4>
|
Chris@16
|
79 {
|
Chris@16
|
80 typedef
|
Chris@16
|
81 typename base_expr<
|
Chris@16
|
82 typename Expr::proto_domain
|
Chris@16
|
83 , typename Expr::proto_tag
|
Chris@16
|
84 , list4<
|
Chris@16
|
85 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child1 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child2 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child3 >::type::proto_derived_expr >::result_type
|
Chris@16
|
86 >
|
Chris@16
|
87 >::type
|
Chris@16
|
88 expr_type;
|
Chris@16
|
89 typedef typename Expr::proto_generator proto_generator;
|
Chris@16
|
90 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
|
Chris@16
|
91 template<typename Expr2, typename S, typename D>
|
Chris@16
|
92 result_type operator()(Expr2 const &e, S const &, D const &) const
|
Chris@16
|
93 {
|
Chris@16
|
94 expr_type const that = {
|
Chris@16
|
95 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1) , proto::deep_copy(e.proto_base().child2) , proto::deep_copy(e.proto_base().child3)
|
Chris@16
|
96 };
|
Chris@16
|
97 return proto_generator()(that);
|
Chris@16
|
98 }
|
Chris@16
|
99 };
|
Chris@16
|
100 template<typename Expr>
|
Chris@16
|
101 struct deep_copy_impl<Expr, 5>
|
Chris@16
|
102 {
|
Chris@16
|
103 typedef
|
Chris@16
|
104 typename base_expr<
|
Chris@16
|
105 typename Expr::proto_domain
|
Chris@16
|
106 , typename Expr::proto_tag
|
Chris@16
|
107 , list5<
|
Chris@16
|
108 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child1 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child2 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child3 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child4 >::type::proto_derived_expr >::result_type
|
Chris@16
|
109 >
|
Chris@16
|
110 >::type
|
Chris@16
|
111 expr_type;
|
Chris@16
|
112 typedef typename Expr::proto_generator proto_generator;
|
Chris@16
|
113 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
|
Chris@16
|
114 template<typename Expr2, typename S, typename D>
|
Chris@16
|
115 result_type operator()(Expr2 const &e, S const &, D const &) const
|
Chris@16
|
116 {
|
Chris@16
|
117 expr_type const that = {
|
Chris@16
|
118 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1) , proto::deep_copy(e.proto_base().child2) , proto::deep_copy(e.proto_base().child3) , proto::deep_copy(e.proto_base().child4)
|
Chris@16
|
119 };
|
Chris@16
|
120 return proto_generator()(that);
|
Chris@16
|
121 }
|
Chris@16
|
122 };
|
Chris@16
|
123 template<typename Expr>
|
Chris@16
|
124 struct deep_copy_impl<Expr, 6>
|
Chris@16
|
125 {
|
Chris@16
|
126 typedef
|
Chris@16
|
127 typename base_expr<
|
Chris@16
|
128 typename Expr::proto_domain
|
Chris@16
|
129 , typename Expr::proto_tag
|
Chris@16
|
130 , list6<
|
Chris@16
|
131 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child1 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child2 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child3 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child4 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child5 >::type::proto_derived_expr >::result_type
|
Chris@16
|
132 >
|
Chris@16
|
133 >::type
|
Chris@16
|
134 expr_type;
|
Chris@16
|
135 typedef typename Expr::proto_generator proto_generator;
|
Chris@16
|
136 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
|
Chris@16
|
137 template<typename Expr2, typename S, typename D>
|
Chris@16
|
138 result_type operator()(Expr2 const &e, S const &, D const &) const
|
Chris@16
|
139 {
|
Chris@16
|
140 expr_type const that = {
|
Chris@16
|
141 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1) , proto::deep_copy(e.proto_base().child2) , proto::deep_copy(e.proto_base().child3) , proto::deep_copy(e.proto_base().child4) , proto::deep_copy(e.proto_base().child5)
|
Chris@16
|
142 };
|
Chris@16
|
143 return proto_generator()(that);
|
Chris@16
|
144 }
|
Chris@16
|
145 };
|
Chris@16
|
146 template<typename Expr>
|
Chris@16
|
147 struct deep_copy_impl<Expr, 7>
|
Chris@16
|
148 {
|
Chris@16
|
149 typedef
|
Chris@16
|
150 typename base_expr<
|
Chris@16
|
151 typename Expr::proto_domain
|
Chris@16
|
152 , typename Expr::proto_tag
|
Chris@16
|
153 , list7<
|
Chris@16
|
154 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child1 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child2 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child3 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child4 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child5 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child6 >::type::proto_derived_expr >::result_type
|
Chris@16
|
155 >
|
Chris@16
|
156 >::type
|
Chris@16
|
157 expr_type;
|
Chris@16
|
158 typedef typename Expr::proto_generator proto_generator;
|
Chris@16
|
159 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
|
Chris@16
|
160 template<typename Expr2, typename S, typename D>
|
Chris@16
|
161 result_type operator()(Expr2 const &e, S const &, D const &) const
|
Chris@16
|
162 {
|
Chris@16
|
163 expr_type const that = {
|
Chris@16
|
164 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1) , proto::deep_copy(e.proto_base().child2) , proto::deep_copy(e.proto_base().child3) , proto::deep_copy(e.proto_base().child4) , proto::deep_copy(e.proto_base().child5) , proto::deep_copy(e.proto_base().child6)
|
Chris@16
|
165 };
|
Chris@16
|
166 return proto_generator()(that);
|
Chris@16
|
167 }
|
Chris@16
|
168 };
|
Chris@16
|
169 template<typename Expr>
|
Chris@16
|
170 struct deep_copy_impl<Expr, 8>
|
Chris@16
|
171 {
|
Chris@16
|
172 typedef
|
Chris@16
|
173 typename base_expr<
|
Chris@16
|
174 typename Expr::proto_domain
|
Chris@16
|
175 , typename Expr::proto_tag
|
Chris@16
|
176 , list8<
|
Chris@16
|
177 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child1 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child2 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child3 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child4 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child5 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child6 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child7 >::type::proto_derived_expr >::result_type
|
Chris@16
|
178 >
|
Chris@16
|
179 >::type
|
Chris@16
|
180 expr_type;
|
Chris@16
|
181 typedef typename Expr::proto_generator proto_generator;
|
Chris@16
|
182 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
|
Chris@16
|
183 template<typename Expr2, typename S, typename D>
|
Chris@16
|
184 result_type operator()(Expr2 const &e, S const &, D const &) const
|
Chris@16
|
185 {
|
Chris@16
|
186 expr_type const that = {
|
Chris@16
|
187 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1) , proto::deep_copy(e.proto_base().child2) , proto::deep_copy(e.proto_base().child3) , proto::deep_copy(e.proto_base().child4) , proto::deep_copy(e.proto_base().child5) , proto::deep_copy(e.proto_base().child6) , proto::deep_copy(e.proto_base().child7)
|
Chris@16
|
188 };
|
Chris@16
|
189 return proto_generator()(that);
|
Chris@16
|
190 }
|
Chris@16
|
191 };
|
Chris@16
|
192 template<typename Expr>
|
Chris@16
|
193 struct deep_copy_impl<Expr, 9>
|
Chris@16
|
194 {
|
Chris@16
|
195 typedef
|
Chris@16
|
196 typename base_expr<
|
Chris@16
|
197 typename Expr::proto_domain
|
Chris@16
|
198 , typename Expr::proto_tag
|
Chris@16
|
199 , list9<
|
Chris@16
|
200 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child1 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child2 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child3 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child4 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child5 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child6 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child7 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child8 >::type::proto_derived_expr >::result_type
|
Chris@16
|
201 >
|
Chris@16
|
202 >::type
|
Chris@16
|
203 expr_type;
|
Chris@16
|
204 typedef typename Expr::proto_generator proto_generator;
|
Chris@16
|
205 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
|
Chris@16
|
206 template<typename Expr2, typename S, typename D>
|
Chris@16
|
207 result_type operator()(Expr2 const &e, S const &, D const &) const
|
Chris@16
|
208 {
|
Chris@16
|
209 expr_type const that = {
|
Chris@16
|
210 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1) , proto::deep_copy(e.proto_base().child2) , proto::deep_copy(e.proto_base().child3) , proto::deep_copy(e.proto_base().child4) , proto::deep_copy(e.proto_base().child5) , proto::deep_copy(e.proto_base().child6) , proto::deep_copy(e.proto_base().child7) , proto::deep_copy(e.proto_base().child8)
|
Chris@16
|
211 };
|
Chris@16
|
212 return proto_generator()(that);
|
Chris@16
|
213 }
|
Chris@16
|
214 };
|
Chris@16
|
215 template<typename Expr>
|
Chris@16
|
216 struct deep_copy_impl<Expr, 10>
|
Chris@16
|
217 {
|
Chris@16
|
218 typedef
|
Chris@16
|
219 typename base_expr<
|
Chris@16
|
220 typename Expr::proto_domain
|
Chris@16
|
221 , typename Expr::proto_tag
|
Chris@16
|
222 , list10<
|
Chris@16
|
223 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child1 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child2 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child3 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child4 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child5 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child6 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child7 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child8 >::type::proto_derived_expr >::result_type , typename deep_copy_impl< typename remove_reference< typename Expr::proto_child9 >::type::proto_derived_expr >::result_type
|
Chris@16
|
224 >
|
Chris@16
|
225 >::type
|
Chris@16
|
226 expr_type;
|
Chris@16
|
227 typedef typename Expr::proto_generator proto_generator;
|
Chris@16
|
228 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
|
Chris@16
|
229 template<typename Expr2, typename S, typename D>
|
Chris@16
|
230 result_type operator()(Expr2 const &e, S const &, D const &) const
|
Chris@16
|
231 {
|
Chris@16
|
232 expr_type const that = {
|
Chris@16
|
233 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1) , proto::deep_copy(e.proto_base().child2) , proto::deep_copy(e.proto_base().child3) , proto::deep_copy(e.proto_base().child4) , proto::deep_copy(e.proto_base().child5) , proto::deep_copy(e.proto_base().child6) , proto::deep_copy(e.proto_base().child7) , proto::deep_copy(e.proto_base().child8) , proto::deep_copy(e.proto_base().child9)
|
Chris@16
|
234 };
|
Chris@16
|
235 return proto_generator()(that);
|
Chris@16
|
236 }
|
Chris@16
|
237 };
|