lattice_system::iterator

lattice_system にイテレータを提供しようと思っていて悩む。
欲しい機能は

  • index_mapperが振るインデックスの順番に要素にアクセスする
  • 各要素の座標値を取得できる

要素全体をトラバースする為にはvector::iteratorを使うのが最も効率的だけどこれも座標の取得ができないし、lattice_system::view::iteratorvectorイテレータを使えないから互換性が無くなる。

インデックスから座標値を計算する事もできるけどこれをするためには割り算が必要で非効率。
また既にあるpoint_to_indexに対してindex_to_pointという関数を用意するのもおかしい。point_to_indexに逆写像が存在するとは限らないから。

座標値を次々に返すiteratorを用意するのが一番良さそうだな。具体的には二次元直交格子系の場合は

// ここから
range r(-1, 1, -1, 1);
for(range::base_type i = r.xmin(); i <= r.xmax(); ++i){
  for(range::base_type j = r.ymin(); y <= r.ymax(); ++j){
    point p(i, j); // ここまで

    // 以下pを使った処理
  }
}

この二重ループをイテレータに閉じ込めてしまおう。ちょっとだけ効率が下がりそうだけどboost::multi_arrayに比べればインターフェースがすっきりしそうでいい感じ。