gsl_wrapper.hpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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/range.hpp>
  18. #include <boost/iterator/iterator_facade.hpp>
  19. #include <boost/numeric/odeint/util/state_wrapper.hpp>
  20. #include <boost/numeric/odeint/util/is_resizeable.hpp>
  21. #include <boost/numeric/odeint/util/copy.hpp>
  22. class const_gsl_vector_iterator;
  23. /*
  24. * defines an iterator for gsl_vector
  25. */
  26. class gsl_vector_iterator : public boost::iterator_facade< gsl_vector_iterator , double , boost::random_access_traversal_tag >
  27. {
  28. public :
  29. gsl_vector_iterator( void ): m_p(0) , m_stride( 0 ) { }
  30. explicit gsl_vector_iterator( gsl_vector *p ) : m_p( p->data ) , m_stride( p->stride ) { }
  31. friend gsl_vector_iterator end_iterator( gsl_vector * );
  32. private :
  33. friend class boost::iterator_core_access;
  34. friend class const_gsl_vector_iterator;
  35. void increment( void ) { m_p += m_stride; }
  36. void decrement( void ) { m_p -= m_stride; }
  37. void advance( ptrdiff_t n ) { m_p += n*m_stride; }
  38. bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; }
  39. bool equal( const const_gsl_vector_iterator &other ) const;
  40. double& dereference( void ) const { return *m_p; }
  41. double *m_p;
  42. size_t m_stride;
  43. };
  44. /*
  45. * defines an const iterator for gsl_vector
  46. */
  47. class const_gsl_vector_iterator : public boost::iterator_facade< const_gsl_vector_iterator , const double , boost::random_access_traversal_tag >
  48. {
  49. public :
  50. const_gsl_vector_iterator( void ): m_p(0) , m_stride( 0 ) { }
  51. explicit const_gsl_vector_iterator( const gsl_vector *p ) : m_p( p->data ) , m_stride( p->stride ) { }
  52. const_gsl_vector_iterator( const gsl_vector_iterator &p ) : m_p( p.m_p ) , m_stride( p.m_stride ) { }
  53. private :
  54. friend class boost::iterator_core_access;
  55. friend class gsl_vector_iterator;
  56. friend const_gsl_vector_iterator end_iterator( const gsl_vector * );
  57. void increment( void ) { m_p += m_stride; }
  58. void decrement( void ) { m_p -= m_stride; }
  59. void advance( ptrdiff_t n ) { m_p += n*m_stride; }
  60. bool equal( const const_gsl_vector_iterator &other ) const { return this->m_p == other.m_p; }
  61. bool equal( const gsl_vector_iterator &other ) const { return this->m_p == other.m_p; }
  62. const double& dereference( void ) const { return *m_p; }
  63. const double *m_p;
  64. size_t m_stride;
  65. };
  66. bool gsl_vector_iterator::equal( const const_gsl_vector_iterator &other ) const { return this->m_p == other.m_p; }
  67. gsl_vector_iterator end_iterator( gsl_vector *x )
  68. {
  69. gsl_vector_iterator iter( x );
  70. iter.m_p += iter.m_stride * x->size;
  71. return iter;
  72. }
  73. const_gsl_vector_iterator end_iterator( const gsl_vector *x )
  74. {
  75. const_gsl_vector_iterator iter( x );
  76. iter.m_p += iter.m_stride * x->size;
  77. return iter;
  78. }
  79. namespace boost
  80. {
  81. template<>
  82. struct range_mutable_iterator< gsl_vector* >
  83. {
  84. typedef gsl_vector_iterator type;
  85. };
  86. template<>
  87. struct range_const_iterator< gsl_vector* >
  88. {
  89. typedef const_gsl_vector_iterator type;
  90. };
  91. } // namespace boost
  92. // template<>
  93. inline gsl_vector_iterator range_begin( gsl_vector *x )
  94. {
  95. return gsl_vector_iterator( x );
  96. }
  97. // template<>
  98. inline const_gsl_vector_iterator range_begin( const gsl_vector *x )
  99. {
  100. return const_gsl_vector_iterator( x );
  101. }
  102. // template<>
  103. inline gsl_vector_iterator range_end( gsl_vector *x )
  104. {
  105. return end_iterator( x );
  106. }
  107. // template<>
  108. inline const_gsl_vector_iterator range_end( const gsl_vector *x )
  109. {
  110. return end_iterator( x );
  111. }
  112. namespace boost {
  113. namespace numeric {
  114. namespace odeint {
  115. template<>
  116. struct is_resizeable< gsl_vector* >
  117. {
  118. //struct type : public std::integral_constant<bool, true> { };
  119. typedef std::integral_constant<bool, true> type;
  120. const static bool value = type::value;
  121. };
  122. template <>
  123. struct same_size_impl< gsl_vector* , gsl_vector* >
  124. {
  125. static bool same_size( const gsl_vector* x , const gsl_vector* y )
  126. {
  127. return x->size == y->size;
  128. }
  129. };
  130. template <>
  131. struct resize_impl< gsl_vector* , gsl_vector* >
  132. {
  133. static void resize( gsl_vector* &x , const gsl_vector* y )
  134. {
  135. gsl_vector_free( x );
  136. x = gsl_vector_alloc( y->size );
  137. }
  138. };
  139. template<>
  140. struct state_wrapper< gsl_vector* >
  141. {
  142. typedef double value_type;
  143. typedef gsl_vector* state_type;
  144. typedef state_wrapper< gsl_vector* > state_wrapper_type;
  145. state_type m_v;
  146. state_wrapper( )
  147. {
  148. m_v = gsl_vector_alloc( 1 );
  149. }
  150. state_wrapper( const state_wrapper_type &x )
  151. {
  152. resize( m_v , x.m_v );
  153. gsl_vector_memcpy( m_v , x.m_v );
  154. }
  155. ~state_wrapper()
  156. {
  157. gsl_vector_free( m_v );
  158. }
  159. };
  160. } // odeint
  161. } // numeric
  162. } // boost
  163. #endif // BOOST_NUMERIC_ODEINT_EXTERNAL_GSL_GSL_WRAPPER_HPP_INCLUDED