gsl_wrapper.hpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. /*
  2. [auto_generated]
  3. boost/numeric/odeint/external/gsl/gsl_wrapper.hpp
  4. [begin_description]
  5. Wrapper for gsl_vector.
  6. [end_description]
  7. Copyright 2011-2012 Mario Mulansky
  8. Copyright 2011 Karsten Ahnert
  9. Distributed under the Boost Software License, Version 1.0.
  10. (See accompanying file LICENSE_1_0.txt or
  11. copy at http://www.boost.org/LICENSE_1_0.txt)
  12. */
  13. #ifndef BOOST_NUMERIC_ODEINT_EXTERNAL_GSL_GSL_WRAPPER_HPP_INCLUDED
  14. #define BOOST_NUMERIC_ODEINT_EXTERNAL_GSL_GSL_WRAPPER_HPP_INCLUDED
  15. #include <new>
  16. #include <gsl/gsl_vector.h>
  17. #include <boost/type_traits/integral_constant.hpp>
  18. #include <boost/range.hpp>
  19. #include <boost/iterator/iterator_facade.hpp>
  20. #include <boost/numeric/odeint/util/state_wrapper.hpp>
  21. #include <boost/numeric/odeint/util/is_resizeable.hpp>
  22. #include <boost/numeric/odeint/util/copy.hpp>
  23. class const_gsl_vector_iterator;
  24. /*
  25. * defines an iterator for gsl_vector
  26. */
  27. class gsl_vector_iterator : public boost::iterator_facade< gsl_vector_iterator , double , boost::random_access_traversal_tag >
  28. {
  29. public :
  30. gsl_vector_iterator( void ): m_p(0) , m_stride( 0 ) { }
  31. explicit gsl_vector_iterator( gsl_vector *p ) : m_p( p->data ) , m_stride( p->stride ) { }
  32. friend gsl_vector_iterator end_iterator( gsl_vector * );
  33. private :
  34. friend class boost::iterator_core_access;
  35. friend class const_gsl_vector_iterator;
  36. void increment( void ) { m_p += m_stride; }
  37. void decrement( void ) { m_p -= m_stride; }
  38. void advance( ptrdiff_t n ) { m_p += n*m_stride; }
  39. bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; }
  40. bool equal( const const_gsl_vector_iterator &other ) const;
  41. double& dereference( void ) const { return *m_p; }
  42. double *m_p;
  43. size_t m_stride;
  44. };
  45. /*
  46. * defines an const iterator for gsl_vector
  47. */
  48. class const_gsl_vector_iterator : public boost::iterator_facade< const_gsl_vector_iterator , const double , boost::random_access_traversal_tag >
  49. {
  50. public :
  51. const_gsl_vector_iterator( void ): m_p(0) , m_stride( 0 ) { }
  52. explicit const_gsl_vector_iterator( const gsl_vector *p ) : m_p( p->data ) , m_stride( p->stride ) { }
  53. const_gsl_vector_iterator( const gsl_vector_iterator &p ) : m_p( p.m_p ) , m_stride( p.m_stride ) { }
  54. private :
  55. friend class boost::iterator_core_access;
  56. friend class gsl_vector_iterator;
  57. friend const_gsl_vector_iterator end_iterator( const gsl_vector * );
  58. void increment( void ) { m_p += m_stride; }
  59. void decrement( void ) { m_p -= m_stride; }
  60. void advance( ptrdiff_t n ) { m_p += n*m_stride; }
  61. bool equal( const const_gsl_vector_iterator &other ) const { return this->m_p == other.m_p; }
  62. bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; }
  63. const double& dereference( void ) const { return *m_p; }
  64. const double *m_p;
  65. size_t m_stride;
  66. };
  67. bool gsl_vector_iterator::equal( const const_gsl_vector_iterator &other ) const { return this->m_p == other.m_p; }
  68. gsl_vector_iterator end_iterator( gsl_vector *x )
  69. {
  70. gsl_vector_iterator iter( x );
  71. iter.m_p += iter.m_stride * x->size;
  72. return iter;
  73. }
  74. const_gsl_vector_iterator end_iterator( const gsl_vector *x )
  75. {
  76. const_gsl_vector_iterator iter( x );
  77. iter.m_p += iter.m_stride * x->size;
  78. return iter;
  79. }
  80. namespace boost
  81. {
  82. template<>
  83. struct range_mutable_iterator< gsl_vector* >
  84. {
  85. typedef gsl_vector_iterator type;
  86. };
  87. template<>
  88. struct range_const_iterator< gsl_vector* >
  89. {
  90. typedef const_gsl_vector_iterator type;
  91. };
  92. } // namespace boost
  93. // template<>
  94. inline gsl_vector_iterator range_begin( gsl_vector *x )
  95. {
  96. return gsl_vector_iterator( x );
  97. }
  98. // template<>
  99. inline const_gsl_vector_iterator range_begin( const gsl_vector *x )
  100. {
  101. return const_gsl_vector_iterator( x );
  102. }
  103. // template<>
  104. inline gsl_vector_iterator range_end( gsl_vector *x )
  105. {
  106. return end_iterator( x );
  107. }
  108. // template<>
  109. inline const_gsl_vector_iterator range_end( const gsl_vector *x )
  110. {
  111. return end_iterator( x );
  112. }
  113. namespace boost {
  114. namespace numeric {
  115. namespace odeint {
  116. template<>
  117. struct is_resizeable< gsl_vector* >
  118. {
  119. //struct type : public boost::true_type { };
  120. typedef boost::true_type type;
  121. const static bool value = type::value;
  122. };
  123. template <>
  124. struct same_size_impl< gsl_vector* , gsl_vector* >
  125. {
  126. static bool same_size( const gsl_vector* x , const gsl_vector* y )
  127. {
  128. return x->size == y->size;
  129. }
  130. };
  131. template <>
  132. struct resize_impl< gsl_vector* , gsl_vector* >
  133. {
  134. static void resize( gsl_vector* &x , const gsl_vector* y )
  135. {
  136. gsl_vector_free( x );
  137. x = gsl_vector_alloc( y->size );
  138. }
  139. };
  140. template<>
  141. struct state_wrapper< gsl_vector* >
  142. {
  143. typedef double value_type;
  144. typedef gsl_vector* state_type;
  145. typedef state_wrapper< gsl_vector* > state_wrapper_type;
  146. state_type m_v;
  147. state_wrapper( )
  148. {
  149. m_v = gsl_vector_alloc( 1 );
  150. }
  151. state_wrapper( const state_wrapper_type &x )
  152. {
  153. resize( m_v , x.m_v );
  154. gsl_vector_memcpy( m_v , x.m_v );
  155. }
  156. ~state_wrapper()
  157. {
  158. gsl_vector_free( m_v );
  159. }
  160. };
  161. } // odeint
  162. } // numeric
  163. } // boost
  164. #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_GSL_GSL_WRAPPER_HPP_INCLUDED