27 #ifndef MLN_ARITH_MINUS_HH
28 # define MLN_ARITH_MINUS_HH
35 # include <mln/arith/includes.hh>
46 struct set_unary_< op::
uminus, Image, I >
48 typedef mln_trait_op_uminus(mln_value(I))
value;
49 typedef mln_ch_value(I, value)
ret;
52 template <typename L, typename R>
53 struct set_binary_< op::
minus, Image, L, Image, R >
55 typedef mln_trait_op_minus(mln_value(L), mln_value(R)) value;
56 typedef mln_ch_value(L, value) ret;
59 template <typename I, typename S>
60 struct set_binary_< op::minus, Image, I, mln::value::Scalar, S >
62 typedef mln_trait_op_minus(mln_value(I), S) value;
63 typedef mln_ch_value(I, value) ret;
71 mln_trait_op_uminus(I)
72 operator-(const Image<I>& ima);
75 template <typename L, typename R>
76 mln_trait_op_minus(L,R)
77 operator-(const Image<L>& lhs, const Image<R>&
rhs);
80 template <typename L, typename R>
82 operator-=(Image<L>& lhs, const Image<R>& rhs);
85 template <typename I, typename S>
86 mln_trait_op_minus(I,S)
87 operator-(const Image<I>& ima, const value::Scalar<S>& s);
90 template <typename I, typename S>
92 operator-=(Image<I>& ima, const value::Scalar<S>& s);
104 template <
typename I>
105 mln_trait_op_uminus(I)
106 uminus(const Image<I>& ima);
117 template <typename L, typename R>
118 mln_trait_op_minus(L, R)
119 minus(const Image<L>& lhs, const Image<R>& rhs);
131 template <typename L, typename R, typename F>
132 mln_ch_value(L, mln_result(F))
133 minus(const Image<L>& lhs, const Image<R>& rhs,
134 const Function_v2v<F>& f);
147 template <typename V, typename L, typename R>
149 minus(const Image<L>& lhs, const Image<R>& rhs);
163 template <typename L, typename R>
165 minus_inplace(Image<L>& lhs, const Image<R>& rhs);
176 template <typename I, typename V>
177 mln_trait_op_minus(I, V)
178 minus_cst(const Image<I>& input, const V& val);
190 template <typename I, typename V, typename F>
191 mln_ch_value(I, mln_result(F))
192 minus_cst(const Image<I>& input, const V& val,
193 const Function_v2v<F>& f);
203 template <typename I, typename V>
205 minus_cst_inplace(Image<I>& input, const V& val);
213 # ifndef MLN_INCLUDE_ONLY
216 template <
typename I>
218 mln_trait_op_uminus(I)
219 operator-(const Image<I>& ima)
221 mln_trace(
"operator::uminus");
223 mln_trait_op_uminus(I) output = arith::uminus(ima);
228 template <typename L, typename R>
230 mln_trait_op_minus(L,R)
231 operator-(const Image<L>& lhs, const Image<R>& rhs)
233 mln_trace(
"operator::minus");
236 mln_trait_op_minus(L,R) output = arith::minus(lhs, rhs);
241 template <typename L, typename R>
244 operator-=(Image<L>& lhs, const Image<R>& rhs)
246 mln_trace(
"operator::minus_eq");
255 template <
typename I,
typename S>
257 mln_trait_op_minus(I,S)
258 operator-(const Image<I>& ima, const value::Scalar<S>& s)
260 mln_trace(
"operator::minus");
262 mln_precondition(
exact(ima).is_valid());
263 mln_trait_op_minus(I,S) output = arith::minus_cst(ima,
exact(s));
268 template <typename I, typename S>
271 operator-=(Image<I>& ima, const value::Scalar<S>& s)
273 mln_trace(
"operator::minus_eq");
275 mln_precondition(
exact(ima).is_valid());
289 template <
typename I,
typename O>
291 void uminus_(trait::image::speed::any,
const I& ima, O& output)
293 mln_piter(I)
p(ima.domain());
298 template <typename I, typename O>
300 void uminus_(trait::image::speed::fastest, const I& ima, O& output)
302 mln_pixter(
const I) ip(ima);
303 mln_pixter(O) op(output);
305 op.val() = -ip.val();
309 template <typename L, typename R, typename O>
311 void minus_(trait::image::speed::any, const L& lhs,
312 trait::image::speed::any, const R& rhs,
315 mln_piter(L) p(lhs.domain());
317 output(p) = lhs(p) - rhs(p);
320 template <typename L, typename R, typename O>
322 void minus_(trait::image::speed::fastest, const L& lhs,
323 trait::image::speed::fastest, const R& rhs,
326 mln_pixter(
const L) lp(lhs);
327 mln_pixter(const R) rp(rhs);
328 mln_pixter(O) op(output);
329 for_all_3(lp, rp, op)
330 op.val() = lp.val() - rp.val();
334 template <typename L, typename R, typename F, typename O>
336 void minus_(trait::image::speed::any, const L& lhs,
337 trait::image::speed::any, const R& rhs,
338 const F& f, O& output)
340 mln_piter(L) p(lhs.domain());
342 output(p) = f(lhs(p) - rhs(p));
345 template <typename L, typename R, typename F, typename O>
347 void minus_(trait::image::speed::fastest, const L& lhs,
348 trait::image::speed::fastest, const R& rhs,
349 const F& f, O& output)
351 mln_pixter(
const L) lp(lhs);
352 mln_pixter(const R) rp(rhs);
353 mln_pixter(O) op(output);
354 for_all_3(lp, rp, op)
355 op.val() = f(lp.val() - rp.val());
359 template <typename L, typename R>
361 void minus_inplace_(trait::image::speed::any, L& lhs,
362 trait::image::speed::any, const R& rhs)
364 mln_piter(L) p(lhs.domain());
369 template <typename L, typename R>
371 void minus_inplace_(trait::image::speed::fastest, L& lhs,
372 trait::image::speed::fastest, const R& rhs)
374 mln_pixter(L) lp(lhs);
375 mln_pixter(const R) rp(rhs);
377 lp.val() -= rp.val();
386 template <typename I>
388 mln_trait_op_uminus(I)
389 uminus(const Image<I>& ima)
391 mln_trace(
"arith::uminus");
393 mln_trait_op_uminus(I) output;
395 impl::uminus_(mln_trait_image_speed(I)(),
exact(ima), output);
401 template <typename L, typename R>
403 mln_trait_op_minus(L, R)
404 minus(const Image<L>& lhs, const Image<R>& rhs)
406 mln_trace(
"arith::minus");
408 mln_precondition(
exact(rhs).domain() ==
exact(lhs).domain());
410 mln_trait_op_minus(L, R) output;
412 impl::minus_(mln_trait_image_speed(L)(),
exact(lhs),
413 mln_trait_image_speed(R)(),
exact(rhs), output);
419 template <typename L, typename R, typename F>
421 mln_ch_value(L, mln_result(F))
422 minus(const Image<L>& lhs, const Image<R>& rhs, const Function_v2v<F>& f)
424 mln_trace(
"arith::minus");
426 mln_precondition(
exact(rhs).domain() ==
exact(lhs).domain());
428 mln_ch_value(L, mln_result(F)) output;
430 impl::minus_(mln_trait_image_speed(L)(),
exact(lhs),
431 mln_trait_image_speed(R)(),
exact(rhs),
exact(f), output);
437 template <typename V, typename L, typename R>
440 minus(const Image<L>& lhs, const Image<R>& rhs)
442 mln_trace(
"arith::minus");
444 mln_precondition(
exact(rhs).domain() ==
exact(lhs).domain());
447 mln_ch_value(L, V) output = minus(lhs, rhs,
448 mln::fun::v2v::cast<V>());
454 template <typename I, typename V>
456 mln_trait_op_minus(I, V)
457 minus_cst(const Image<I>& input, const V& val)
459 mln_trace(
"arith::minus_cst");
461 mln_precondition(
exact(input).is_valid());
464 mln_trait_op_minus(I, V) output =
465 minus(input, pw::cst(val) |
exact(input).domain());
471 template <typename I, typename V, typename F>
473 mln_ch_value(I, mln_result(F))
474 minus_cst(const Image<I>& input, const V& val, const Function_v2v<F>& f)
476 mln_trace(
"arith::minus_cst");
478 mln_precondition(
exact(input).is_valid());
481 mln_ch_value(I, mln_result(F)) output =
482 minus(input, pw::cst(val) |
exact(input).domain(), f);
488 template <typename L, typename R>
491 minus_inplace(Image<L>& lhs, const Image<R>& rhs)
493 mln_trace(
"arith::minus_inplace");
495 mln_precondition(
exact(rhs).domain() ==
exact(lhs).domain());
497 impl::minus_inplace_(mln_trait_image_speed(L)(),
exact(lhs),
498 mln_trait_image_speed(R)(),
exact(rhs));
503 template <
typename I,
typename V>
508 mln_trace(
"arith::minus_cst_inplace");
510 mln_precondition(
exact(input).is_valid());
521 # endif // ! MLN_INCLUDE_ONLY
526 #endif // ! MLN_ARITH_MINUS_HH