mirror of
				https://github.com/boostorg/iterator.git
				synced 2025-11-04 10:21:38 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			133 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
		
			4.6 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
:Author:
 | 
						|
    `Dean Michael Berris <mailto:me@deanberris.com>`_
 | 
						|
 | 
						|
:License:
 | 
						|
    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)
 | 
						|
 | 
						|
:Copyright:
 | 
						|
    Copyright 2012 Google, Inc.
 | 
						|
 | 
						|
Function Input Iterator
 | 
						|
=======================
 | 
						|
 | 
						|
The Function Input Iterator allows for creating iterators that encapsulate
 | 
						|
a nullary function object and a state object which tracks the number of times
 | 
						|
the iterator has been incremented. A Function Input Iterator models the
 | 
						|
`InputIterator`_ concept and is useful for creating bounded input iterators.
 | 
						|
 | 
						|
.. _InputIterator: http://www.sgi.com/tech/stl/InputIterator.html
 | 
						|
 | 
						|
The Function Input Iterator takes a function that models the Generator_ concept
 | 
						|
(which is basically a nullary or 0-arity function object). The first dereference
 | 
						|
of the iterator at a given position invokes the generator function and stores
 | 
						|
and returns the result; subsequent dereferences at the same position simply
 | 
						|
return the same stored result. Incrementing the iterator places it at a new
 | 
						|
position, hence a subsequent dereference will generate a new value via another
 | 
						|
invokation of the generator function. This ensures the generator function is
 | 
						|
invoked precisely when the iterator is requested to return a (new) value.
 | 
						|
 | 
						|
.. _Generator: http://www.sgi.com/tech/stl/Generator.html
 | 
						|
 | 
						|
The Function Input Iterator encapsulates a state object which models the
 | 
						|
`Incrementable Concept`_ and the EqualityComparable_ Concept. These concepts are
 | 
						|
described below as:
 | 
						|
 | 
						|
.. _EqualityComparable: http://www.sgi.com/tech/stl/EqualityComparable.html
 | 
						|
 | 
						|
Incrementable Concept
 | 
						|
---------------------
 | 
						|
 | 
						|
A type models the Incrementable Concept when it supports the pre- and post-
 | 
						|
increment operators. For a given object ``i`` with type ``I``, the following 
 | 
						|
constructs should be valid:
 | 
						|
 | 
						|
=========  =================  ===========
 | 
						|
Construct  Description        Return Type
 | 
						|
-----------------------------------------
 | 
						|
i++        Post-increment i.  I
 | 
						|
++i        Pre-increment i.   I&
 | 
						|
=========  =================  ===========
 | 
						|
 | 
						|
NOTE: An Incrementable type should also be DefaultConstructible_.
 | 
						|
 | 
						|
.. _DefaultConstructible: http://www.sgi.com/tech/stl/DefaultConstructible.html
 | 
						|
 | 
						|
Synopsis
 | 
						|
--------
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
    namespace {
 | 
						|
        template <class Function, class State>
 | 
						|
        class function_input_iterator;
 | 
						|
 | 
						|
        template <class Function, class State>
 | 
						|
        typename function_input_iterator<Function, State>
 | 
						|
        make_function_input_iterator(Function & f, State s);
 | 
						|
 | 
						|
        struct infinite;
 | 
						|
    }
 | 
						|
 | 
						|
Function Input Iterator Class
 | 
						|
-----------------------------
 | 
						|
 | 
						|
The class Function Input Iterator class takes two template parameters
 | 
						|
``Function`` and ``State``. These two template parameters tell the
 | 
						|
Function Input Iterator the type of the function to encapsulate and
 | 
						|
the type of the internal state value to hold.
 | 
						|
 | 
						|
The ``State`` parameter is important in cases where you want to
 | 
						|
control the type of the counter which determines whether two iterators 
 | 
						|
are at the same state. This allows for creating a pair of iterators which 
 | 
						|
bound the range of the invocations of the encapsulated functions.
 | 
						|
 | 
						|
Examples
 | 
						|
--------
 | 
						|
 | 
						|
The following example shows how we use the function input iterator class
 | 
						|
in cases where we want to create bounded (lazy) generated ranges.
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
    struct generator {
 | 
						|
        typedef int result_type;
 | 
						|
        generator() { srand(time(0)); }
 | 
						|
        result_type operator() () const {
 | 
						|
            return rand();
 | 
						|
        }
 | 
						|
    };
 | 
						|
 | 
						|
    int main(int argc, char * argv[]) {
 | 
						|
        generator f;
 | 
						|
        copy(
 | 
						|
                make_function_input_iterator(f, 0),
 | 
						|
                make_function_input_iterator(f, 10),
 | 
						|
                ostream_iterator<int>(cout, " ")
 | 
						|
            );
 | 
						|
        return 0;
 | 
						|
    }
 | 
						|
 | 
						|
Here we can see that we've bounded the number of invocations using an ``int``
 | 
						|
that counts from ``0`` to ``10``. Say we want to create an endless stream
 | 
						|
of random numbers and encapsulate that in a pair of integers, we can do
 | 
						|
it with the ``boost::infinite`` helper class.
 | 
						|
 | 
						|
::
 | 
						|
 | 
						|
    copy(
 | 
						|
            make_function_input_iterator(f,infinite()),
 | 
						|
            make_function_input_iterator(f,infinite()),
 | 
						|
            ostream_iterator<int>(cout, " ")
 | 
						|
        );
 | 
						|
   
 | 
						|
Above, instead of creating a huge vector we rely on the STL copy algorithm
 | 
						|
to traverse the function input iterator and call the function object f
 | 
						|
as it increments the iterator. The special property of ``boost::infinite``
 | 
						|
is that equating two instances always yield false -- and that incrementing
 | 
						|
an instance of ``boost::infinite`` doesn't do anything. This is an efficient
 | 
						|
way of stating that the iterator range provided by two iterators with an
 | 
						|
encapsulated infinite state will definitely be infinite.
 | 
						|
 | 
						|
 |