00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef OLENA_CORE_TRAVERSE_HH
00029 # define OLENA_CORE_TRAVERSE_HH
00030
00031 # include <mlc/contract.hh>
00032 # include <oln/core/abstract/image.hh>
00033 # include <oln/core/abstract/iter.hh>
00034 # include <oln/core/macros.hh>
00035
00036 namespace oln {
00037
00038
00039
00043 template<class I, class F>
00044 const F&
00045 traverse(F& f, const abstract::image<I>& input)
00046 {
00047 oln_iter_type(I) p(input);
00048 for_all(p) f(input[p]);
00049 return f;
00050 }
00051
00052
00056 template<class F, class I>
00057 inline const F
00058 traverse(const abstract::image<I>& input)
00059 {
00060 F f;
00061 return traverse(f, input);
00062 }
00063
00067 template<template<class> class F, class I>
00068 inline const F<oln_value_type(I)>
00069 traverse(const abstract::image<I>& input)
00070 {
00071 F<oln_value_type(I)> f;
00072 return traverse(f, input);
00073 }
00074
00075
00079 template<template<class, class> class F, class I2, class I>
00080 inline const F<oln_value_type(I), I2>
00081 traverse(const abstract::image<I>& input)
00082 {
00083 F<oln_value_type(I), I2> f;
00084 return traverse(f, input);
00085 }
00086
00091 template<template<class,class> class F,
00092 template<class> class F2,
00093 class I>
00094 inline const F<oln_value_type(I), F2<oln_value_type(I)> >
00095 traverse(const abstract::image<I>& input)
00096 {
00097 F<oln_value_type(I), F2<oln_value_type(I)> > f;
00098 traverse(f, input);
00099 return f;
00100 }
00101
00102
00103
00104
00110 template<class I1, class I2, class F>
00111 const F&
00112 traverse2(F& f,
00113 const abstract::image<I1>& input1,
00114 const abstract::image<I2>& input2)
00115 {
00116 precondition(input1.size() == input2.size());
00117 oln_iter_type(I1) p(input1);
00118 for_all(p) f(input1[p], input2[p]);
00119 return f;
00120 }
00121
00128 template<template<class> class F, class I>
00129 inline const F<oln_value_type(I)>
00130 traverse2(const abstract::image<I>& input1, const abstract::image<I>& input2)
00131 {
00132 F<oln_value_type(I)> f;
00133 return traverse2(f, input1, input2);
00134 }
00135
00143 template<template<class,class> class F, class I1, class I2>
00144 inline const F<oln_value_type(I1), oln_value_type(I2)>
00145 traverse2(const abstract::image<I1>& input1,
00146 const abstract::image<I2>& input2)
00147 {
00148 F<oln_value_type(I1), oln_value_type(I2)> f;
00149 return traverse2(f, input1, input2);
00150 }
00151
00152 }
00153
00154 #endif // ! OLENA_CORE_TRAVERSE_HH