TextDocumentブロック単位で参照する イテレータクラス

┌────────────────────┐
│                DocBlock                │
├────────────────────┤
│                                        │
├────────────────────┤
│isValid() const : bool                  │    //  有効なブロック?
│size() const : size_t                   │    //  ブロックに含まれるデータサイズ
│position() const : index_t              │    //  ブロック先頭文字位置
│index() const : index_t                 │    //  ブロック番号(0..*)
│text() const : QString                  │    //  ブロックテキスト取得
│next() const : DocBlock                 │    //  次のブロック
│prev() const : DocBlock                 │    //  前のブロック
│operator==(const DocBlock&) const : bool│
│operator<(const DocBlock&) const : bool │
└────────────────────┘

TextBlock の取得は、TextDocument::firstBlock(), TextDocument::lastBlock(), TextDocument::findBlockByNumber(index_t) などにより行う。
firstBlock(), lastBlock() は処理時間が O(1) だが、findBlockByNumber(index_t) は最悪の場合 O(L) になるのでなるべく使用しないようにする。

  1. for(index_t ix = 0; ix < 10; ++ix) {
  2. DocBlock block = document->findBlockByNumber(ix);
  3. block に対する処理...
  4. }
上記の様に、ループのたびに findBlockByNumber(ix) を呼び出すのはパフォーマンス的に好ましくない。
下記の様に記述しなくてはいけない。

  1. index_t ix = 0;
  2. DocBlock block = document->findBlockByNumber(ix);
  3. for(; ix < 10; ++ix) {
  4. DocBlock block = document->findBlockByNumber(ix);
  5. block に対する処理...
  6. block = block.next(); // 次のブロックに移動
  7. }