
https://svn.lrde.epita.fr/svn/oln/branches/cleanup-2008 Index: ChangeLog from Thierry Geraud <thierry.geraud@lrde.epita.fr> Fix some morpho operators. * milena/tests/morpho/erosion.cc: Fix typo. * milena/mln/core/routine/ops.hh (todo): New. * milena/mln/morpho/erosion.spe.hh (octagon2d): Fix. (hline2d, vline2d): Fix dispatch. mln/core/routine/ops.hh | 8 +++ mln/morpho/erosion.spe.hh | 97 +++++++++++++++++++++++++++++++++++++--------- tests/morpho/erosion.cc | 8 +-- 3 files changed, 91 insertions(+), 22 deletions(-) Index: milena/tests/morpho/erosion.cc --- milena/tests/morpho/erosion.cc (revision 2587) +++ milena/tests/morpho/erosion.cc (working copy) @@ -194,20 +194,20 @@ std::cout << " " << (test ? "OK" : "KO!!!") << std::endl; } - std::cout << "-------------------------- Octogone: " << std::endl; + std::cout << "-------------------------- Octagon: " << std::endl; - //Octogone + // Octagon { t.start(); ref = morpho::impl::generic::erosion_on_function(lena, oct); - std::cout << "generic on octogone: " << t << std::endl; + std::cout << "generic on octagon: " << t << std::endl; io::pgm::save(ref, "out_oct_ref.pgm"); } { t.start(); out = morpho::erosion(lena, oct); - std::cout << "dispach on octogone: " << t << std::endl; + std::cout << "dispach on octagon: " << t << std::endl; bool test = out == ref; mln_assertion(test); std::cout << " " << (test ? "OK" : "KO!!!") << std::endl; Index: milena/mln/core/routine/ops.hh --- milena/mln/core/routine/ops.hh (revision 2587) +++ milena/mln/core/routine/ops.hh (working copy) @@ -78,6 +78,14 @@ * \endcode * * \todo Complete those definitions (...) + Overload for const (?) + * + * \todo Optimize deduced ops to eliminate object creation. E.g. + * in the unary minus op: + * literal::zero_t* p_zero = 0; + * return O(*p_zero) - exact(rhs); + * can become: + * static O zero =... + * return zero - exact(rhs); */ # include <mln/trait/op/all.hh> Index: milena/mln/morpho/erosion.spe.hh --- milena/mln/morpho/erosion.spe.hh (revision 2587) +++ milena/mln/morpho/erosion.spe.hh (working copy) @@ -302,9 +302,8 @@ mln_concrete(I) temp_1, temp_2, output; temp_1 = morpho::erosion(input, win::hline2d(len)); - temp_2 = morpho::erosion(temp_1, win::vline2d(len)); - temp_1 = morpho::erosion(temp_2, win::diag2d(len)); - output = morpho::erosion(temp_1, win::backdiag2d(len)); + temp_2 = morpho::erosion(temp_1, win::diag2d(len)); + output = morpho::erosion(temp_2, win::backdiag2d(len)); trace::exiting("morpho::impl::erosion_(win::octagon2d)"); return output; @@ -683,16 +682,16 @@ min.init(); p[dir]--; mln_qiter(W) q(win, p); - for_all(q) + for_all(q) if (input.has(q)) min.take(input(q)); p[dir]++; } void next() { - for_all(q_l) + for_all(q_l) if (input.has(q_l)) min.untake(input(q_l)); - for_all(q_r) + for_all(q_r) if (input.has(q_r)) min.take(input(q_r)); output(p) = min; } @@ -735,13 +734,9 @@ enum { dim = I::site::dim }; unsigned dir; - window2d - win_left, - win_right; + window2d win_left, win_right; - mln_qixter(const I, window2d) - q_l, - q_r; + mln_qixter(const I, window2d) q_l, q_r; erosion_directional_nd_fastest_functor(const I& input, const W& win, unsigned dir) : input(input), @@ -984,27 +979,93 @@ } + /// Handling win::hline2d. + /// \{ + + template <typename I> + mln_concrete(I) + erosion_dispatch_wrt_win(metal::true_, + const I& input, const win::hline2d& win) + { + return erosion_dispatch_for_directional(input, win, 1); + } + + template <typename I> + mln_concrete(I) + erosion_dispatch_wrt_win(metal::false_, + const I& input, const win::hline2d& win) + { + return erosion_dispatch_for_generic(input, win); + } + template <typename I> mln_concrete(I) erosion_dispatch_wrt_win(const I& input, const win::hline2d& win) { - if (win.size() <= 3) + if (win.size() == 1) + return clone(input); + else if (win.size() == 3) return erosion_dispatch_for_generic(input, win); else - return impl::erosion_line_on_function(input, win); -// return erosion_dispatch_for_directional(input, win, 1); + { + typedef mlc_is_not(mln_trait_image_kind(I), + mln::trait::image::kind::logic) test_not_logic; + typedef mlc_is_a(mln_pset(I), Box) test_box; + typedef mlc_equal(mln_trait_image_quant(I), + mln::trait::image::quant::low) test_lowq; + typedef mlc_and(test_not_logic, test_box) temp; + typedef mlc_and(temp, test_lowq) tests; + return erosion_dispatch_wrt_win(typename tests::eval (), + input, win); + } + } + + /// \} + + + + /// Handling win::vline2d. + /// \{ + + template <typename I> + mln_concrete(I) + erosion_dispatch_wrt_win(metal::true_, + const I& input, const win::vline2d& win) + { + return erosion_dispatch_for_directional(input, win, 0); + } + + template <typename I> + mln_concrete(I) + erosion_dispatch_wrt_win(metal::false_, + const I& input, const win::vline2d& win) + { + return erosion_dispatch_for_generic(input, win); } template <typename I> mln_concrete(I) erosion_dispatch_wrt_win(const I& input, const win::vline2d& win) { - if (win.size() <= 3) + if (win.size() == 1) + return clone(input); + else if (win.size() == 3) return erosion_dispatch_for_generic(input, win); else - return impl::erosion_line_on_function(input, win); -// return erosion_dispatch_for_directional(input, win, 0); + { + typedef mlc_is_not(mln_trait_image_kind(I), + mln::trait::image::kind::logic) test_not_logic; + typedef mlc_is_a(mln_pset(I), Box) test_box; + typedef mlc_equal(mln_trait_image_quant(I), + mln::trait::image::quant::low) test_lowq; + typedef mlc_and(test_not_logic, test_box) temp; + typedef mlc_and(temp, test_lowq) tests; + return erosion_dispatch_wrt_win(typename tests::eval (), + input, win); } + } + + /// \} // The dispatch entry point.