| /* |
| [auto_generated] |
| boost/numeric/odeint/util/multi_array_adaption.hpp |
| |
| [begin_description] |
| tba. |
| [end_description] |
| |
| Copyright 2009-2012 Karsten Ahnert |
| Copyright 2009-2012 Mario Mulansky |
| |
| Distributed under the Boost Software License, Version 1.0. |
| (See accompanying file LICENSE_1_0.txt or |
| copy at http://www.boost.org/LICENSE_1_0.txt) |
| */ |
| |
| |
| #ifndef BOOST_NUMERIC_ODEINT_UTIL_MULTI_ARRAY_ADAPTION_HPP_DEFINED |
| #define BOOST_NUMERIC_ODEINT_UTIL_MULTI_ARRAY_ADAPTION_HPP_DEFINED |
| |
| |
| |
| #include <boost/numeric/odeint/util/is_resizeable.hpp> |
| #include <boost/numeric/odeint/util/resize.hpp> |
| #include <boost/numeric/odeint/util/same_size.hpp> |
| |
| #include <boost/mpl/and.hpp> |
| #include <boost/mpl/bool.hpp> |
| #include <boost/multi_array.hpp> |
| |
| |
| namespace boost { |
| namespace numeric { |
| namespace odeint { |
| |
| template< typename T > |
| struct is_multi_array |
| { |
| typedef boost::false_type type; |
| const static bool value = type::value; |
| }; |
| |
| template< typename T > |
| struct is_resizeable_multi_array |
| { |
| typedef boost::false_type type; |
| const static bool value = type::value; |
| }; |
| |
| |
| |
| template< typename V , size_t Dim , typename A > |
| struct is_multi_array< boost::multi_array< V , Dim , A > > |
| { |
| typedef boost::true_type type; |
| const static bool value = type::value; |
| }; |
| |
| template< typename V , size_t Dim , typename A > |
| struct is_resizeable_multi_array< boost::multi_array< V , Dim , A > > |
| { |
| typedef boost::true_type type; |
| const static bool value = type::value; |
| }; |
| |
| |
| |
| |
| template< typename T > |
| struct is_resizeable_sfinae< T , typename boost::enable_if< typename is_resizeable_multi_array< T >::type >::type > |
| { |
| typedef boost::true_type type; |
| const static bool value = type::value; |
| }; |
| |
| |
| |
| |
| |
| template< typename T1 , typename T2 > |
| struct same_size_impl_sfinae< T1 , T2 , |
| typename boost::enable_if< |
| typename boost::mpl::and_< |
| is_multi_array< T1 > , |
| is_multi_array< T2 > , |
| boost::mpl::bool_< T1::dimensionality == T2::dimensionality > |
| >::type |
| >::type > |
| { |
| static bool same_size( T1 const &x1 , T2 const &x2 ) |
| { |
| for( size_t i=0 ; i<T1::dimensionality ; ++i ) |
| { |
| if( x1.shape()[i] != x2.shape()[i] ) return false; |
| if( x1.index_bases()[i] != x2.index_bases()[i] ) return false; |
| } |
| return true; |
| } |
| }; |
| |
| |
| template< typename T1 , typename T2 > |
| struct resize_impl_sfinae< T1 , T2 , |
| typename boost::enable_if< |
| typename boost::mpl::and_< |
| is_resizeable_multi_array< T1 > , |
| is_multi_array< T2 > , |
| boost::mpl::bool_< T1::dimensionality == T2::dimensionality > |
| >::type |
| >::type > |
| { |
| static void resize( T1 &x1 , const T2 &x2 ) |
| { |
| boost::array< int , T1::dimensionality > extents; |
| for( size_t i=0 ; i<T1::dimensionality ; ++i ) extents[i] = x2.shape()[i]; |
| x1.resize( extents ); |
| boost::array< int , T1::dimensionality > origins; |
| for( size_t i=0 ; i<T1::dimensionality ; ++i ) origins[i] = x2.index_bases()[i]; |
| x1.reindex( origins ); |
| } |
| }; |
| |
| |
| |
| } // namespace odeint |
| } // namespace numeric |
| } // namespace boost |
| |
| |
| #endif // BOOST_NUMERIC_ODEINT_UTIL_MULTI_ARRAY_ADAPTION_HPP_DEFINED |