• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 /*
3  [auto_generated]
4  boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp
5 
6  [begin_description]
7  Base class for const_step_iterator and adaptive_iterator.
8  [end_description]
9 
10  Copyright 2012-2013 Karsten Ahnert
11  Copyright 2012-2013 Mario Mulansky
12 
13  Distributed under the Boost Software License, Version 1.0.
14  (See accompanying file LICENSE_1_0.txt or
15  copy at http://www.boost.org/LICENSE_1_0.txt)
16  */
17 
18 
19 #ifndef BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ODE_ITERATOR_BASE_HPP_INCLUDED
20 #define BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ODE_ITERATOR_BASE_HPP_INCLUDED
21 
22 #include <boost/iterator/iterator_facade.hpp>
23 
24 #include <boost/numeric/odeint/util/unwrap_reference.hpp>
25 #include <boost/numeric/odeint/util/detail/less_with_sign.hpp>
26 
27 namespace boost {
28 namespace numeric {
29 namespace odeint {
30 namespace detail {
31 
32     struct ode_state_iterator_tag {};
33     struct ode_state_time_iterator_tag {};
34 
35     template< class Iterator , class Stepper , class System , class State , typename Tag >
36     class ode_iterator_base;
37 
38 
39     /* Specialization for the state iterator that has only state_type as its value_type */
40     template< class Iterator , class Stepper , class System , class State >
41     class ode_iterator_base< Iterator , Stepper , System , State , ode_state_iterator_tag >
42         : public boost::iterator_facade
43           <
44               Iterator ,
45               typename traits::state_type< Stepper >::type const ,
46               boost::single_pass_traversal_tag
47           >
48     {
49     private:
50 
51         typedef Stepper stepper_type;
52         typedef System system_type;
53         typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
54         typedef State state_type;
55         typedef typename unwrapped_stepper_type::time_type time_type;
56         typedef typename unwrapped_stepper_type::value_type ode_value_type;
57 
58     public:
59 
ode_iterator_base(stepper_type stepper,system_type sys,time_type t,time_type dt)60         ode_iterator_base( stepper_type stepper , system_type sys , time_type t , time_type dt )
61             : m_stepper( stepper ) , m_system( sys ) ,
62               m_t( t ) , m_dt( dt ) , m_at_end( false )
63         { }
64 
ode_iterator_base(stepper_type stepper,system_type sys)65         ode_iterator_base( stepper_type stepper , system_type sys )
66             : m_stepper( stepper ) , m_system( sys ) ,
67               m_t() , m_dt() , m_at_end( true )
68         { }
69 
70         // this function is only for testing
same(const ode_iterator_base & iter) const71         bool same( const ode_iterator_base &iter ) const
72         {
73             return (
74                 //( static_cast<Iterator>(*this).get_state() ==
75                 //  static_cast<Iterator>(iter).get_state ) &&
76                 ( m_t == iter.m_t ) &&
77                 ( m_dt == iter.m_dt ) &&
78                 ( m_at_end == iter.m_at_end )
79                 );
80         }
81 
82 
83     protected:
84 
85         friend class boost::iterator_core_access;
86 
equal(ode_iterator_base const & other) const87         bool equal( ode_iterator_base const& other ) const
88         {
89             if( m_at_end == other.m_at_end )
90             {
91                 return true;
92             }
93             else
94             {
95                 return false;
96             }
97         }
98 
dereference() const99         const state_type& dereference() const
100         {
101             return static_cast<const Iterator*>(this)->get_state();
102         }
103 
104     protected:
105 
106         stepper_type m_stepper;
107         system_type m_system;
108         time_type m_t;
109         time_type m_dt;
110         bool m_at_end;
111     };
112 
113 
114 
115     /* Specialization for the state-time iterator that has pair<state_type,time_type> as its value_type */
116 
117     template< class Iterator , class Stepper , class System , class State >
118     class ode_iterator_base< Iterator , Stepper , System , State , ode_state_time_iterator_tag >
119         : public boost::iterator_facade
120           <
121               Iterator ,
122               std::pair< const State , const typename traits::time_type< Stepper >::type > ,
123               boost::single_pass_traversal_tag ,
124               std::pair< const State& , const typename traits::time_type< Stepper >::type& >
125           >
126     {
127     private:
128 
129         typedef Stepper stepper_type;
130         typedef System system_type;
131         typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type;
132         typedef State state_type;
133         typedef typename unwrapped_stepper_type::time_type time_type;
134         typedef typename unwrapped_stepper_type::value_type ode_value_type;
135 
136     public:
137 
ode_iterator_base(stepper_type stepper,system_type sys,time_type t,time_type dt)138         ode_iterator_base( stepper_type stepper , system_type sys ,
139                            time_type t , time_type dt )
140             : m_stepper( stepper ) , m_system( sys ) ,
141               m_t( t ) , m_dt( dt ) , m_at_end( false )
142         { }
143 
ode_iterator_base(stepper_type stepper,system_type sys)144         ode_iterator_base( stepper_type stepper , system_type sys )
145             : m_stepper( stepper ) , m_system( sys ) , m_at_end( true )
146         { }
147 
same(ode_iterator_base const & iter)148         bool same( ode_iterator_base const& iter )
149         {
150             return (
151                 //( static_cast<Iterator>(*this).get_state() ==
152                 //  static_cast<Iterator>(iter).get_state ) &&
153                 ( m_t == iter.m_t ) &&
154                 ( m_dt == iter.m_dt ) &&
155                 ( m_at_end == iter.m_at_end )
156                 );
157         }
158 
159 
160     protected:
161 
162         friend class boost::iterator_core_access;
163 
equal(ode_iterator_base const & other) const164         bool equal( ode_iterator_base const& other ) const
165         {
166             if( m_at_end == other.m_at_end )
167             {
168                 return true;
169             }
170             else
171             {
172                 return false;
173             }
174         }
175 
dereference() const176         std::pair< const state_type& , const time_type& > dereference() const
177         {
178             return std::pair< const state_type & , const time_type & >(
179                     static_cast<const Iterator*>(this)->get_state() , m_t );
180         }
181 
182         stepper_type m_stepper;
183         system_type m_system;
184         time_type m_t;
185         time_type m_dt;
186         bool m_at_end;
187 
188     };
189 
190 
191 
192 } // namespace detail
193 } // namespace odeint
194 } // namespace numeric
195 } // namespace boost
196 
197 
198 
199 #endif // BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ODE_ITERATOR_BASE_HPP_INCLUDED
200