Chris@16
|
1 /*
|
Chris@16
|
2 [auto_generated]
|
Chris@16
|
3 boost/numeric/odeint/algebra/fusion_algebra.hpp
|
Chris@16
|
4
|
Chris@16
|
5 [begin_description]
|
Chris@16
|
6 Algebra for boost::fusion sequences.
|
Chris@16
|
7 [end_description]
|
Chris@16
|
8
|
Chris@16
|
9 Copyright 2009-2011 Karsten Ahnert
|
Chris@16
|
10 Copyright 2009-2011 Mario Mulansky
|
Chris@16
|
11
|
Chris@16
|
12 Distributed under the Boost Software License, Version 1.0.
|
Chris@16
|
13 (See accompanying file LICENSE_1_0.txt or
|
Chris@16
|
14 copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
15 */
|
Chris@16
|
16
|
Chris@16
|
17
|
Chris@16
|
18 #ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_FUSION_ALGEBRA_HPP_INCLUDED
|
Chris@16
|
19 #define BOOST_NUMERIC_ODEINT_ALGEBRA_FUSION_ALGEBRA_HPP_INCLUDED
|
Chris@16
|
20
|
Chris@16
|
21
|
Chris@16
|
22 #include <boost/fusion/container/vector.hpp>
|
Chris@16
|
23 #include <boost/fusion/algorithm/iteration/for_each.hpp>
|
Chris@16
|
24 #include <boost/fusion/view/zip_view.hpp>
|
Chris@16
|
25 #include <boost/fusion/functional/generation/make_fused.hpp>
|
Chris@16
|
26 #include <boost/fusion/algorithm/iteration/accumulate.hpp>
|
Chris@16
|
27
|
Chris@16
|
28 namespace boost {
|
Chris@16
|
29 namespace numeric {
|
Chris@16
|
30 namespace odeint {
|
Chris@16
|
31
|
Chris@16
|
32
|
Chris@16
|
33 struct fusion_algebra
|
Chris@16
|
34 {
|
Chris@16
|
35 template< class S1 , class Op >
|
Chris@16
|
36 static void for_each1( S1 &s1 , Op op )
|
Chris@16
|
37 {
|
Chris@16
|
38 boost::fusion::for_each( s1 , op );
|
Chris@16
|
39 };
|
Chris@16
|
40
|
Chris@16
|
41
|
Chris@16
|
42 template< class S1 , class S2 , class Op >
|
Chris@16
|
43 static void for_each2( S1 &s1 , S2 &s2 , Op op )
|
Chris@16
|
44 {
|
Chris@16
|
45 typedef boost::fusion::vector< S1& , S2& > Sequences;
|
Chris@16
|
46 Sequences sequences( s1 , s2 );
|
Chris@16
|
47 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
48 }
|
Chris@16
|
49
|
Chris@16
|
50
|
Chris@16
|
51 template< class S1 , class S2 , class S3 , class Op >
|
Chris@16
|
52 static void for_each3( S1 &s1 , S2 &s2 , S3 &s3 , Op op )
|
Chris@16
|
53 {
|
Chris@16
|
54 typedef boost::fusion::vector< S1& , S2& , S3& > Sequences;
|
Chris@16
|
55 Sequences sequences( s1 , s2 , s3 );
|
Chris@16
|
56 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
57 }
|
Chris@16
|
58
|
Chris@16
|
59 template< class S1 , class S2 , class S3 , class S4 , class Op >
|
Chris@16
|
60 static void for_each4( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , Op op )
|
Chris@16
|
61 {
|
Chris@16
|
62 typedef boost::fusion::vector< S1& , S2& , S3& , S4& > Sequences;
|
Chris@16
|
63 Sequences sequences( s1 , s2 , s3 , s4 );
|
Chris@16
|
64 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
65 }
|
Chris@16
|
66
|
Chris@16
|
67
|
Chris@16
|
68 template< class S1 , class S2 , class S3 , class S4 , class S5 , class Op >
|
Chris@16
|
69 static void for_each5( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , Op op )
|
Chris@16
|
70 {
|
Chris@16
|
71 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& > Sequences;
|
Chris@16
|
72 Sequences sequences( s1 , s2 , s3 , s4 , s5 );
|
Chris@16
|
73 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
74 }
|
Chris@16
|
75
|
Chris@16
|
76
|
Chris@16
|
77 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class Op >
|
Chris@16
|
78 static void for_each6( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , Op op )
|
Chris@16
|
79 {
|
Chris@16
|
80 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& > Sequences;
|
Chris@16
|
81 Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 );
|
Chris@16
|
82 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
83 }
|
Chris@16
|
84
|
Chris@16
|
85
|
Chris@16
|
86 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class Op >
|
Chris@16
|
87 static void for_each7( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , Op op )
|
Chris@16
|
88 {
|
Chris@16
|
89 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& > Sequences;
|
Chris@16
|
90 Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 );
|
Chris@16
|
91 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
92 }
|
Chris@16
|
93
|
Chris@16
|
94
|
Chris@16
|
95 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class Op >
|
Chris@16
|
96 static void for_each8( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , Op op )
|
Chris@16
|
97 {
|
Chris@16
|
98 BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 8 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
Chris@16
|
99 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& > Sequences;
|
Chris@16
|
100 Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 );
|
Chris@16
|
101 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
102 }
|
Chris@16
|
103
|
Chris@16
|
104 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class Op >
|
Chris@16
|
105 static void for_each9( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , Op op )
|
Chris@16
|
106 {
|
Chris@16
|
107 BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 9 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
Chris@16
|
108 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& > Sequences;
|
Chris@16
|
109 Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 );
|
Chris@16
|
110 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
111 }
|
Chris@16
|
112
|
Chris@16
|
113 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class Op >
|
Chris@16
|
114 static void for_each10( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , Op op )
|
Chris@16
|
115 {
|
Chris@16
|
116 BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 10 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
Chris@16
|
117 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& > Sequences;
|
Chris@16
|
118 Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 );
|
Chris@16
|
119 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
120 }
|
Chris@16
|
121
|
Chris@16
|
122 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class Op >
|
Chris@16
|
123 static void for_each11( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , Op op )
|
Chris@16
|
124 {
|
Chris@16
|
125 BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 11 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
Chris@16
|
126 BOOST_STATIC_ASSERT_MSG( BOOST_RESULT_OF_NUM_ARGS >= 11 , "Macro Parameter BOOST_RESULT_OF_NUM_ARGS to small!" );
|
Chris@16
|
127 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& , S11& > Sequences;
|
Chris@16
|
128 Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 );
|
Chris@16
|
129 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
130 }
|
Chris@16
|
131
|
Chris@16
|
132 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class Op >
|
Chris@16
|
133 static void for_each12( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , Op op )
|
Chris@16
|
134 {
|
Chris@16
|
135 BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 12 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
Chris@16
|
136 BOOST_STATIC_ASSERT_MSG( BOOST_RESULT_OF_NUM_ARGS >= 12 , "Macro Parameter BOOST_RESULT_OF_NUM_ARGS to small!" );
|
Chris@16
|
137 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& , S11& , S12& > Sequences;
|
Chris@16
|
138 Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 );
|
Chris@16
|
139 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
140 }
|
Chris@16
|
141
|
Chris@16
|
142 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class Op >
|
Chris@16
|
143 static void for_each13( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , Op op )
|
Chris@16
|
144 {
|
Chris@16
|
145 BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 13 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
Chris@16
|
146 BOOST_STATIC_ASSERT_MSG( BOOST_RESULT_OF_NUM_ARGS >= 13 , "Macro Parameter BOOST_RESULT_OF_NUM_ARGS to small!" );
|
Chris@16
|
147 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& , S11& , S12& , S13& > Sequences;
|
Chris@16
|
148 Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 );
|
Chris@16
|
149 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
150 }
|
Chris@16
|
151
|
Chris@16
|
152 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class Op >
|
Chris@16
|
153 static void for_each14( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , Op op )
|
Chris@16
|
154 {
|
Chris@16
|
155 BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 14 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
Chris@16
|
156 BOOST_STATIC_ASSERT_MSG( BOOST_RESULT_OF_NUM_ARGS >= 14 , "Macro Parameter BOOST_RESULT_OF_NUM_ARGS to small!" );
|
Chris@16
|
157 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& , S11& , S12& , S13& , S14& > Sequences;
|
Chris@16
|
158 Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 , s14 );
|
Chris@16
|
159 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
160 }
|
Chris@16
|
161
|
Chris@16
|
162 template< class S1 , class S2 , class S3 , class S4 , class S5 , class S6 , class S7 , class S8 , class S9 , class S10 , class S11 , class S12 , class S13 , class S14 , class S15 , class Op >
|
Chris@16
|
163 static void for_each15( S1 &s1 , S2 &s2 , S3 &s3 , S4 &s4 , S5 &s5 , S6 &s6 , S7 &s7 , S8 &s8 , S9 &s9 , S10 &s10 , S11 &s11 , S12 &s12 , S13 &s13 , S14 &s14 , S15 &s15 , Op op )
|
Chris@16
|
164 {
|
Chris@16
|
165 BOOST_STATIC_ASSERT_MSG( BOOST_FUSION_INVOKE_MAX_ARITY >= 15 , "Macro Parameter BOOST_FUSION_INVOKE_MAX_ARITY to small!" );
|
Chris@16
|
166 BOOST_STATIC_ASSERT_MSG( BOOST_RESULT_OF_NUM_ARGS >= 15 , "Macro Parameter BOOST_RESULT_OF_NUM_ARGS to small!" );
|
Chris@16
|
167 typedef boost::fusion::vector< S1& , S2& , S3& , S4& , S5& , S6& , S7& , S8& , S9& , S10& , S11& , S12& , S13& , S14& , S15& > Sequences;
|
Chris@16
|
168 Sequences sequences( s1 , s2 , s3 , s4 , s5 , s6 , s7 , s8 , s9 , s10 , s11 , s12 , s13 , s14 , s15 );
|
Chris@16
|
169 boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( op ) );
|
Chris@16
|
170 }
|
Chris@16
|
171
|
Chris@16
|
172 template< class Value , class S , class Reduction >
|
Chris@16
|
173 static Value reduce( const S &s , Reduction red , Value init)
|
Chris@16
|
174 {
|
Chris@16
|
175 return boost::fusion::accumulate( s , init , red );
|
Chris@16
|
176 }
|
Chris@16
|
177 };
|
Chris@16
|
178
|
Chris@16
|
179
|
Chris@16
|
180
|
Chris@16
|
181 } // odeint
|
Chris@16
|
182 } // numeric
|
Chris@16
|
183 } // boost
|
Chris@16
|
184
|
Chris@16
|
185
|
Chris@16
|
186 #endif // BOOST_NUMERIC_ODEINT_ALGEBRA_FUSION_ALGEBRA_HPP_INCLUDED
|