Function Output Iterator

Author: David Abrahams, Jeremy Siek, Thomas Witt
Contact: dave@boost-consulting.com, jsiek@osl.iu.edu, witt@ive.uni-hannover.de
Organization: Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction
Date: 2004-01-12
Copyright: Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved
abstract:

The function output iterator adaptor makes it easier to create custom output iterators. The adaptor takes a unary function and creates a model of Output Iterator. Each item assigned to the output iterator is passed as an argument to the unary function. The motivation for this iterator is that creating a conforming output iterator is non-trivial, particularly because the proper implementation usually requires a proxy object.

Table of Contents

template <class UnaryFunction>
class function_output_iterator {
public:
  typedef iterator_tag<
        writable_iterator
      , incrementable_traversal_tag
  > iterator_category;
  typedef void                value_type;
  typedef void                difference_type;
  typedef void                pointer;
  typedef void                reference;

  explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());

  struct output_proxy {
    output_proxy(UnaryFunction& f);
    template <class T> output_proxy& operator=(const T& value);
  };
  output_proxy operator*();
  function_output_iterator& operator++();
  function_output_iterator& operator++(int);
};

function_output_iterator requirements

The UnaryFunction must be Assignable, Copy Constructible, and the expression f(x) must be valid, where f is an object of type UnaryFunction and x is an object of a type accepted by f. The resulting function_output_iterator is a model of the Writable and Incrementable Iterator concepts.

function_output_iterator operations

explicit function_output_iterator(const UnaryFunction& f = UnaryFunction());

Returns:An instance of function_output_iterator with f stored as a data member.

output_proxy operator*();

Returns:An instance of output_proxy constructed with a copy of the unary function f.

function_output_iterator& operator++();

Returns:*this

function_output_iterator& operator++(int);

Returns:*this

function_output_iterator::output_proxy operations

output_proxy(UnaryFunction& f);

Returns:An instance of output_proxy with f stored as a data member.

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

Effects:
m_f(value); 
return *this; 

Example

struct string_appender
{
    string_appender(std::string& s)
        : m_str(&s)
    {}

    void operator()(const std::string& x) const
    {
        *m_str += x;
    }

    std::string* m_str;
};

int main(int, char*[])
{
  std::vector<std::string> x;
  x.push_back("hello");
  x.push_back(" ");
  x.push_back("world");
  x.push_back("!");

  std::string s = "";
  std::copy(x.begin(), x.end(), 
            boost::make_function_output_iterator(string_appender(s)));

  std::cout << s << std::endl;

  return 0;
}