
* mln/core/concept/site_iterator.hh (for_all_in_nbh for_all_in_nbh_, for_all_in_win, for_all_in_win_): New macros. (mln::internal::make_and_start_iterator): New helper functions. * tests/core/image/for_all_in.cc: New. * tests/core/image/Makefile.am (check_PROGRAMS): Add for_all_in. (for_all_in_SOURCES): New. --- milena/ChangeLog | 12 ++++ milena/mln/core/concept/site_iterator.hh | 92 ++++++++++++++++++++++++++++++ milena/tests/core/image/Makefile.am | 2 + milena/tests/core/image/for_all_in.cc | 65 +++++++++++++++++++++ 4 files changed, 171 insertions(+), 0 deletions(-) create mode 100644 milena/tests/core/image/for_all_in.cc diff --git a/milena/ChangeLog b/milena/ChangeLog index 34bb8a0..b83ee26 100644 --- a/milena/ChangeLog +++ b/milena/ChangeLog @@ -1,3 +1,15 @@ +2008-12-29 Roland Levillain <roland@lrde.epita.fr> + + Add sugar macros for iterations on neighborhoods and windows. + + * mln/core/concept/site_iterator.hh + (for_all_in_nbh for_all_in_nbh_, for_all_in_win, for_all_in_win_): + New macros. + (mln::internal::make_and_start_iterator): New helper functions. + * tests/core/image/for_all_in.cc: New. + * tests/core/image/Makefile.am (check_PROGRAMS): Add for_all_in. + (for_all_in_SOURCES): New. + 2009-05-14 Thierry Geraud <thierry.geraud@lrde.epita.fr> Add morpho reconstruction by_dilation union_find algorithm. diff --git a/milena/mln/core/concept/site_iterator.hh b/milena/mln/core/concept/site_iterator.hh index 97cbc57..ef37285 100644 --- a/milena/mln/core/concept/site_iterator.hh +++ b/milena/mln/core/concept/site_iterator.hh @@ -40,6 +40,54 @@ # include <mln/core/concept/iterator.hh> // To fetch the macros. +/// \brief Loop shortcuts for iterations on neighborhood and windows. +/// +/// These iterations only work with default-constructible +/// neighborhoods and windows. +/// +/// If we were using `typeof' (non-standard GNU extension) or `auto' +/// (C++0x keyword), we could be more flexible w.r.t. the +/// initialization of the neighborhood/window. +// \{ + +// FIXME: Factor neighborhood and window versions. +// FIXME: What about for_all_in_fwd an for_all_in_bkd? + +/// \brief Loop to browse all the elements of a neighborhood of type +/// \p nbh_t centered at \p p, using an iterator named \p n (template +/// version). +# define for_all_in_nbh(n, nbh_t, p) \ + for (mln_niter(nbh_t) n = \ + mln::internal::make_and_start_iterator(nbh_t(), p); \ + n.is_valid(); n.next()) + +/// \brief Loop to browse all the elements of a neighborhood of type +/// \p nbh_t centered at \p p, using an iterator named \p n +/// (non-template version). +# define for_all_in_nbh_(n, nbh_t, p) \ + for (mln_niter_(nbh_t) n = \ + mln::internal::make_and_start_iterator(nbh_t(), p); \ + n.is_valid(); n.next()) + +/// \brief Loop to browse all the elements of a window of type \p +/// win_t centered at \p p, using an iterator named \p q (template +/// version). +# define for_all_in_win(q, win_t, p) \ + for (mln_niter(win_t) q = \ + mln::internal::make_and_start_iterator(win_t(), p); \ + q.is_valid(); q.next()) + +/// \brief Loop to browse all the elements of a window of type \p +/// win_t centered at \p p, using an iterator named \p q (non-template +/// version). +# define for_all_in_win_(q, win_t, p) \ + for (mln_niter_(win_t) q = \ + mln::internal::make_and_start_iterator(win_t(), p); \ + q.is_valid(); q.next()) + +/// \} + + namespace mln { @@ -86,6 +134,26 @@ namespace mln }; + // Forward declarations. + template <typename E> struct Neighborhood; + template <typename E> struct Window; + + namespace internal + { + + /// \brief Helper for for_all_in_nbh and for_all_in_nbh_ macros. + template <typename N, typename P> + mln_niter(N) + make_and_start_iterator(const Neighborhood<N>& nbh, const P& center); + + /// \brief Helper for for_all_in_win and for_all_in_win_ macros. + template <typename W, typename P> + mln_niter(W) + make_and_start_iterator(const Window<W>& win, const P& center); + + } // end of namespace mln::internal + + # ifndef MLN_INCLUDE_ONLY @@ -147,6 +215,30 @@ namespace mln m5 = 0; } + + namespace internal + { + + template <typename N, typename P> + mln_niter(N) + make_and_start_iterator(const Neighborhood<N>& nbh, const P& center) + { + mln_niter(N) n(exact(nbh), center); + n.start(); + return n; + } + + template <typename W, typename P> + mln_niter(W) + make_and_start_iterator(const Window<W>& win, const P& center) + { + mln_niter(W) q(exact(win), center); + q.start(); + return q; + } + + } // end of namespace mln::internal + # endif // ! MLN_INCLUDE_ONLY } // end of namespace mln diff --git a/milena/tests/core/image/Makefile.am b/milena/tests/core/image/Makefile.am index cdd52f6..89c9bd7 100644 --- a/milena/tests/core/image/Makefile.am +++ b/milena/tests/core/image/Makefile.am @@ -10,6 +10,7 @@ check_PROGRAMS = \ edge_image \ flat_image \ hexa \ + for_all_in \ graph_image \ image1d \ image2d \ @@ -47,6 +48,7 @@ decorated_image_SOURCES = decorated_image.cc graph_image_SOURCES = graph_image.cc flat_image_SOURCES = flat_image.cc hexa_SOURCES = hexa.cc +for_all_in_SOURCES = for_all_in.cc image1d_SOURCES = image1d.cc image2d_SOURCES = image2d.cc image2d_h_SOURCES = image2d_h.cc diff --git a/milena/tests/core/image/for_all_in.cc b/milena/tests/core/image/for_all_in.cc new file mode 100644 index 0000000..7978d18 --- /dev/null +++ b/milena/tests/core/image/for_all_in.cc @@ -0,0 +1,65 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 51 Franklin Street, Fifth Floor, +// Boston, MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + +/// \file tests/core/image/for_all_in.cc +/// \brief Tests on for_all_in_* macros. + +#include <iostream> + +#include <mln/core/image/complex_neighborhoods.hh> +#include <mln/debug/iota.hh> + +#include "tests/core/image/complex_image.hh" + + +int main() +{ + typedef mln::int_u8_2complex_image2d ima_t; + ima_t ima = make_test_complex_image(); + + // FIXME: Update comment. + + /* This for_all_in_nbh_ shortcut is much shorter than the following + equivalent lines: + + mln::neighb2d nbh = mln::c4(); + mln_niter_(mln::neighb2d) n(nbh) + for_all_in_nbh_(n) + std::cout << n << ' '; + std::cout << std::endl; + + However it doesn't work with non default-constructible + neighborhoods (yet). */ + mln_piter_(ima_t) p(ima.domain()); + for_all(p) + { + typedef mln::complex_lower_neighborhood< 2, mln_geom_(ima_t) > nbh_t; + std::cout << p << std::endl; + for_all_in_nbh_(n, nbh_t, p) + std::cout << " " << n << std::endl; + } +} -- 1.6.1.2