NeighbourhoodOp(Dst, Src, Ext, Ext2, Ngb) { foreach d, s, e, e2 in Dst, Src, Ext, Ext2 { Ngb.init(s.x, s.y, Src(s), Ext(e), Ext2(e2)); foreach n in Ngb.size() Ngb.next(n.x, n.y, Src(s - (Ngb.size()/2) + n), Ext(e - (Ngb.size()/2) + n), Ext2(e2 - (Ngb.size()/2) + n)); Ngb.init2(s.x, s.y, Src(s), Ext(e), Ext2(e2)); foreach n in Ngb.size() Ngb.next2(n.x, n.y, Src(s - (Ngb.size()/2) + n), Ext(e - (Ngb.size()/2) + n), Ext2(e2 - (Ngb.size()/2) + n)); Dst(d) = ngb.result(); } }
The requirements on the NgbT template parameter expressed as class definition are:
template<class DstValT, class SrcValT, class ExtValT, class Ext2ValT> class NgbT { public: typedef HxTagLoop IteratorCategory; typedef HxTag2Phase PhaseCategory; NgbT(HxTagList& tags); ~NgbT(); HxSizes size(); void init(int ix, int iy, SrcValT v1, ExtValT v2, Ext2ValT v3); void next(int nx, int ny, SrcValT v1, ExtValT v2, Ext2ValT v3); void init2(int ix, int iy, SrcValT v1, ExtValT v2, Ext2ValT v3); void next2(int nx, int ny, SrcValT v1, ExtValT v2, Ext2ValT v3); DstValT result() const; static HxString className(); };
Example(s):