123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /*
- Copyright 2011 Mario Mulansky
- Copyright 2012 Karsten Ahnert
- 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)
- */
- /* reserved vector */
- #ifndef VECTOR_VECTOR_RESIZE_HPP
- #define VECTOR_VECTOR_RESIZE_HPP
- #include <vector>
- #include <boost/range.hpp>
- namespace boost { namespace numeric { namespace odeint {
- template<>
- struct is_resizeable< std::vector< std::vector< double > > >
- {
- typedef boost::true_type type;
- const static bool value = type::value;
- };
- template<>
- struct same_size_impl< std::vector< std::vector< double > > , std::vector< std::vector< double > > >
- {
- typedef std::vector< std::vector< double > > state_type;
- static bool same_size( const state_type &x1 ,
- const state_type &x2 )
- {
- bool same = ( boost::size( x1 ) == boost::size( x2 ) );
- if( !same )
- return false;
- typename state_type::const_iterator begin1 = boost::begin( x1 );
- typename state_type::const_iterator begin2 = boost::begin( x2 );
- while( begin1 != boost::end( x1 ) )
- same &= ( boost::size( *begin1++ ) == boost::size( *begin2++ ) );
- return same;
- }
- };
- template<>
- struct resize_impl< std::vector< std::vector< double > > , std::vector< std::vector< double > > >
- {
- typedef std::vector< std::vector< double > > state_type;
- static void resize( state_type &x1 , const state_type &x2 )
- {
- x1.resize( boost::size( x2 ) );
- typename state_type::iterator begin1 = boost::begin( x1 );
- typename state_type::const_iterator begin2 = boost::begin( x2 );
- while( begin1 != boost::end( x1 ) )
- (*begin1++).resize( boost::size( *begin2++ ) );
- }
- };
- template<>
- struct state_wrapper< std::vector< std::vector< double > > >
- {
- typedef std::vector< std::vector< double > > state_type;
- typedef state_wrapper< state_type > state_wrapper_type;
- typedef boost::true_type is_resizeable;
- state_type m_v;
- template< class State >
- bool same_size( const State &x )
- {
- bool same = ( boost::size( m_v ) == boost::size( x ) );
- if( !same )
- return false;
- typename state_type::iterator begin1 = boost::begin( m_v );
- typename State::const_iterator begin2 = boost::begin( x );
- while( begin1 != boost::end( m_v ) )
- same &= ( boost::size( *begin1++ ) == boost::size( *begin2++ ) );
- return same;
- }
- template< class State >
- bool resize( const State &x )
- {
- if( !same_size( x ) )
- {
- m_v.resize( boost::size( x ) );
- typename state_type::iterator begin1 = boost::begin( m_v );
- typename State::const_iterator begin2 = boost::begin( x );
- while( begin1 != boost::end( m_v ) )
- (*begin1++).resize( boost::size( *begin2++ ) );
- return true;
- } else
- return false;
- }
-
- };
- } } }
- #endif
|