1 ///////////////////////////////////////////////////////////////////////////////
2 /// \file deep_copy.hpp
3 /// Replace all nodes stored by reference by nodes stored by value.
5 // Copyright 2008 Eric Niebler. Distributed under the Boost
6 // Software License, Version 1.0. (See accompanying file
7 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 template<typename Expr>
9 struct deep_copy_impl<Expr, 1>
13 typename Expr::proto_domain
14 , typename Expr::proto_tag
16 typename deep_copy_impl< typename remove_reference< typename Expr::proto_child0 >::type::proto_derived_expr >::result_type
20 typedef typename Expr::proto_generator proto_generator;
21 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
22 template<typename Expr2, typename S, typename D>
23 result_type operator()(Expr2 const &e, S const &, D const &) const
25 expr_type const that = {
26 proto::deep_copy(e.proto_base().child0)
28 return proto_generator()(that);
31 template<typename Expr>
32 struct deep_copy_impl<Expr, 2>
36 typename Expr::proto_domain
37 , typename Expr::proto_tag
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
43 typedef typename Expr::proto_generator proto_generator;
44 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
45 template<typename Expr2, typename S, typename D>
46 result_type operator()(Expr2 const &e, S const &, D const &) const
48 expr_type const that = {
49 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1)
51 return proto_generator()(that);
54 template<typename Expr>
55 struct deep_copy_impl<Expr, 3>
59 typename Expr::proto_domain
60 , typename Expr::proto_tag
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
66 typedef typename Expr::proto_generator proto_generator;
67 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
68 template<typename Expr2, typename S, typename D>
69 result_type operator()(Expr2 const &e, S const &, D const &) const
71 expr_type const that = {
72 proto::deep_copy(e.proto_base().child0) , proto::deep_copy(e.proto_base().child1) , proto::deep_copy(e.proto_base().child2)
74 return proto_generator()(that);
77 template<typename Expr>
78 struct deep_copy_impl<Expr, 4>
82 typename Expr::proto_domain
83 , typename Expr::proto_tag
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
89 typedef typename Expr::proto_generator proto_generator;
90 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
91 template<typename Expr2, typename S, typename D>
92 result_type operator()(Expr2 const &e, S const &, D const &) const
94 expr_type const that = {
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)
97 return proto_generator()(that);
100 template<typename Expr>
101 struct deep_copy_impl<Expr, 5>
105 typename Expr::proto_domain
106 , typename Expr::proto_tag
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
112 typedef typename Expr::proto_generator proto_generator;
113 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
114 template<typename Expr2, typename S, typename D>
115 result_type operator()(Expr2 const &e, S const &, D const &) const
117 expr_type const that = {
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)
120 return proto_generator()(that);
123 template<typename Expr>
124 struct deep_copy_impl<Expr, 6>
128 typename Expr::proto_domain
129 , typename Expr::proto_tag
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
135 typedef typename Expr::proto_generator proto_generator;
136 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
137 template<typename Expr2, typename S, typename D>
138 result_type operator()(Expr2 const &e, S const &, D const &) const
140 expr_type const that = {
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)
143 return proto_generator()(that);
146 template<typename Expr>
147 struct deep_copy_impl<Expr, 7>
151 typename Expr::proto_domain
152 , typename Expr::proto_tag
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
158 typedef typename Expr::proto_generator proto_generator;
159 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
160 template<typename Expr2, typename S, typename D>
161 result_type operator()(Expr2 const &e, S const &, D const &) const
163 expr_type const that = {
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)
166 return proto_generator()(that);
169 template<typename Expr>
170 struct deep_copy_impl<Expr, 8>
174 typename Expr::proto_domain
175 , typename Expr::proto_tag
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
181 typedef typename Expr::proto_generator proto_generator;
182 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
183 template<typename Expr2, typename S, typename D>
184 result_type operator()(Expr2 const &e, S const &, D const &) const
186 expr_type const that = {
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)
189 return proto_generator()(that);
192 template<typename Expr>
193 struct deep_copy_impl<Expr, 9>
197 typename Expr::proto_domain
198 , typename Expr::proto_tag
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
204 typedef typename Expr::proto_generator proto_generator;
205 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
206 template<typename Expr2, typename S, typename D>
207 result_type operator()(Expr2 const &e, S const &, D const &) const
209 expr_type const that = {
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)
212 return proto_generator()(that);
215 template<typename Expr>
216 struct deep_copy_impl<Expr, 10>
220 typename Expr::proto_domain
221 , typename Expr::proto_tag
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
227 typedef typename Expr::proto_generator proto_generator;
228 typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
229 template<typename Expr2, typename S, typename D>
230 result_type operator()(Expr2 const &e, S const &, D const &) const
232 expr_type const that = {
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)
235 return proto_generator()(that);