1 // (C) Copyright Jeremy Siek 2001.
2 // Distributed under the Boost Software License, Version 1.0. (See
3 // accompanying file LICENSE_1_0.txt or copy at
4 // http://www.boost.org/LICENSE_1_0.txt)
5 
6 // Revision History:
7 
8 // 27 Feb 2001   Jeremy Siek
9 //      Initial checkin.
10 
11 #ifndef BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
12 #define BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
13 
14 #include <iterator>
15 
16 namespace boost {
17 namespace iterators {
18 
19   template <class UnaryFunction>
20   class function_output_iterator {
21     typedef function_output_iterator self;
22   public:
23     typedef std::output_iterator_tag iterator_category;
24     typedef void                value_type;
25     typedef void                difference_type;
26     typedef void                pointer;
27     typedef void                reference;
28 
function_output_iterator()29     explicit function_output_iterator() {}
30 
function_output_iterator(const UnaryFunction & f)31     explicit function_output_iterator(const UnaryFunction& f)
32       : m_f(f) {}
33 
34     struct output_proxy {
output_proxyboost::iterators::function_output_iterator::output_proxy35       output_proxy(UnaryFunction& f) : m_f(f) { }
operator =boost::iterators::function_output_iterator::output_proxy36       template <class T> output_proxy& operator=(const T& value) {
37         m_f(value);
38         return *this;
39       }
40       UnaryFunction& m_f;
41     };
operator *()42     output_proxy operator*() { return output_proxy(m_f); }
operator ++()43     self& operator++() { return *this; }
operator ++(int)44     self& operator++(int) { return *this; }
45   private:
46     UnaryFunction m_f;
47   };
48 
49   template <class UnaryFunction>
50   inline function_output_iterator<UnaryFunction>
make_function_output_iterator(const UnaryFunction & f=UnaryFunction ())51   make_function_output_iterator(const UnaryFunction& f = UnaryFunction()) {
52     return function_output_iterator<UnaryFunction>(f);
53   }
54 
55 } // namespace iterators
56 
57 using iterators::function_output_iterator;
58 using iterators::make_function_output_iterator;
59 
60 } // namespace boost
61 
62 #endif // BOOST_FUNCTION_OUTPUT_ITERATOR_HPP
63