200 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			200 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | 
 | ||
|  | /* | ||
|  |  [auto_generated] | ||
|  |  boost/numeric/odeint/iterator/detail/ode_iterator_base.hpp | ||
|  | 
 | ||
|  |  [begin_description] | ||
|  |  Base class for const_step_iterator and adaptive_iterator. | ||
|  |  [end_description] | ||
|  | 
 | ||
|  |  Copyright 2012-2013 Karsten Ahnert | ||
|  |  Copyright 2012-2013 Mario Mulansky | ||
|  | 
 | ||
|  |  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_ITERATOR_DETAIL_ODE_ITERATOR_BASE_HPP_INCLUDED | ||
|  | #define BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ODE_ITERATOR_BASE_HPP_INCLUDED | ||
|  | 
 | ||
|  | #include <boost/iterator/iterator_facade.hpp> | ||
|  | 
 | ||
|  | #include <boost/numeric/odeint/util/unwrap_reference.hpp> | ||
|  | #include <boost/numeric/odeint/util/detail/less_with_sign.hpp> | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace numeric { | ||
|  | namespace odeint { | ||
|  | namespace detail { | ||
|  | 
 | ||
|  |     struct ode_state_iterator_tag {}; | ||
|  |     struct ode_state_time_iterator_tag {}; | ||
|  | 
 | ||
|  |     template< class Iterator , class Stepper , class System , class State , typename Tag > | ||
|  |     class ode_iterator_base; | ||
|  | 
 | ||
|  | 
 | ||
|  |     /* Specialization for the state iterator that has only state_type as its value_type */ | ||
|  |     template< class Iterator , class Stepper , class System , class State > | ||
|  |     class ode_iterator_base< Iterator , Stepper , System , State , ode_state_iterator_tag > | ||
|  |         : public boost::iterator_facade | ||
|  |           < | ||
|  |               Iterator , | ||
|  |               typename traits::state_type< Stepper >::type const , | ||
|  |               boost::single_pass_traversal_tag | ||
|  |           > | ||
|  |     { | ||
|  |     private: | ||
|  | 
 | ||
|  |         typedef Stepper stepper_type; | ||
|  |         typedef System system_type; | ||
|  |         typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type; | ||
|  |         typedef State state_type; | ||
|  |         typedef typename unwrapped_stepper_type::time_type time_type; | ||
|  |         typedef typename unwrapped_stepper_type::value_type ode_value_type; | ||
|  | 
 | ||
|  |     public: | ||
|  |     | ||
|  |         ode_iterator_base( stepper_type stepper , system_type sys , time_type t , time_type dt ) | ||
|  |             : m_stepper( stepper ) , m_system( sys ) , | ||
|  |               m_t( t ) , m_dt( dt ) , m_at_end( false ) | ||
|  |         { } | ||
|  | 
 | ||
|  |         ode_iterator_base( stepper_type stepper , system_type sys ) | ||
|  |             : m_stepper( stepper ) , m_system( sys ) , | ||
|  |               m_t() , m_dt() , m_at_end( true ) | ||
|  |         { } | ||
|  | 
 | ||
|  |         // this function is only for testing | ||
|  |         bool same( const ode_iterator_base &iter ) const | ||
|  |         { | ||
|  |             return ( | ||
|  |                 //( static_cast<Iterator>(*this).get_state() == | ||
|  |                 //  static_cast<Iterator>(iter).get_state ) && | ||
|  |                 ( m_t == iter.m_t ) &&  | ||
|  |                 ( m_dt == iter.m_dt ) && | ||
|  |                 ( m_at_end == iter.m_at_end ) | ||
|  |                 ); | ||
|  |         } | ||
|  | 
 | ||
|  | 
 | ||
|  |     protected: | ||
|  | 
 | ||
|  |         friend class boost::iterator_core_access; | ||
|  | 
 | ||
|  |         bool equal( ode_iterator_base const& other ) const | ||
|  |         { | ||
|  |             if( m_at_end == other.m_at_end ) | ||
|  |             { | ||
|  |                 return true; | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 return false; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         const state_type& dereference() const | ||
|  |         { | ||
|  |             return static_cast<const Iterator*>(this)->get_state(); | ||
|  |         } | ||
|  | 
 | ||
|  |     protected: | ||
|  | 
 | ||
|  |         stepper_type m_stepper; | ||
|  |         system_type m_system; | ||
|  |         time_type m_t; | ||
|  |         time_type m_dt; | ||
|  |         bool m_at_end; | ||
|  |     }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  |     /* Specialization for the state-time iterator that has pair<state_type,time_type> as its value_type */ | ||
|  | 
 | ||
|  |     template< class Iterator , class Stepper , class System , class State > | ||
|  |     class ode_iterator_base< Iterator , Stepper , System , State , ode_state_time_iterator_tag > | ||
|  |         : public boost::iterator_facade | ||
|  |           < | ||
|  |               Iterator , | ||
|  |               std::pair< const State , const typename traits::time_type< Stepper >::type > , | ||
|  |               boost::single_pass_traversal_tag , | ||
|  |               std::pair< const State& , const typename traits::time_type< Stepper >::type& > | ||
|  |           > | ||
|  |     { | ||
|  |     private: | ||
|  | 
 | ||
|  |         typedef Stepper stepper_type; | ||
|  |         typedef System system_type; | ||
|  |         typedef typename boost::numeric::odeint::unwrap_reference< stepper_type >::type unwrapped_stepper_type; | ||
|  |         typedef State state_type; | ||
|  |         typedef typename unwrapped_stepper_type::time_type time_type; | ||
|  |         typedef typename unwrapped_stepper_type::value_type ode_value_type; | ||
|  | 
 | ||
|  |     public: | ||
|  | 
 | ||
|  |         ode_iterator_base( stepper_type stepper , system_type sys , | ||
|  |                            time_type t , time_type dt ) | ||
|  |             : m_stepper( stepper ) , m_system( sys ) , | ||
|  |               m_t( t ) , m_dt( dt ) , m_at_end( false ) | ||
|  |         { } | ||
|  | 
 | ||
|  |         ode_iterator_base( stepper_type stepper , system_type sys ) | ||
|  |             : m_stepper( stepper ) , m_system( sys ) , m_at_end( true ) | ||
|  |         { } | ||
|  | 
 | ||
|  |         bool same( ode_iterator_base const& iter ) | ||
|  |         { | ||
|  |             return ( | ||
|  |                 //( static_cast<Iterator>(*this).get_state() == | ||
|  |                 //  static_cast<Iterator>(iter).get_state ) && | ||
|  |                 ( m_t == iter.m_t ) && | ||
|  |                 ( m_dt == iter.m_dt ) && | ||
|  |                 ( m_at_end == iter.m_at_end ) | ||
|  |                 ); | ||
|  |         } | ||
|  | 
 | ||
|  | 
 | ||
|  |     protected: | ||
|  | 
 | ||
|  |         friend class boost::iterator_core_access; | ||
|  | 
 | ||
|  |         bool equal( ode_iterator_base const& other ) const | ||
|  |         { | ||
|  |             if( m_at_end == other.m_at_end ) | ||
|  |             { | ||
|  |                 return true; | ||
|  |             } | ||
|  |             else | ||
|  |             { | ||
|  |                 return false; | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         std::pair< const state_type& , const time_type& > dereference() const | ||
|  |         { | ||
|  |             return std::pair< const state_type & , const time_type & >( | ||
|  |                     static_cast<const Iterator*>(this)->get_state() , m_t ); | ||
|  |         } | ||
|  | 
 | ||
|  |         stepper_type m_stepper; | ||
|  |         system_type m_system; | ||
|  |         time_type m_t; | ||
|  |         time_type m_dt; | ||
|  |         bool m_at_end; | ||
|  | 
 | ||
|  |     }; | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | } // namespace detail | ||
|  | } // namespace odeint | ||
|  | } // namespace numeric | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | 
 | ||
|  | 
 | ||
|  | #endif // BOOST_NUMERIC_ODEINT_ITERATOR_DETAIL_ODE_ITERATOR_BASE_HPP_INCLUDED |