]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | /* |
2 | [auto_generated] | |
3 | boost/numeric/odeint/algebra/algebra_dispatcher.hpp | |
4 | ||
5 | [begin_description] | |
6 | Algebra dispatcher to automatically chose suitable algebra. | |
7 | [end_description] | |
8 | ||
9 | Copyright 2013 Karsten Ahnert | |
10 | Copyright 2013 Mario Mulansky | |
11 | ||
12 | Distributed under the Boost Software License, Version 1.0. | |
13 | (See accompanying file LICENSE_1_0.txt or | |
14 | copy at http://www.boost.org/LICENSE_1_0.txt) | |
15 | */ | |
16 | ||
17 | #ifndef BOOST_NUMERIC_ODEINT_ALGEBRA_ALGEBRA_DISPATCHER_HPP_INCLUDED | |
18 | #define BOOST_NUMERIC_ODEINT_ALGEBRA_ALGEBRA_DISPATCHER_HPP_INCLUDED | |
19 | ||
20 | #include <boost/numeric/odeint/config.hpp> | |
21 | ||
22 | #include <complex> | |
23 | #include <boost/type_traits/is_floating_point.hpp> | |
24 | ||
25 | #include <boost/numeric/ublas/vector.hpp> | |
26 | #include <boost/numeric/ublas/matrix.hpp> | |
27 | ||
28 | #include <boost/numeric/odeint/algebra/range_algebra.hpp> | |
29 | #include <boost/numeric/odeint/algebra/array_algebra.hpp> | |
30 | #include <boost/numeric/odeint/algebra/vector_space_algebra.hpp> | |
31 | ||
32 | #include <boost/array.hpp> | |
33 | ||
34 | ||
35 | namespace boost { | |
36 | namespace numeric { | |
37 | namespace odeint { | |
38 | ||
39 | template< class StateType , class Enabler = void > | |
40 | struct algebra_dispatcher_sfinae | |
41 | { | |
42 | // range_algebra is the standard algebra | |
43 | typedef range_algebra algebra_type; | |
44 | }; | |
45 | ||
46 | template< class StateType > | |
47 | struct algebra_dispatcher : algebra_dispatcher_sfinae< StateType > { }; | |
48 | ||
49 | // specialize for array | |
50 | template< class T , size_t N > | |
51 | struct algebra_dispatcher< boost::array< T , N > > | |
52 | { | |
53 | typedef array_algebra algebra_type; | |
54 | }; | |
55 | ||
56 | //specialize for some integral types | |
57 | template< typename T > | |
58 | struct algebra_dispatcher_sfinae< T , typename boost::enable_if< typename boost::is_floating_point< T >::type >::type > | |
59 | { | |
60 | typedef vector_space_algebra algebra_type; | |
61 | }; | |
62 | ||
63 | template< typename T > | |
64 | struct algebra_dispatcher< std::complex<T> > | |
65 | { | |
66 | typedef vector_space_algebra algebra_type; | |
67 | }; | |
68 | ||
69 | ///* think about that again.... | |
70 | // specialize for ublas vector and matrix types | |
71 | template< class T , class A > | |
72 | struct algebra_dispatcher< boost::numeric::ublas::vector< T , A > > | |
73 | { | |
74 | typedef vector_space_algebra algebra_type; | |
75 | }; | |
76 | ||
77 | template< class T , class L , class A > | |
78 | struct algebra_dispatcher< boost::numeric::ublas::matrix< T , L , A > > | |
79 | { | |
80 | typedef vector_space_algebra algebra_type; | |
81 | }; | |
82 | //*/ | |
83 | ||
84 | } | |
85 | } | |
86 | } | |
87 | ||
88 | #ifdef BOOST_NUMERIC_ODEINT_CXX11 | |
89 | ||
90 | // c++11 mode: specialization for std::array if available | |
91 | ||
92 | #include <array> | |
93 | ||
94 | namespace boost { | |
95 | namespace numeric { | |
96 | namespace odeint { | |
97 | ||
98 | // specialize for std::array | |
99 | template< class T , size_t N > | |
100 | struct algebra_dispatcher< std::array< T , N > > | |
101 | { | |
102 | typedef array_algebra algebra_type; | |
103 | }; | |
104 | ||
105 | } } } | |
106 | ||
107 | #endif | |
108 | ||
109 | ||
110 | #endif |