170 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| // Copyright 2009 (C) Dean Michael Berris <me@deanberris.com>
 | |
| // Copyright 2012 (C) Google, Inc.
 | |
| // Copyright 2012 (C) Jeffrey Lee Hellrung, Jr.
 | |
| // 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_FUNCTION_INPUT_ITERATOR
 | |
| #define BOOST_FUNCTION_INPUT_ITERATOR
 | |
| 
 | |
| #include <boost/assert.hpp>
 | |
| #include <boost/mpl/if.hpp>
 | |
| #include <boost/function_types/is_function_pointer.hpp>
 | |
| #include <boost/function_types/is_function_reference.hpp>
 | |
| #include <boost/function_types/result_type.hpp>
 | |
| #include <boost/iterator/iterator_facade.hpp>
 | |
| #include <boost/none.hpp>
 | |
| #include <boost/optional/optional.hpp>
 | |
| 
 | |
| namespace boost {
 | |
| 
 | |
| namespace iterators {
 | |
| 
 | |
|     namespace impl {
 | |
| 
 | |
|         template <class Function, class Input>
 | |
|         class function_input_iterator
 | |
|             : public iterator_facade<
 | |
|             function_input_iterator<Function, Input>,
 | |
|             typename Function::result_type,
 | |
|             single_pass_traversal_tag,
 | |
|             typename Function::result_type const &
 | |
|             >
 | |
|         {
 | |
|         public:
 | |
|             function_input_iterator() {}
 | |
|             function_input_iterator(Function & f_, Input state_ = Input())
 | |
|                 : f(&f_), state(state_) {}
 | |
| 
 | |
|             void increment() {
 | |
|                 if(value)
 | |
|                     value = none;
 | |
|                 else
 | |
|                     (*f)();
 | |
|                 ++state;
 | |
|             }
 | |
| 
 | |
|             typename Function::result_type const &
 | |
|                 dereference() const {
 | |
|                     return (value ? value : value = (*f)()).get();
 | |
|             }
 | |
| 
 | |
|             bool equal(function_input_iterator const & other) const {
 | |
|                 return f == other.f && state == other.state;
 | |
|             }
 | |
| 
 | |
|         private:
 | |
|             Function * f;
 | |
|             Input state;
 | |
|             mutable optional<typename Function::result_type> value;
 | |
|         };
 | |
| 
 | |
|         template <class Function, class Input>
 | |
|         class function_pointer_input_iterator
 | |
|             : public iterator_facade<
 | |
|             function_pointer_input_iterator<Function, Input>,
 | |
|             typename function_types::result_type<Function>::type,
 | |
|             single_pass_traversal_tag,
 | |
|             typename function_types::result_type<Function>::type const &
 | |
|             >
 | |
|         {
 | |
|         public:
 | |
|             function_pointer_input_iterator() {}
 | |
|             function_pointer_input_iterator(Function &f_, Input state_ = Input())
 | |
|                 : f(f_), state(state_) {}
 | |
| 
 | |
|             void increment() {
 | |
|                 if(value)
 | |
|                     value = none;
 | |
|                 else
 | |
|                     (*f)();
 | |
|                 ++state;
 | |
|             }
 | |
| 
 | |
|             typename function_types::result_type<Function>::type const &
 | |
|                 dereference() const {
 | |
|                     return (value ? value : value = (*f)()).get();
 | |
|             }
 | |
| 
 | |
|             bool equal(function_pointer_input_iterator const & other) const {
 | |
|                 return f == other.f && state == other.state;
 | |
|             }
 | |
| 
 | |
|         private:
 | |
|             Function f;
 | |
|             Input state;
 | |
|             mutable optional<typename function_types::result_type<Function>::type> value;
 | |
|         };
 | |
| 
 | |
|         template <class Function, class Input>
 | |
|         class function_reference_input_iterator
 | |
|             : public function_pointer_input_iterator<Function*,Input>
 | |
|         {
 | |
|         public:
 | |
|             function_reference_input_iterator(Function & f_, Input state_ = Input())
 | |
|                 : function_pointer_input_iterator<Function*,Input>(&f_, state_)
 | |
|             {}
 | |
|         };
 | |
| 
 | |
|     } // namespace impl
 | |
| 
 | |
|     template <class Function, class Input>
 | |
|     class function_input_iterator
 | |
|         : public mpl::if_<
 | |
|             function_types::is_function_pointer<Function>,
 | |
|             impl::function_pointer_input_iterator<Function,Input>,
 | |
|             typename mpl::if_<
 | |
|                 function_types::is_function_reference<Function>,
 | |
|                 impl::function_reference_input_iterator<Function,Input>,
 | |
|                 impl::function_input_iterator<Function,Input>
 | |
|             >::type
 | |
|         >::type
 | |
|     {
 | |
|         typedef typename mpl::if_<
 | |
|             function_types::is_function_pointer<Function>,
 | |
|             impl::function_pointer_input_iterator<Function,Input>,
 | |
|             typename mpl::if_<
 | |
|                 function_types::is_function_reference<Function>,
 | |
|                 impl::function_reference_input_iterator<Function,Input>,
 | |
|                 impl::function_input_iterator<Function,Input>
 | |
|             >::type
 | |
|         >::type base_type;
 | |
|     public:
 | |
|         function_input_iterator(Function & f, Input i)
 | |
|             : base_type(f, i) {}
 | |
|     };
 | |
| 
 | |
|     template <class Function, class Input>
 | |
|     inline function_input_iterator<Function, Input>
 | |
|         make_function_input_iterator(Function & f, Input state) {
 | |
|             typedef function_input_iterator<Function, Input> result_t;
 | |
|             return result_t(f, state);
 | |
|     }
 | |
| 
 | |
|     template <class Function, class Input>
 | |
|     inline function_input_iterator<Function*, Input>
 | |
|         make_function_input_iterator(Function * f, Input state) {
 | |
|             typedef function_input_iterator<Function*, Input> result_t;
 | |
|             return result_t(f, state);
 | |
|     }
 | |
| 
 | |
|     struct infinite {
 | |
|         infinite & operator++() { return *this; }
 | |
|         infinite & operator++(int) { return *this; }
 | |
|         bool operator==(infinite &) const { return false; };
 | |
|         bool operator==(infinite const &) const { return false; };
 | |
|     };
 | |
| 
 | |
| } // namespace iterators
 | |
| 
 | |
| using iterators::function_input_iterator;
 | |
| using iterators::make_function_input_iterator;
 | |
| using iterators::infinite;
 | |
| 
 | |
| } // namespace boost
 | |
| 
 | |
| #endif
 | |
| 
 | 
