Boost logo

Boost :

From: Jeremy Siek (jsiek_at_[hidden])
Date: 2002-07-26 11:16:54


On Fri, 26 Jul 2002, David Abrahams wrote:
dave>
dave> Thanks! Now where's that line_iterator?
dave>

Right here :)

// Example adapted from page 4 of Matthew Austern's
// "Generic Programming and the STL".

#include <iostream>
#include <string>
#include <cassert>
#include <boost/iterator_adaptors.hpp>
#include <boost/cstdlib.hpp>

class line_iterator_policies : public boost::default_iterator_policies
{
  std::istream* in; // rationale for pointer: if we did
reference
                                // instead, then iterator could not be
default
                                // constructible.
  std::string line;
public:
  line_iterator_policies() : in(0) { } // always need a default
constructor
  line_iterator_policies(std::istream& in) : in(&in) { }

  void initialize(bool& at_end) {
    if (in != 0)
      read(at_end);
    else
      at_end = true;
  }

  template <typename IteratorAdaptor>
  typename IteratorAdaptor::reference
  dereference(const IteratorAdaptor& x) const
    { return line; }

  template <typename IteratorAdaptor>
  void increment(IteratorAdaptor& x) { read(x.base()); }
private:
  void read(bool& at_end) { assert(in != 0);
    if (*in)
      std::getline(*in, line);
    if (*in)
      at_end = true;
    else
      at_end = false;
  }
};

typedef boost::iterator_adaptor<bool, // for at_end
  line_iterator_policies,
  boost::value_type_is<std::string>,
  boost::reference_is<std::string>,
  boost::pointer_is<std::string*>,
  boost::difference_type_is<std::ptrdiff_t>,
  boost::iterator_category_is<std::input_iterator_tag>
> line_iterator;

line_iterator make_line_iterator(std::istream& in) {
  bool at_end;
  line_iterator_policies p(in);
  return line_iterator(at_end, p);
}

int main()
{
  line_iterator iter = make_line_iterator(std::cin), eof_iter;
  std::vector<std::string> vec(iter, eof_iter);
  std::sort(vec.begin(), vec.end());
  std::copy(vec.begin(), vec.end(),
            std::ostream_iterator<std::string>(std::cout, "\n"));
  return boost::exit_success;
};

----------------------------------------------------------------------
 Jeremy Siek http://php.indiana.edu/~jsiek/
 Ph.D. Student, Indiana Univ. B'ton email: jsiek_at_[hidden]
 C++ Booster (http://www.boost.org) office phone: (812) 855-3608
----------------------------------------------------------------------


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk