// (C) Copyright Jeremy Siek 2001.

// 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)



// Revision History:



// 27 Feb 2001   Jeremy Siek

//      Initial checkin.



#ifndef BOOST_FUNCTION_OUTPUT_ITERATOR_HPP

#define BOOST_FUNCTION_OUTPUT_ITERATOR_HPP



#include <iterator>



namespace boost {



  template <class UnaryFunction>

  class function_output_iterator {

    typedef function_output_iterator self;

  public:

    typedef std::output_iterator_tag iterator_category;

    typedef void                value_type;

    typedef void                difference_type;

    typedef void                pointer;

    typedef void                reference;



    explicit function_output_iterator() {}



    explicit function_output_iterator(const UnaryFunction& f)

      : m_f(f) {}



    struct output_proxy {

      output_proxy(UnaryFunction& f) : m_f(f) { }

      template <class T> output_proxy& operator=(const T& value) {

        m_f(value); 

        return *this; 

      }

      UnaryFunction& m_f;

    };

    output_proxy operator*() { return output_proxy(m_f); }

    self& operator++() { return *this; } 

    self& operator++(int) { return *this; }

  private:

    UnaryFunction m_f;

  };



  template <class UnaryFunction>

  inline function_output_iterator<UnaryFunction>

  make_function_output_iterator(const UnaryFunction& f = UnaryFunction()) {

    return function_output_iterator<UnaryFunction>(f);

  }



} // namespace boost



#endif // BOOST_FUNCTION_OUTPUT_ITERATOR_HPP

