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