行単位で読み込む input_iterator

行単位で読み込むinput_iteratorが見つからなかったので自作してみた。
なんかBoostのライブラリを組み合わせればできるような気もするけど。

#include <string>
#incldue <iostream>
#include <iterator>
#include <boost/iterator/iterator_facade.hpp>

template<typename CharType, typename Traits = std::char_traits<CharType> >
class basic_istream_line_iterator : public boost::iterator_facade<
    basic_istream_line_iterator<CharType, Traits>,
    const std::basic_string<CharType, Traits>,
    std::input_iterator_tag>
{
public:
    typedef CharType                             char_type;
    typedef Traits                               traits_type;
    typedef std::basic_istream<CharType, Traits> istream_type;
    typedef std::basic_string<CharType, Traits>  string_type;

public:
    basic_istream_line_iterator() : in_(0), ok_(false) { }

    basic_istream_line_iterator(istream_type& in) : in_(&in) {
        read();
    }

    void increment() {
        read();
    }

    bool equal(const basic_istream_line_iterator& x) const {
        return ok_ == x.ok_ && in_ == x.in_;
    }

    const string_type& dereference() const {
        return line_;
    }

private:
    void read() {
        ok_ = std::getline(*in_, line_);
        if (!ok_) {
            in_ = 0;
        }
    }

private:
    istream_type* in_;
    bool ok_;
    string_type line_;
};

typedef basic_istream_line_iterator<char> istream_line_iterator;

使うときはこんな感じ。

int main(int argc, char **argv)
{
    using namespace std;
    vector<string> lines;
    copy(istream_line_iterator(cin),
              istream_line_iterator(),
              back_inserter(lines));
    sort(lines.begin(), lines.end());
    copy(lines.begin(), lines.end(), ostream_iterator<string>(cout, "\n"));

    return 0;
}

しかし、STLやBoostをバリバリ使っていないと何が何だかわからないソースだな。