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_APPLY_HH
00029 # define OLENA_CORE_APPLY_HH
00030
00031 # include <mlc/contract.hh>
00032 # include <oln/core/abstract/image.hh>
00033 # include <oln/core/image.hh>
00034 # include <oln/core/abstract/iter.hh>
00035 # include <oln/core/macros.hh>
00036
00037 namespace oln {
00038
00039
00040
00041
00042
00073 template<class AdaptableUnaryFun, class I> inline
00074 typename mute<I, typename AdaptableUnaryFun::result_type>::ret
00075 apply(AdaptableUnaryFun f, const abstract::image<I>& input)
00076 {
00077 typename mute<I, typename AdaptableUnaryFun::result_type>::ret
00078 output(input.size());
00079 oln_iter_type(I) p(input);
00080 for_all(p) output[p] = f(input[p]);
00081 return output;
00082 }
00083
00084
00089 template<class AdaptableUnaryFun, class I> inline
00090 typename mute<I, typename AdaptableUnaryFun::result_type>::ret
00091 apply(const abstract::image<I>& input)
00092 {
00093 return apply(AdaptableUnaryFun(), input);
00094 }
00095
00096
00102 template<template<class> class AdaptableUnaryFun,
00103 class I> inline
00104 typename mute<I, typename AdaptableUnaryFun<oln_value_type(I)>::result_type>::ret
00105 apply(const abstract::image<I>& input)
00106 {
00107
00108 AdaptableUnaryFun<oln_value_type(I)> tmp;
00109 return apply(tmp, input);
00110 }
00111
00112
00113
00114
00115
00116
00126 template<class AdaptableBinaryFun, class I1, class I2> inline
00127 typename mute<I1, typename AdaptableBinaryFun::result_type>::ret
00128 apply2(AdaptableBinaryFun f,
00129 const abstract::image<I1>& input1, const abstract::image<I2>& input2)
00130 {
00131 precondition(input1.size() == input2.size());
00132 typename mute<I1, typename AdaptableBinaryFun::result_type>::ret
00133 output(input1.size());
00134 oln_iter_type(I1) p(input1);
00135 for_all(p) output[p] = f(input1[p], input2[p]);
00136 return output;
00137 }
00138
00139
00146 template<class AdaptableBinaryFun, class I1, class I2> inline
00147 typename mute<I1, typename AdaptableBinaryFun::result_type>::ret
00148 apply2(const abstract::image<I1>& input1, const abstract::image<I2>& input2)
00149 {
00150 return apply2(AdaptableBinaryFun(), input1, input2);
00151 }
00152
00161 template<template <class, class> class AdaptableBinaryFun,
00162 class I1, class I2> inline
00163 typename mute<I1,
00164 typename AdaptableBinaryFun<oln_value_type(I1),oln_value_type(I2)>::result_type>::ret
00165 apply2(const abstract::image<I1>& input1, const abstract::image<I2>& input2)
00166 {
00167
00168 AdaptableBinaryFun<oln_value_type(I1),oln_value_type(I2)> tmp;
00169 return apply2(tmp, input1, input2);
00170 }
00171
00172
00181 template<template <class> class AdaptableBinaryFun,
00182 class I> inline
00183 typename mute<I,
00184 typename AdaptableBinaryFun<oln_value_type(I)>::result_type>::ret
00185 apply2(const abstract::image<I>& input1, const abstract::image<I>& input2)
00186 {
00187
00188 AdaptableBinaryFun<oln_value_type(I)> tmp;
00189 return apply2(tmp, input1, input2);
00190 }
00191
00192
00193
00194
00195
00196
00201 template<class UnaryFun, class I> inline
00202 abstract::image<I>& apply_self(UnaryFun f, abstract::image<I>& input)
00203 {
00204 oln_iter_type(I) p(input);
00205 for_all(p) input[p] = f(input[p]);
00206 return input;
00207 }
00208
00209
00214 template<class UnaryFun, class I> inline
00215 abstract::image<I>& apply_self(abstract::image<I>& input)
00216 {
00217 return apply_self(UnaryFun(), input);
00218 }
00219
00220
00225 template<template<class> class UnaryFun, class I> inline
00226 abstract::image<I>& apply_self(abstract::image<I>& input)
00227 {
00228
00229 UnaryFun<oln_value_type(I)> tmp;
00230 return apply_self(tmp, input);
00231 }
00232
00233
00234
00235
00236
00237
00242 template<class UnaryFun, class I1, class I2>
00243 abstract::image<I1>& apply2_self(UnaryFun f,
00244 abstract::image<I1>& input1, const abstract::image<I2>& input2)
00245 {
00246 precondition(input1.size() == input2.size());
00247 oln_iter_type(I1) p(input1);
00248 for_all(p) input1[p] = f(input1[p], input2[p]);
00249 return input1;
00250 }
00251
00252
00257 template<class UnaryFun, class I1, class I2> inline
00258 abstract::image<I1>& apply2_self(abstract::image<I1>& input1, const abstract::image<I1>& input2)
00259 {
00260 return apply_self(UnaryFun(), input1, input2);
00261 }
00262
00263
00269 template<template<class, class> class UnaryFun, class I1, class I2> inline
00270 abstract::image<I1>& apply2_self(abstract::image<I1>& input1, const abstract::image<I2>& input2)
00271 {
00272
00273 UnaryFun<oln_value_type(I1),oln_value_type(I2)> tmp;
00274 return apply2_self(tmp, input1, input2);
00275 }
00276
00277
00282 template<template<class> class UnaryFun, class I> inline
00283 abstract::image<I>& apply2_self(abstract::image<I>& input1, const abstract::image<I>& input2)
00284 {
00285
00286 UnaryFun<oln_value_type(I)> tmp;
00287 return apply2_self(tmp, input1, input2);
00288 }
00289
00290 }
00291
00292 #endif // ! OLENA_CORE_APPLY_HH