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);
のように使うことにしました。
あと、名前の通り行数を数えるだけで、カラム位置を計算する機能はありません。