格子系クラス

セルオートマトンでは正方格子以外に三角格子や六角格子なども利用したりするし、立方格子やそのたの格子系(例えば球面上)などを統一して扱うクラスを作りたい。

これらに求められる機能はとりあえず

  1. 座標をつかってセルの要素にアクセス。
  2. 全てのセルをトラバースするイテレータ
  3. 特定の範囲内の全てのセルをトラバースするイテレータ

だろうか。また、

  1. 効率性は無視できないので連続したメモリに要素を配置したい。
  2. 境界条件などをPolicyにしたい。

それでこんな設計をしてみた

// T      : 要素の型
// PointT : 格子点クラス
// RangeT : 格子系内の範囲クラス
// IndexMapper : PointTからsize_tへの変換をするMapper
template<class T, class PointT, class RangeT, 
         template <class> class IndexMapper>
class LatticeSystem : public IndexMapper<PointT>
{
  // hogehoge
private:
  std::vector<T> elems_;
};

三角格子や六角格子でも各格子に一意な連番を振るIndexMapperを用意すればそれを利用して自動的にコンテナを生成するという仕組み。
この連番をvectorのインデックスにし要素にアクセスするようにする。
IndexMapperを一つ用意すればそれからiteratorやviewが作れると思うし、IndexMapperを入れ替えるだけで異なる配置や境界条件の格子系が簡単に作れるだろう。

結構良い設計が出来たと思うけど、かなり大規模なライブラリになりそうだな〜。
頑張って実装しよう。