Chris@16: /* Chris@16: [auto_generated] Chris@16: boost/numeric/odeint/external/gsl/gsl_wrapper.hpp Chris@16: Chris@16: [begin_description] Chris@16: Wrapper for gsl_vector. Chris@16: [end_description] Chris@16: Chris@101: Copyright 2011-2012 Mario Mulansky Chris@101: Copyright 2011 Karsten Ahnert 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_EXTERNAL_GSL_GSL_WRAPPER_HPP_INCLUDED Chris@16: #define BOOST_NUMERIC_ODEINT_EXTERNAL_GSL_GSL_WRAPPER_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: class const_gsl_vector_iterator; Chris@16: Chris@16: /* Chris@16: * defines an iterator for gsl_vector Chris@16: */ Chris@16: class gsl_vector_iterator : public boost::iterator_facade< gsl_vector_iterator , double , boost::random_access_traversal_tag > Chris@16: { Chris@16: public : Chris@16: Chris@16: gsl_vector_iterator( void ): m_p(0) , m_stride( 0 ) { } Chris@16: explicit gsl_vector_iterator( gsl_vector *p ) : m_p( p->data ) , m_stride( p->stride ) { } Chris@16: friend gsl_vector_iterator end_iterator( gsl_vector * ); Chris@16: Chris@16: private : Chris@16: Chris@16: friend class boost::iterator_core_access; Chris@16: friend class const_gsl_vector_iterator; Chris@16: Chris@16: void increment( void ) { m_p += m_stride; } Chris@16: void decrement( void ) { m_p -= m_stride; } Chris@16: void advance( ptrdiff_t n ) { m_p += n*m_stride; } Chris@16: bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; } Chris@16: bool equal( const const_gsl_vector_iterator &other ) const; Chris@16: double& dereference( void ) const { return *m_p; } Chris@16: Chris@16: double *m_p; Chris@16: size_t m_stride; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: /* Chris@16: * defines an const iterator for gsl_vector Chris@16: */ Chris@16: class const_gsl_vector_iterator : public boost::iterator_facade< const_gsl_vector_iterator , const double , boost::random_access_traversal_tag > Chris@16: { Chris@16: public : Chris@16: Chris@16: const_gsl_vector_iterator( void ): m_p(0) , m_stride( 0 ) { } Chris@16: explicit const_gsl_vector_iterator( const gsl_vector *p ) : m_p( p->data ) , m_stride( p->stride ) { } Chris@16: const_gsl_vector_iterator( const gsl_vector_iterator &p ) : m_p( p.m_p ) , m_stride( p.m_stride ) { } Chris@16: Chris@16: private : Chris@16: Chris@16: friend class boost::iterator_core_access; Chris@16: friend class gsl_vector_iterator; Chris@16: friend const_gsl_vector_iterator end_iterator( const gsl_vector * ); Chris@16: Chris@16: void increment( void ) { m_p += m_stride; } Chris@16: void decrement( void ) { m_p -= m_stride; } Chris@16: void advance( ptrdiff_t n ) { m_p += n*m_stride; } Chris@16: bool equal( const const_gsl_vector_iterator &other ) const { return this->m_p == other.m_p; } Chris@16: bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; } Chris@16: const double& dereference( void ) const { return *m_p; } Chris@16: Chris@16: const double *m_p; Chris@16: size_t m_stride; Chris@16: }; Chris@16: Chris@16: Chris@16: bool gsl_vector_iterator::equal( const const_gsl_vector_iterator &other ) const { return this->m_p == other.m_p; } Chris@16: Chris@16: Chris@16: gsl_vector_iterator end_iterator( gsl_vector *x ) Chris@16: { Chris@16: gsl_vector_iterator iter( x ); Chris@16: iter.m_p += iter.m_stride * x->size; Chris@16: return iter; Chris@16: } Chris@16: Chris@16: const_gsl_vector_iterator end_iterator( const gsl_vector *x ) Chris@16: { Chris@16: const_gsl_vector_iterator iter( x ); Chris@16: iter.m_p += iter.m_stride * x->size; Chris@16: return iter; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: template<> Chris@16: struct range_mutable_iterator< gsl_vector* > Chris@16: { Chris@16: typedef gsl_vector_iterator type; Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct range_const_iterator< gsl_vector* > Chris@16: { Chris@16: typedef const_gsl_vector_iterator type; Chris@16: }; Chris@16: } // namespace boost Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: // template<> Chris@16: inline gsl_vector_iterator range_begin( gsl_vector *x ) Chris@16: { Chris@16: return gsl_vector_iterator( x ); Chris@16: } Chris@16: Chris@16: // template<> Chris@16: inline const_gsl_vector_iterator range_begin( const gsl_vector *x ) Chris@16: { Chris@16: return const_gsl_vector_iterator( x ); Chris@16: } Chris@16: Chris@16: // template<> Chris@16: inline gsl_vector_iterator range_end( gsl_vector *x ) Chris@16: { Chris@16: return end_iterator( x ); Chris@16: } Chris@16: Chris@16: // template<> Chris@16: inline const_gsl_vector_iterator range_end( const gsl_vector *x ) Chris@16: { Chris@16: return end_iterator( x ); Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: namespace boost { Chris@16: namespace numeric { Chris@16: namespace odeint { Chris@16: Chris@16: Chris@16: template<> Chris@16: struct is_resizeable< gsl_vector* > Chris@16: { Chris@16: //struct type : public boost::true_type { }; Chris@16: typedef boost::true_type type; Chris@16: const static bool value = type::value; Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct same_size_impl< gsl_vector* , gsl_vector* > Chris@16: { Chris@16: static bool same_size( const gsl_vector* x , const gsl_vector* y ) Chris@16: { Chris@16: return x->size == y->size; Chris@16: } Chris@16: }; Chris@16: Chris@16: template <> Chris@16: struct resize_impl< gsl_vector* , gsl_vector* > Chris@16: { Chris@101: static void resize( gsl_vector* &x , const gsl_vector* y ) Chris@16: { Chris@16: gsl_vector_free( x ); Chris@16: x = gsl_vector_alloc( y->size ); Chris@16: } Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct state_wrapper< gsl_vector* > Chris@16: { Chris@16: typedef double value_type; Chris@16: typedef gsl_vector* state_type; Chris@16: typedef state_wrapper< gsl_vector* > state_wrapper_type; Chris@16: Chris@16: state_type m_v; Chris@16: Chris@16: state_wrapper( ) Chris@16: { Chris@16: m_v = gsl_vector_alloc( 1 ); Chris@16: } Chris@16: Chris@16: state_wrapper( const state_wrapper_type &x ) Chris@16: { Chris@16: resize( m_v , x.m_v ); Chris@16: gsl_vector_memcpy( m_v , x.m_v ); Chris@16: } Chris@16: Chris@16: Chris@16: ~state_wrapper() Chris@16: { Chris@16: gsl_vector_free( m_v ); Chris@16: } Chris@16: Chris@16: }; Chris@16: Chris@16: } // odeint Chris@16: } // numeric Chris@16: } // boost Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_GSL_GSL_WRAPPER_HPP_INCLUDED