NeighbourhoodOp(Dst, Src, Ngb) { foreach d, s in Dst, Src { phase = 1; do { Ngb.init(phase, s.x, s.y, Src(s)); foreach n in Ngb.size() Ngb.next(n.x, n.y, Src(s - (Ngb.size()/2) + n)); Ngb.done(phase); } while (Ngb.hasNextPhase(phase++)); Dst(d) = ngb.result(); } }
The requirements on the NgbT template parameter expressed as class definition are:
template<class DstValT, class SrcValT> class NgbT { public: typedef HxTagLoop IteratorCategory; typedef HxTagNPhase PhaseCategory; NgbT(HxTagList& tags); ~NgbT(); HxSizes size(); void init(int phase, int ix, int iy, SrcValT value); void next(int nx, int ny, SrcValT value); void done(int phase); bool hasNextPhase(int thisPhase); DstValT result() const; static HxString className(); };
Example(s):