Chris@16: /* Chris@16: [auto_generated] Chris@16: boost/numeric/odeint/util/state_wrapper.hpp Chris@16: Chris@16: [begin_description] Chris@16: State wrapper for the state type in all stepper. The state wrappers are responsible for construction, Chris@16: destruction, copying construction, assignment and resizing. Chris@16: [end_description] Chris@16: Chris@101: Copyright 2011-2013 Karsten Ahnert Chris@101: Copyright 2011 Mario Mulansky Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. Chris@16: (See accompanying file LICENSE_1_0.txt or Chris@16: copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: */ Chris@16: Chris@16: Chris@16: #ifndef BOOST_NUMERIC_ODEINT_UTIL_RESIZE_HPP_INCLUDED Chris@16: #define BOOST_NUMERIC_ODEINT_UTIL_RESIZE_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace numeric { Chris@16: namespace odeint { Chris@16: Chris@101: Chris@101: template< class StateOut , class StateIn , class Enabler = void > Chris@101: struct resize_impl_sfinae Chris@101: { Chris@101: static void resize( StateOut &x1 , const StateIn &x2 ) Chris@101: { Chris@101: x1.resize( boost::size( x2 ) ); Chris@101: } Chris@101: }; Chris@101: Chris@16: // resize function Chris@16: // standard implementation relies on boost.range and resize member function Chris@101: template< class StateOut , class StateIn > Chris@16: struct resize_impl Chris@16: { Chris@16: static void resize( StateOut &x1 , const StateIn &x2 ) Chris@16: { Chris@101: resize_impl_sfinae< StateOut , StateIn >::resize( x1 , x2 ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: // do not overload or specialize this function, specialize resize_impl<> instead Chris@16: template< class StateOut , class StateIn > Chris@16: void resize( StateOut &x1 , const StateIn &x2 ) Chris@16: { Chris@16: resize_impl< StateOut , StateIn >::resize( x1 , x2 ); Chris@16: } Chris@16: Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: struct resizer Chris@16: { Chris@16: typedef void result_type; Chris@16: Chris@16: template< class StateOut , class StateIn > Chris@16: void operator()( StateOut &x1 , const StateIn &x2 ) const Chris@16: { Chris@16: resize_op( x1 , x2 , typename is_resizeable< StateOut >::type() ); Chris@16: } Chris@16: Chris@16: template< class StateOut , class StateIn > Chris@16: void resize_op( StateOut &x1 , const StateIn &x2 , boost::true_type ) const Chris@16: { Chris@16: resize( x1 , x2 ); Chris@16: } Chris@16: Chris@16: template< class StateOut , class StateIn > Chris@16: void resize_op( StateOut &x1 , const StateIn &x2 , boost::false_type ) const Chris@16: { Chris@16: } Chris@16: Chris@16: }; Chris@16: } // namespace detail Chris@16: Chris@16: Chris@16: /* Chris@16: * specialization for fusion sequences Chris@16: */ Chris@16: template< class FusionSeq > Chris@101: struct resize_impl_sfinae< FusionSeq , FusionSeq , Chris@101: typename boost::enable_if< typename boost::fusion::traits::is_sequence< FusionSeq >::type >::type > Chris@16: { Chris@16: static void resize( FusionSeq &x1 , const FusionSeq &x2 ) Chris@16: { Chris@16: typedef boost::fusion::vector< FusionSeq& , const FusionSeq& > Sequences; Chris@16: Sequences sequences( x1 , x2 ); Chris@16: boost::fusion::for_each( boost::fusion::zip_view< Sequences >( sequences ) , boost::fusion::make_fused( detail::resizer() ) ); Chris@16: } Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: } Chris@16: } Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: #endif // BOOST_NUMERIC_ODEINT_UTIL_RESIZE_HPP_INCLUDED