#ifndef GSL_VECTOR_ADAPTOR_HPP_INCLUDED #define GSL_VECTOR_ADAPTOR_HPP_INCLUDED #include #include #include class gsl_vector_iterator : public boost::iterator_facade< gsl_vector_iterator , double , boost::forward_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 ) { } private : friend class boost::iterator_core_access; friend gsl_vector_iterator end_iterator( gsl_vector * ); void increment( void ) { m_p += m_stride; } bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; } double& dereference( void ) const { return *m_p; } double *m_p; size_t m_stride; }; class const_gsl_vector_iterator : public boost::iterator_facade< const_gsl_vector_iterator , double , boost::forward_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 ) { } private : friend class boost::iterator_core_access; friend const_gsl_vector_iterator end_iterator( const gsl_vector * ); void increment( void ) { m_p += m_stride; } bool equal( const 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; }; 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_iterator< gsl_vector* > { typedef gsl_vector_iterator type; }; template<> struct range_iterator< const gsl_vector* > { typedef const_gsl_vector_iterator type; }; range_iterator< gsl_vector* >::type begin( gsl_vector* &x ) { return gsl_vector_iterator( x ); } range_iterator< const gsl_vector* >::type begin( const gsl_vector* &x ) { return const_gsl_vector_iterator( x ); } range_iterator< gsl_vector* >::type end( gsl_vector* &x ) { return end_iterator( x ); } range_iterator< const gsl_vector* >::type end( const gsl_vector* &x ) { return end_iterator( x ); } } #endif // GSL_VECTOR_ADAPTOR_HPP_INCLUDED