line_counting_iterator

position_iteratorの代用品としてline_counting_iteratorを作りました。
<hamigaki/iterator/line_counting_iterator.hpp>


Boost.Spiritのposition_iteratorにはファイル名が邪魔という以外にも、BidirectionalやRandom Accessの反復子に適用すると、iterator_categoryが継承されるにも関わらず--や+=で行番号がずれるという問題があります。
これは反復子本来の動きからすれば(行番号はおまけと考えれば)間違いではないですし、Boost.Spiritの入力としては使う限りはForward Iteratorしか要求されないので問題にはなりません。


ただし、Bidirectionalに対応することは可能なので、line_counting_iteratorでは、

のようにしました。


改行コードの変換みたいな面倒なものに対応していないので、開始位置と終了位置を一緒に指定する必要はなく、

const char* first = /* ... */ ;
const char* last = /* ... */ ;

// 行番号指定付き(インクリメント可能)
hamigaki::line_counting_iterator<const char*> beg(first, 1);

// 行番号指定なし(インクリメント不能、end用)
hamigaki::line_counting_iterator<const char*> end(last);

のように使うことにしました。


あと、名前の通り行数を数えるだけで、カラム位置を計算する機能はありません。