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
|