https://svn.lrde.epita.fr/svn/oln/branches/cleanup-2008
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)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.