line_iterator

今日は時間がなくて、こんなのしかできませんでした。
誰もが一度は作りそうなistream_iteratorのgetline版です。

#include <boost/iterator/iterator_facade.hpp>
#include <iosfwd>
#include <string>

namespace hamigaki
{

template<typename CharT>
class line_iterator
    : public boost::iterator_facade<
        line_iterator<CharT>,
        const std::basic_string<CharT>,
        boost::single_pass_traversal_tag
    >
{
    friend class boost::iterator_core_access;

public:
    typedef CharT char_type;
    typedef std::basic_istream<CharT> istream_type;
    typedef std::basic_string<CharT> string_type;

    line_iterator() : in_ptr_(0)
    {
    }

    explicit line_iterator(istream_type& is) : in_ptr_(&is)
    {
        increment();
    }

private:
    istream_type* in_ptr_;
    string_type line_;

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

    void increment()
    {
        if (!std::getline(*in_ptr_, line_))
            in_ptr_ = 0;
    }

    bool equal(const line_iterator& rhs) const
    {
        return in_ptr_ == rhs.in_ptr_;
    }
};

template<class CharT>
inline line_iterator<CharT>
make_line_iterator(std::basic_istream<CharT>& is)
{
    return line_iterator<CharT>(is);
}

template<class CharT>
inline line_iterator<CharT> make_line_iterator()
{
    return line_iterator<CharT>();
}

} // namespace hamigaki

basic_stringの型特徴とアロケータを指定できると良いのですが、時間切れ。