37 #ifndef VIGRA_MULTI_POINTOPERATORS_H
38 #define VIGRA_MULTI_POINTOPERATORS_H
40 #include "initimage.hxx"
41 #include "copyimage.hxx"
42 #include "transformimage.hxx"
43 #include "combineimages.hxx"
44 #include "inspectimage.hxx"
45 #include "multi_array.hxx"
46 #include "metaprogramming.hxx"
47 #include "inspector_passes.hxx"
71 template <
class Iterator,
class Shape,
class Accessor,
74 initMultiArrayImpl(Iterator s, Shape
const & shape, Accessor a, VALUETYPE
const & v, MetaInt<0>)
76 initLine(s, s + shape[0], a, v);
79 template <
class Iterator,
class Shape,
class Accessor,
80 class VALUETYPE,
int N>
82 initMultiArrayImpl(Iterator s, Shape
const & shape, Accessor a,
83 VALUETYPE
const & v, MetaInt<N>)
85 Iterator send = s + shape[N];
88 initMultiArrayImpl(s.begin(), shape, a, v, MetaInt<N-1>());
184 template <
class Iterator,
class Shape,
class Accessor,
class VALUETYPE>
186 initMultiArray(Iterator s, Shape
const & shape, Accessor a, VALUETYPE
const & v)
188 initMultiArrayImpl(s, shape, a, v, MetaInt<Iterator::level>());
191 template <
class Iterator,
class Shape,
class Accessor,
class VALUETYPE>
194 initMultiArray(triple<Iterator, Shape, Accessor>
const & s, VALUETYPE
const & v)
207 template <
class Iterator,
class Diff_type,
class Accessor,
class VALUETYPE>
209 Accessor a,
int border_width, VALUETYPE v)
211 Diff_type border(shape);
212 for(
unsigned int dim=0; dim<shape.size(); dim++){
213 border[dim] = (border_width > shape[dim]) ? shape[dim] : border_width;
216 for(
unsigned int dim=0; dim<shape.size(); dim++){
217 Diff_type start(shape),
220 offset[dim]=border[dim];
224 start[dim]=shape[dim]-border[dim];
229 template <
class Iterator,
class Diff_type,
class Accessor,
class VALUETYPE>
231 int border_width, VALUETYPE v)
243 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
244 class DestIterator,
class DestShape,
class DestAccessor>
246 copyMultiArrayImpl(SrcIterator s, SrcShape
const & sshape, SrcAccessor src,
247 DestIterator d, DestShape
const & dshape, DestAccessor dest, MetaInt<0>)
251 initLine(d, d + dshape[0], dest, src(s));
255 copyLine(s, s + sshape[0], src, d, dest);
259 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
260 class DestIterator,
class DestShape,
class DestAccessor,
int N>
262 copyMultiArrayImpl(SrcIterator s, SrcShape
const & sshape, SrcAccessor src,
263 DestIterator d, DestShape
const & dshape, DestAccessor dest, MetaInt<N>)
265 DestIterator dend = d + dshape[N];
270 copyMultiArrayImpl(s.begin(), sshape, src, d.begin(), dshape, dest, MetaInt<N-1>());
275 for(; d < dend; ++s, ++d)
277 copyMultiArrayImpl(s.begin(), sshape, src, d.begin(), dshape, dest, MetaInt<N-1>());
393 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
394 class DestIterator,
class DestAccessor>
397 SrcShape
const & shape, SrcAccessor src,
398 DestIterator d, DestAccessor dest)
400 copyMultiArrayImpl(s, shape, src, d, shape, dest, MetaInt<SrcIterator::level>());
403 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
404 class DestIterator,
class DestAccessor>
406 copyMultiArray(triple<SrcIterator, SrcShape, SrcAccessor>
const & src,
407 pair<DestIterator, DestAccessor>
const & dest)
410 copyMultiArray(src.first, src.second, src.third, dest.first, dest.second);
413 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
414 class DestIterator,
class DestShape,
class DestAccessor>
416 copyMultiArray(SrcIterator s, SrcShape
const & sshape, SrcAccessor src,
417 DestIterator d, DestShape
const & dshape, DestAccessor dest)
419 vigra_precondition(sshape.size() == dshape.size(),
420 "copyMultiArray(): dimensionality of source and destination array differ");
421 for(
unsigned int i=0; i<sshape.size(); ++i)
422 vigra_precondition(sshape[i] == 1 || sshape[i] == dshape[i],
423 "copyMultiArray(): mismatch between source and destination shapes:\n"
424 "length of each source dimension must either be 1 or equal to the corresponding "
425 "destination length.");
426 copyMultiArrayImpl(s, sshape, src, d, dshape, dest, MetaInt<SrcIterator::level>());
429 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
430 class DestIterator,
class DestShape,
class DestAccessor>
432 copyMultiArray(triple<SrcIterator, SrcShape, SrcAccessor>
const & src,
433 triple<DestIterator, DestShape, DestAccessor>
const & dest)
436 copyMultiArray(src.first, src.second, src.third, dest.first, dest.second, dest.third);
445 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
446 class DestIterator,
class DestShape,
class DestAccessor,
449 transformMultiArrayReduceImpl(SrcIterator s, SrcShape
const &, SrcAccessor src,
450 DestIterator d, DestShape
const & dshape, DestAccessor dest,
451 SrcShape
const & reduceShape,
452 Functor
const & ff, MetaInt<0>)
454 DestIterator dend = d + dshape[0];
455 for(; d < dend; ++s.template dim<0>(), ++d)
463 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
464 class DestIterator,
class DestShape,
class DestAccessor,
465 class Functor,
int N>
467 transformMultiArrayReduceImpl(SrcIterator s, SrcShape
const & sshape, SrcAccessor src,
468 DestIterator d, DestShape
const & dshape, DestAccessor dest,
469 SrcShape
const & reduceShape,
470 Functor
const & f, MetaInt<N>)
472 DestIterator dend = d + dshape[N];
473 for(; d < dend; ++s.template dim<N>(), ++d)
475 transformMultiArrayReduceImpl(s, sshape, src, d.begin(), dshape, dest,
476 reduceShape, f, MetaInt<N-1>());
480 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
481 class DestIterator,
class DestShape,
class DestAccessor,
484 transformMultiArrayImpl(SrcIterator s, SrcShape
const & sshape, SrcAccessor src,
485 DestIterator d, DestShape
const & dshape, DestAccessor dest,
486 Functor
const & f, VigraTrueType)
489 SrcShape reduceShape = sshape;
490 for(
unsigned int i=0; i<dshape.size(); ++i)
492 vigra_precondition(dshape[i] == 1 || sshape[i] == dshape[i],
493 "transformMultiArray(): mismatch between source and destination shapes:\n"
494 "In 'reduce'-mode, the length of each destination dimension must either be 1\n"
495 "or equal to the corresponding source length.");
499 transformMultiArrayReduceImpl(s, sshape, src, d, dshape, dest, reduceShape,
500 f, MetaInt<SrcIterator::level>());
503 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
504 class DestIterator,
class DestShape,
class DestAccessor,
507 transformMultiArrayExpandImpl(SrcIterator s, SrcShape
const & sshape, SrcAccessor src,
508 DestIterator d, DestShape
const & dshape, DestAccessor dest,
509 Functor
const & f, MetaInt<0>)
513 initLine(d, d + dshape[0], dest, f(src(s)));
517 transformLine(s, s + sshape[0], src, d, dest, f);
521 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
522 class DestIterator,
class DestShape,
class DestAccessor,
523 class Functor,
int N>
525 transformMultiArrayExpandImpl(SrcIterator s, SrcShape
const & sshape, SrcAccessor src,
526 DestIterator d, DestShape
const & dshape, DestAccessor dest,
527 Functor
const & f, MetaInt<N>)
529 DestIterator dend = d + dshape[N];
534 transformMultiArrayExpandImpl(s.begin(), sshape, src, d.begin(), dshape, dest,
540 for(; d < dend; ++s, ++d)
542 transformMultiArrayExpandImpl(s.begin(), sshape, src, d.begin(), dshape, dest,
548 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
549 class DestIterator,
class DestShape,
class DestAccessor,
552 transformMultiArrayImpl(SrcIterator s, SrcShape
const & sshape, SrcAccessor src,
553 DestIterator d, DestShape
const & dshape, DestAccessor dest,
554 Functor
const & f, VigraFalseType)
557 for(
unsigned int i=0; i<sshape.size(); ++i)
558 vigra_precondition(sshape[i] == 1 || sshape[i] == dshape[i],
559 "transformMultiArray(): mismatch between source and destination shapes:\n"
560 "In 'expand'-mode, the length of each source dimension must either be 1\n"
561 "or equal to the corresponding destination length.");
562 transformMultiArrayExpandImpl(s, sshape, src, d, dshape, dest,
563 f, MetaInt<SrcIterator::level>());
769 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
770 class DestIterator,
class DestAccessor,
774 DestIterator d, DestAccessor dest, Functor
const & f)
776 transformMultiArrayExpandImpl(s, shape, src, d, shape, dest,
777 f, MetaInt<SrcIterator::level>());
780 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
781 class DestIterator,
class DestAccessor,
785 pair<DestIterator, DestAccessor>
const & dest, Functor
const & f)
789 dest.first, dest.second, f);
792 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
793 class DestIterator,
class DestShape,
class DestAccessor,
797 DestIterator d, DestShape
const & dshape, DestAccessor dest,
800 vigra_precondition(sshape.size() == dshape.size(),
801 "transformMultiArray(): dimensionality of source and destination array differ");
802 typedef FunctorTraits<Functor> FT;
804 And<typename FT::isInitializer, typename FT::isUnaryAnalyser>::result
805 isAnalyserInitializer;
806 transformMultiArrayImpl(s, sshape, src, d, dshape, dest,
807 f, isAnalyserInitializer());
810 template <
class SrcIterator,
class SrcShape,
class SrcAccessor,
811 class DestIterator,
class DestShape,
class DestAccessor,
815 triple<DestIterator, DestShape, DestAccessor>
const & dest,
819 dest.first, dest.second, dest.third, f);
828 template <
class SrcIterator1,
class SrcShape,
class SrcAccessor1,
829 class SrcIterator2,
class SrcAccessor2,
830 class DestIterator,
class DestShape,
class DestAccessor,
833 combineTwoMultiArraysReduceImpl(
834 SrcIterator1 s1, SrcShape
const & , SrcAccessor1 src1,
835 SrcIterator2 s2, SrcAccessor2 src2,
836 DestIterator d, DestShape
const & dshape, DestAccessor dest,
837 SrcShape
const & reduceShape,
838 Functor
const & ff, MetaInt<0>)
840 DestIterator dend = d + dshape[0];
841 for(; d < dend; ++s1.template dim<0>(), ++s2.template dim<0>(), ++d)
849 template <
class SrcIterator1,
class SrcShape,
class SrcAccessor1,
850 class SrcIterator2,
class SrcAccessor2,
851 class DestIterator,
class DestShape,
class DestAccessor,
852 class Functor,
int N>
854 combineTwoMultiArraysReduceImpl(
855 SrcIterator1 s1, SrcShape
const & sshape, SrcAccessor1 src1,
856 SrcIterator2 s2, SrcAccessor2 src2,
857 DestIterator d, DestShape
const & dshape, DestAccessor dest,
858 SrcShape
const & reduceShape,
859 Functor
const & f, MetaInt<N>)
861 DestIterator dend = d + dshape[N];
862 for(; d < dend; ++s1.template dim<N>(), ++s2.template dim<N>(), ++d)
864 combineTwoMultiArraysReduceImpl(s1, sshape, src1, s2, src2,
865 d.begin(), dshape, dest,
866 reduceShape, f, MetaInt<N-1>());
870 template <
class SrcIterator1,
class SrcShape1,
class SrcAccessor1,
871 class SrcIterator2,
class SrcShape2,
class SrcAccessor2,
872 class DestIterator,
class DestShape,
class DestAccessor,
875 combineTwoMultiArraysImpl(
876 SrcIterator1 s1, SrcShape1
const & sshape1, SrcAccessor1 src1,
877 SrcIterator2 s2, SrcShape2
const & sshape2, SrcAccessor2 src2,
878 DestIterator d, DestShape
const & dshape, DestAccessor dest,
879 Functor
const & f, VigraTrueType)
882 SrcShape1 reduceShape = sshape1;
883 for(
unsigned int i=0; i<dshape.size(); ++i)
885 vigra_precondition(sshape1[i] == sshape2[i] &&
886 (dshape[i] == 1 || sshape1[i] == dshape[i]),
887 "combineTwoMultiArrays(): mismatch between source and destination shapes:\n"
888 "In 'reduce'-mode, the two source shapes must be equal, and\n"
889 "the length of each destination dimension must either be 1\n"
890 "or equal to the corresponding source length.");
894 combineTwoMultiArraysReduceImpl(s1, sshape1, src1, s2, src2,
895 d, dshape, dest, reduceShape,
896 f, MetaInt<SrcIterator1::level>());
899 template <
class SrcIterator1,
class SrcShape1,
class SrcAccessor1,
900 class SrcIterator2,
class SrcShape2,
class SrcAccessor2,
901 class DestIterator,
class DestShape,
class DestAccessor,
904 combineTwoMultiArraysExpandImpl(
905 SrcIterator1 s1, SrcShape1
const & sshape1, SrcAccessor1 src1,
906 SrcIterator2 s2, SrcShape2
const & sshape2, SrcAccessor2 src2,
907 DestIterator d, DestShape
const & dshape, DestAccessor dest,
908 Functor
const & f, MetaInt<0>)
910 DestIterator dend = d + dshape[0];
911 if(sshape1[0] == 1 && sshape2[0] == 1)
913 initLine(d, dend, dest, f(src1(s1), src2(s2)));
915 else if(sshape1[0] == 1)
917 typename SrcAccessor1::value_type sv1 = src1(s1);
918 for(; d < dend; ++d, ++s2)
919 dest.set(f(sv1, src2(s2)), d);
921 else if(sshape2[0] == 1)
923 typename SrcAccessor2::value_type sv2 = src2(s2);
924 for(; d < dend; ++d, ++s1)
925 dest.set(f(src1(s1), sv2), d);
929 combineTwoLines(s1, s1 + sshape1[0], src1, s2, src2, d, dest, f);
933 template <
class SrcIterator1,
class SrcShape1,
class SrcAccessor1,
934 class SrcIterator2,
class SrcShape2,
class SrcAccessor2,
935 class DestIterator,
class DestShape,
class DestAccessor,
936 class Functor,
int N>
938 combineTwoMultiArraysExpandImpl(
939 SrcIterator1 s1, SrcShape1
const & sshape1, SrcAccessor1 src1,
940 SrcIterator2 s2, SrcShape2
const & sshape2, SrcAccessor2 src2,
941 DestIterator d, DestShape
const & dshape, DestAccessor dest,
942 Functor
const & f, MetaInt<N>)
944 DestIterator dend = d + dshape[N];
945 int s1inc = sshape1[N] == 1
948 int s2inc = sshape2[N] == 1
951 for(; d < dend; ++d, s1 += s1inc, s2 += s2inc)
953 combineTwoMultiArraysExpandImpl(s1.begin(), sshape1, src1,
954 s2.begin(), sshape2, src2,
955 d.begin(), dshape, dest,
960 template <
class SrcIterator1,
class SrcShape1,
class SrcAccessor1,
961 class SrcIterator2,
class SrcShape2,
class SrcAccessor2,
962 class DestIterator,
class DestShape,
class DestAccessor,
965 combineTwoMultiArraysImpl(
966 SrcIterator1 s1, SrcShape1
const & sshape1, SrcAccessor1 src1,
967 SrcIterator2 s2, SrcShape2
const & sshape2, SrcAccessor2 src2,
968 DestIterator d, DestShape
const & dshape, DestAccessor dest,
969 Functor
const & f, VigraFalseType)
972 for(
unsigned int i=0; i<sshape1.size(); ++i)
973 vigra_precondition((sshape1[i] == 1 || sshape1[i] == dshape[i]) &&
974 (sshape2[i] == 1 || sshape2[i] == dshape[i]),
975 "combineTwoMultiArrays(): mismatch between source and destination shapes:\n"
976 "In 'expand'-mode, the length of each source dimension must either be 1\n"
977 "or equal to the corresponding destination length.");
978 combineTwoMultiArraysExpandImpl(s1, sshape1, src1, s2, sshape2, src2,
980 f, MetaInt<SrcIterator1::level>());
1220 template <
class SrcIterator1,
class SrcShape,
class SrcAccessor1,
1221 class SrcIterator2,
class SrcAccessor2,
1222 class DestIterator,
class DestAccessor,
1226 SrcIterator2 s2, SrcAccessor2 src2,
1227 DestIterator d, DestAccessor dest, Functor
const & f)
1229 combineTwoMultiArraysExpandImpl(s1, shape, src1, s2, shape, src2, d, shape, dest, f,
1230 MetaInt<SrcIterator1::level>());
1233 template <
class SrcIterator1,
class SrcShape,
class SrcAccessor1,
1234 class SrcIterator2,
class SrcAccessor2,
1235 class DestIterator,
class DestAccessor,
class Functor>
1238 pair<SrcIterator2, SrcAccessor2>
const & src2,
1239 pair<DestIterator, DestAccessor>
const & dest, Functor
const & f)
1243 src1.first, src1.second, src1.third,
1244 src2.first, src2.second, dest.first, dest.second, f);
1247 template <
class SrcIterator1,
class SrcShape1,
class SrcAccessor1,
1248 class SrcIterator2,
class SrcShape2,
class SrcAccessor2,
1249 class DestIterator,
class DestShape,
class DestAccessor,
1253 SrcIterator1 s1, SrcShape1
const & sshape1, SrcAccessor1 src1,
1254 SrcIterator2 s2, SrcShape2
const & sshape2, SrcAccessor2 src2,
1255 DestIterator d, DestShape
const & dshape, DestAccessor dest,
1258 vigra_precondition(sshape1.size() == dshape.size() && sshape2.size() == dshape.size(),
1259 "combineTwoMultiArrays(): dimensionality of source and destination arrays differ");
1261 typedef FunctorTraits<Functor> FT;
1263 And<typename FT::isInitializer, typename FT::isBinaryAnalyser>::result
1264 isAnalyserInitializer;
1265 combineTwoMultiArraysImpl(s1, sshape1, src1, s2, sshape2, src2, d, dshape, dest,
1266 f, isAnalyserInitializer());
1269 template <
class SrcIterator1,
class SrcShape1,
class SrcAccessor1,
1270 class SrcIterator2,
class SrcShape2,
class SrcAccessor2,
1271 class DestIterator,
class DestShape,
class DestAccessor,
1275 triple<SrcIterator1, SrcShape1, SrcAccessor1>
const & src1,
1276 triple<SrcIterator2, SrcShape2, SrcAccessor2>
const & src2,
1277 triple<DestIterator, DestShape, DestAccessor>
const & dest,
1281 src2.first, src2.second, src2.third,
1282 dest.first, dest.second, dest.third, f);
1291 template <
class SrcIterator1,
class SrcShape,
class SrcAccessor1,
1292 class SrcIterator2,
class SrcAccessor2,
1293 class SrcIterator3,
class SrcAccessor3,
1294 class DestIterator,
class DestAccessor,
1297 combineThreeMultiArraysImpl(SrcIterator1 s1, SrcShape
const & shape, SrcAccessor1 src1,
1298 SrcIterator2 s2, SrcAccessor2 src2,
1299 SrcIterator3 s3, SrcAccessor3 src3,
1300 DestIterator d, DestAccessor dest, Functor
const & f, MetaInt<0>)
1302 combineThreeLines(s1, s1 + shape[0], src1, s2, src2, s3, src3, d, dest, f);
1305 template <
class SrcIterator1,
class SrcShape,
class SrcAccessor1,
1306 class SrcIterator2,
class SrcAccessor2,
1307 class SrcIterator3,
class SrcAccessor3,
1308 class DestIterator,
class DestAccessor,
1309 class Functor,
int N>
1311 combineThreeMultiArraysImpl(SrcIterator1 s1, SrcShape
const & shape, SrcAccessor1 src1,
1312 SrcIterator2 s2, SrcAccessor2 src2,
1313 SrcIterator3 s3, SrcAccessor3 src3,
1314 DestIterator d, DestAccessor dest,
1315 Functor
const & f, MetaInt<N>)
1317 SrcIterator1 s1end = s1 + shape[N];
1318 for(; s1 < s1end; ++s1, ++s2, ++s3, ++d)
1320 combineThreeMultiArraysImpl(s1.begin(), shape, src1,
1321 s2.begin(), src2, s3.begin(), src3, d.begin(), dest,
1394 template <
class SrcIterator1,
class SrcShape,
class SrcAccessor1,
1395 class SrcIterator2,
class SrcAccessor2,
1396 class SrcIterator3,
class SrcAccessor3,
1397 class DestIterator,
class DestAccessor,
1401 SrcIterator2 s2, SrcAccessor2 src2,
1402 SrcIterator3 s3, SrcAccessor3 src3,
1403 DestIterator d, DestAccessor dest, Functor
const & f)
1405 combineThreeMultiArraysImpl(s1, shape, src1, s2, src2, s3, src3, d, dest, f,
1406 MetaInt<SrcIterator1::level>());
1409 template <
class SrcIterator1,
class SrcShape,
class SrcAccessor1,
1410 class SrcIterator2,
class SrcAccessor2,
1411 class SrcIterator3,
class SrcAccessor3,
1412 class DestIterator,
class DestAccessor,
1416 pair<SrcIterator2, SrcAccessor2>
const & src2,
1417 pair<SrcIterator3, SrcAccessor3>
const & src3,
1418 pair<DestIterator, DestAccessor>
const & dest, Functor
const & f)
1422 src1.first, src1.second, src1.third,
1423 src2.first, src2.second, src3.first, src3.second, dest.first, dest.second, f);
1432 template <
class Iterator,
class Shape,
class Accessor,
class Functor>
1434 inspectMultiArrayImpl(Iterator s, Shape
const & shape, Accessor a, Functor & f, MetaInt<0>)
1436 inspectLine(s, s + shape[0], a, f);
1439 template <
class Iterator,
class Shape,
class Accessor,
class Functor,
int N>
1441 inspectMultiArrayImpl(Iterator s, Shape
const & shape, Accessor a, Functor & f, MetaInt<N>)
1443 Iterator send = s + shape[N];
1444 for(; s < send; ++s)
1446 inspectMultiArrayImpl(s.begin(), shape, a, f, MetaInt<N-1>());
1513 template <
class Iterator,
class Shape,
class Accessor>
1514 struct inspectMultiArray_binder
1517 const Shape & shape;
1519 inspectMultiArray_binder(Iterator s_,
const Shape & shape_, Accessor a_)
1520 : s(s_), shape(shape_), a(a_) {}
1521 template <
class Functor>
1522 void operator()(Functor & f)
1524 inspectMultiArrayImpl(s, shape, a, f, MetaInt<Iterator::level>());
1528 template <
class Iterator,
class Shape,
class Accessor,
class Functor>
1532 inspectMultiArray_binder<Iterator, Shape, Accessor> g(s, shape, a);
1533 detail::extra_passes_select(g, f);
1536 template <
class Iterator,
class Shape,
class Accessor,
class Functor>
1549 template <
class Iterator1,
class Shape,
class Accessor1,
1550 class Iterator2,
class Accessor2,
1553 inspectTwoMultiArraysImpl(Iterator1 s1, Shape
const & shape, Accessor1 a1,
1554 Iterator2 s2, Accessor2 a2,
1555 Functor & f, MetaInt<0>)
1557 inspectTwoLines(s1, s1 + shape[0], a1, s2, a2, f);
1560 template <
class Iterator1,
class Shape,
class Accessor1,
1561 class Iterator2,
class Accessor2,
1562 class Functor,
int N>
1564 inspectTwoMultiArraysImpl(Iterator1 s1, Shape
const & shape, Accessor1 a1,
1565 Iterator2 s2, Accessor2 a2,
1566 Functor & f, MetaInt<N>)
1568 Iterator1 s1end = s1 + shape[N];
1569 for(; s1 < s1end; ++s1, ++s2)
1571 inspectTwoMultiArraysImpl(s1.begin(), shape, a1,
1572 s2.begin(), a2, f, MetaInt<N-1>());
1645 template <
class Iterator1,
class Shape,
class Accessor1,
1646 class Iterator2,
class Accessor2>
1647 struct inspectTwoMultiArrays_binder
1650 const Shape & shape;
1654 inspectTwoMultiArrays_binder(Iterator1 s1_,
const Shape & shape_,
1655 Accessor1 a1_, Iterator2 s2_, Accessor2 a2_)
1656 : s1(s1_), shape(shape_), a1(a1_), s2(s2_), a2(a2_) {}
1657 template <
class Functor>
1658 void operator()(Functor & f)
1660 inspectTwoMultiArraysImpl(s1, shape, a1, s2, a2, f,
1661 MetaInt<Iterator1::level>());
1665 template <
class Iterator1,
class Shape,
class Accessor1,
1666 class Iterator2,
class Accessor2,
1670 Iterator2 s2, Accessor2 a2, Functor & f)
1672 inspectTwoMultiArrays_binder<Iterator1, Shape, Accessor1,
1673 Iterator2, Accessor2>
1674 g(s1, shape, a1, s2, a2);
1675 detail::extra_passes_select(g, f);
1678 template <
class Iterator1,
class Shape,
class Accessor1,
1679 class Iterator2,
class Accessor2,
1684 pair<Iterator2, Accessor2>
const & s2, Functor & f)
1687 s2.first, s2.second, f);
1695 #endif //-- VIGRA_MULTI_POINTOPERATORS_H
void inspectTwoMultiArrays(...)
Call an analyzing functor at all corresponding elements of two multi-dimensional arrays.
void combineThreeMultiArrays(...)
Combine three multi-dimensional arrays into one using a ternary function or functor.
void initMultiArray(...)
Write a value to every pixel in a multi-dimensional array.
void initMultiArrayBorder(Iterator upperleft, Diff_type shape, Accessor a, int border_width, VALUETYPE v)
Write value to the specified border values in the array.
Definition: multi_pointoperators.hxx:208
void copyMultiArray(...)
Copy a multi-dimensional array.
void combineTwoMultiArrays(...)
Combine two multi-dimensional arrays into one using a binary function or functor. ...
void transformMultiArray(...)
Transform a multi-dimensional array with a unary function or functor.
void inspectMultiArray(...)
Call an analyzing functor at every element of a multi-dimensional array.