
URL: https://svn.lrde.epita.fr/svn/oln/trunk/milena ChangeLog: 2008-12-12 Matthieu Garrigues <garrigues@lrde.epita.fr> Make level::compare use test::predicate. * mln/level/compare.hh: . * mln/test/predicate.hh: Add a version which works on two images. Add the concept of vv2b function. * mln/fun/vv2b: New. * mln/core/concept/function.hh: . Add some vv2b functions. * mln/fun/vv2b/eq.hh: New. * mln/fun/vv2b/ge.hh: New. * mln/fun/vv2b/gt.hh: New. * mln/fun/vv2b/implies.hh: New. * mln/fun/vv2b/le.hh: New. * mln/fun/vv2b/lt.hh: New. --- core/concept/function.hh | 36 ++++++++++++++++++++++ fun/vv2b/eq.hh | 75 +++++++++++++++++++++++++++++++++++++++++++++++ fun/vv2b/ge.hh | 75 +++++++++++++++++++++++++++++++++++++++++++++++ fun/vv2b/gt.hh | 75 +++++++++++++++++++++++++++++++++++++++++++++++ fun/vv2b/implies.hh | 75 +++++++++++++++++++++++++++++++++++++++++++++++ fun/vv2b/le.hh | 75 +++++++++++++++++++++++++++++++++++++++++++++++ fun/vv2b/lt.hh | 75 +++++++++++++++++++++++++++++++++++++++++++++++ level/compare.hh | 31 ++++++++++--------- test/predicate.hh | 62 ++++++++++++++++++++++++++++++++++++-- 9 files changed, 560 insertions(+), 19 deletions(-) Index: trunk/milena/mln/core/concept/function.hh =================================================================== --- trunk/milena/mln/core/concept/function.hh (revision 3038) +++ trunk/milena/mln/core/concept/function.hh (revision 3039) @@ -52,6 +52,7 @@ template <typename E> struct Function_l2l; template <typename E> struct Function_vv2v; + template <typename E> struct Function_vv2b; /// Function category flag type. template <> @@ -324,6 +325,28 @@ Function_vv2v(const Function_vv2v&); }; + /*------------------------. + | Value, Value -> Boolean.| + `------------------------*/ + + template <> + struct Function_vv2b<void> { typedef Function<void> super; }; + + /// Base class for implementation of function-objects from + /// a couple of values to a boolean. + /// + /// The parameter \a E is the exact type. + /// + template <typename E> + struct Function_vv2b : public Function<E> + { + typedef bool result; + typedef Function_vv2b<void> category; + protected: + Function_vv2b(); + Function_vv2b(const Function_vv2b&); + }; + # ifndef MLN_INCLUDE_ONLY @@ -483,6 +506,19 @@ { } + template <typename E> + inline + Function_vv2b<E>::Function_vv2b() + { + } + + template <typename E> + inline + Function_vv2b<E>::Function_vv2b(const Function_vv2b<E>& rhs) + : Function<E>(rhs) + { + } + # endif // ! MLN_INCLUDE_ONLY } // end of namespace mln Index: trunk/milena/mln/level/compare.hh =================================================================== --- trunk/milena/mln/level/compare.hh (revision 3038) +++ trunk/milena/mln/level/compare.hh (revision 3039) @@ -34,6 +34,10 @@ */ # include <mln/core/concept/image.hh> +# include <mln/fun/vv2b/eq.hh> +# include <mln/fun/vv2b/le.hh> +# include <mln/fun/vv2b/lt.hh> +# include <mln/test/predicate.hh> namespace mln @@ -82,42 +86,39 @@ inline bool operator == (const Image<L>& lhs_, const Image<R>& rhs_) { + typedef fun::vv2b::eq<mln_value(L), mln_value(R)> F; + const L& lhs = exact(lhs_); const R& rhs = exact(rhs_); mln_precondition(lhs.domain() == rhs.domain()); - mln_piter(L) p(lhs.domain()); - for_all(p) - if (! (lhs(p) == rhs(p))) - return false; - return true; + + return test::predicate(lhs_, rhs_, F()); } template <typename L, typename R> inline bool operator < (const Image<L>& lhs_, const Image<R>& rhs_) { + typedef fun::vv2b::lt<mln_value(L), mln_value(R)> F; + const L& lhs = exact(lhs_); const R& rhs = exact(rhs_); mln_precondition(lhs.domain() == rhs.domain()); - mln_piter(L) p(lhs.domain()); - for_all(p) - if (! (lhs(p) < rhs(p))) - return false; - return true; + + return test::predicate(lhs_, rhs_, F()); } template <typename L, typename R> // required! inline bool operator <= (const Image<L>& lhs_, const Image<R>& rhs_) { + typedef fun::vv2b::le<mln_value(L), mln_value(R)> F; + const L& lhs = exact(lhs_); const R& rhs = exact(rhs_); mln_precondition(lhs.domain() == rhs.domain()); - mln_piter(L) p(lhs.domain()); - for_all(p) - if (! (lhs(p) <= rhs(p))) - return false; - return true; + + return test::predicate(lhs_, rhs_, F()); } # endif // ! MLN_INCLUDE_ONLY Index: trunk/milena/mln/test/predicate.hh =================================================================== --- trunk/milena/mln/test/predicate.hh (revision 3038) +++ trunk/milena/mln/test/predicate.hh (revision 3039) @@ -54,6 +54,17 @@ bool predicate(const Image<I>& ima, const Function_v2b<F>& f); + /*! Test if all pixel values of \p lhs and \p rhs verify the + * predicate \p f. + * + * \param[in] lhs The image. + * \param[in] rhs The image. + * \param[in] f The predicate. + */ + template <typename I, typename J, typename F> + bool predicate(const Image<I>& lhs, const Image<J>& rhs, const Function_v2b<F>& f); + + /*! Test if all points of \p pset verify the predicate \p f. * * \param[in] pset The point set. @@ -70,9 +81,8 @@ template <typename I, typename F> inline - bool predicate_(trait::image::speed::any, const I& ima_, const F& f) + bool predicate_(trait::image::speed::any, const I& ima, const F& f) { - const I& ima = exact(ima_); mln_piter(I) p(ima.domain()); for_all(p) if (! f(ima(p))) @@ -82,9 +92,8 @@ template <typename I, typename F> inline - bool predicate_(trait::image::speed::fastest, const I& ima_, const F& f) + bool predicate_(trait::image::speed::fastest, const I& ima, const F& f) { - const I& ima = exact(ima_); mln_pixter(const I) pxl(ima); for_all(pxl) if (! f(pxl.val())) @@ -92,6 +101,33 @@ return true; } + template <typename I, typename J, typename F> + inline + bool predicate_(trait::image::speed::any, + trait::image::speed::any, + const I& lhs, const J& rhs, const F& f) + { + mln_piter(I) p(lhs.domain()); + for_all(p) + if (! f(lhs(p), rhs(p))) + return false; + return true; + } + + template <typename I, typename J, typename F> + inline + bool predicate_(trait::image::speed::fastest, + trait::image::speed::fastest, + const I& lhs, const J& rhs, const F& f) + { + mln_pixter(const I) pxl1(lhs); + mln_pixter(const I) pxl2(rhs); + for_all_2(pxl1, pxl2) + if (! f(pxl1.val(), pxl2.val())) + return false; + return true; + } + template <typename S, typename F> inline bool predicate_(const Site_Set<S>& pset, const F& f) @@ -117,6 +153,24 @@ exact(f)); } + + template <typename I, typename J, typename F> + inline + bool predicate(const Image<I>& lhs_, const Image<J>& rhs_, const Function_vv2b<F>& f) + { + const I& lhs = exact(lhs_); + const J& rhs = exact(rhs_); + + mln_precondition(lhs.has_data()); + mln_precondition(rhs.has_data()); + mln_precondition(lhs.domain() == rhs.domain()); + + return impl::predicate_(mln_trait_image_speed(I)(), + mln_trait_image_speed(J)(), + lhs, rhs, + exact(f)); + } + template <typename S, typename F> inline bool predicate(const Site_Set<S>& pset, const Function_p2b<F>& f) Index: trunk/milena/mln/fun/vv2b/implies.hh =================================================================== --- trunk/milena/mln/fun/vv2b/implies.hh (revision 0) +++ trunk/milena/mln/fun/vv2b/implies.hh (revision 3039) @@ -0,0 +1,75 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) +// +// 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. + +#ifndef MLN_FUN_VV2B_IMPLIES_HH +# define MLN_FUN_VV2B_IMPLIES_HH + +/// \file mln/fun/vv2b/implies.hh +/// +/// Functor that computes "logical implies" between two values. + +# include <mln/core/concept/function.hh> +# include <mln/trait/op/and.hh> + + +namespace mln +{ + + namespace fun + { + + namespace vv2b + { + + /// Functor computing logical-implies between two values. + template <typename L, typename R = L> + struct implies : public Function_vv2b< implies<L,R> > + { + bool operator()(const L& v1, const R& v2) const; + }; + + +# ifndef MLN_INCLUDE_ONLY + + template <typename L, typename R> + inline + bool + implies<L,R>::operator()(const L& v1, const R& v2) const + { + return (! v1) || v2; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::fun::vv2b + + } // end of namespace mln::fun + +} // end of namespace mln + + +#endif // ! MLN_FUN_VV2B_IMPLIES_HH Index: trunk/milena/mln/fun/vv2b/eq.hh =================================================================== --- trunk/milena/mln/fun/vv2b/eq.hh (revision 0) +++ trunk/milena/mln/fun/vv2b/eq.hh (revision 3039) @@ -0,0 +1,75 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) +// +// 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. + +#ifndef MLN_FUN_VV2B_EQ_HH +# define MLN_FUN_VV2B_EQ_HH + +/// \file mln/fun/vv2b/eq.hh +/// +/// Functor that computes equal between two values. + +# include <mln/core/concept/function.hh> +# include <mln/trait/op/and.hh> + + +namespace mln +{ + + namespace fun + { + + namespace vv2b + { + + /// Functor computing equal between two values. + template <typename L, typename R = L> + struct eq : public Function_vv2b< eq<L,R> > + { + bool operator()(const L& v1, const R& v2) const; + }; + + +# ifndef MLN_INCLUDE_ONLY + + template <typename L, typename R> + inline + bool + eq<L,R>::operator()(const L& v1, const R& v2) const + { + return v1 == v2; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::fun::vv2b + + } // end of namespace mln::fun + +} // end of namespace mln + + +#endif // ! MLN_FUN_VV2B_EQ_HH Index: trunk/milena/mln/fun/vv2b/gt.hh =================================================================== --- trunk/milena/mln/fun/vv2b/gt.hh (revision 0) +++ trunk/milena/mln/fun/vv2b/gt.hh (revision 3039) @@ -0,0 +1,75 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) +// +// 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. + +#ifndef MLN_FUN_VV2B_GT_HH +# define MLN_FUN_VV2B_GT_HH + +/// \file mln/fun/vv2b/gt.hh +/// +/// Functor that computes "greater than" between two values. + +# include <mln/core/concept/function.hh> +# include <mln/trait/op/and.hh> + + +namespace mln +{ + + namespace fun + { + + namespace vv2b + { + + /// Functor computing "greater than" between two values. + template <typename L, typename R = L> + struct gt : public Function_vv2b< gt<L,R> > + { + bool operator()(const L& v1, const R& v2) const; + }; + + +# ifndef MLN_INCLUDE_ONLY + + template <typename L, typename R> + inline + bool + gt<L,R>::operator()(const L& v1, const R& v2) const + { + return v1 > v2; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::fun::vv2b + + } // end of namespace mln::fun + +} // end of namespace mln + + +#endif // ! MLN_FUN_VV2B_GT_HH Index: trunk/milena/mln/fun/vv2b/ge.hh =================================================================== --- trunk/milena/mln/fun/vv2b/ge.hh (revision 0) +++ trunk/milena/mln/fun/vv2b/ge.hh (revision 3039) @@ -0,0 +1,75 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) +// +// 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. + +#ifndef MLN_FUN_VV2B_GE_HH +# define MLN_FUN_VV2B_GE_HH + +/// \file mln/fun/vv2b/ge.hh +/// +/// Functor that computes "greater or equal than" between two values. + +# include <mln/core/concept/function.hh> +# include <mln/trait/op/and.hh> + + +namespace mln +{ + + namespace fun + { + + namespace vv2b + { + + /// Functor computing "greater or equal than" between two values. + template <typename L, typename R = L> + struct ge : public Function_vv2b< ge<L,R> > + { + bool operator()(const L& v1, const R& v2) const; + }; + + +# ifndef MLN_INCLUDE_ONLY + + template <typename L, typename R> + inline + bool + ge<L,R>::operator()(const L& v1, const R& v2) const + { + return v1 >= v2; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::fun::vv2b + + } // end of namespace mln::fun + +} // end of namespace mln + + +#endif // ! MLN_FUN_VV2B_GE_HH Index: trunk/milena/mln/fun/vv2b/lt.hh =================================================================== --- trunk/milena/mln/fun/vv2b/lt.hh (revision 0) +++ trunk/milena/mln/fun/vv2b/lt.hh (revision 3039) @@ -0,0 +1,75 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) +// +// 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. + +#ifndef MLN_FUN_VV2B_LT_HH +# define MLN_FUN_VV2B_LT_HH + +/// \file mln/fun/vv2b/lt.hh +/// +/// Functor that computes "lower than" between two values. + +# include <mln/core/concept/function.hh> +# include <mln/trait/op/and.hh> + + +namespace mln +{ + + namespace fun + { + + namespace vv2b + { + + /// Functor computing "lower than" between two values. + template <typename L, typename R = L> + struct lt : public Function_vv2b< lt<L,R> > + { + bool operator()(const L& v1, const R& v2) const; + }; + + +# ifndef MLN_INCLUDE_ONLY + + template <typename L, typename R> + inline + bool + lt<L,R>::operator()(const L& v1, const R& v2) const + { + return v1 < v2; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::fun::vv2b + + } // end of namespace mln::fun + +} // end of namespace mln + + +#endif // ! MLN_FUN_VV2B_LT_HH Index: trunk/milena/mln/fun/vv2b/le.hh =================================================================== --- trunk/milena/mln/fun/vv2b/le.hh (revision 0) +++ trunk/milena/mln/fun/vv2b/le.hh (revision 3039) @@ -0,0 +1,75 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) +// +// 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. + +#ifndef MLN_FUN_VV2B_LE_HH +# define MLN_FUN_VV2B_LE_HH + +/// \file mln/fun/vv2b/le.hh +/// +/// Functor that computes "lower or equal than" between two values. + +# include <mln/core/concept/function.hh> +# include <mln/trait/op/and.hh> + + +namespace mln +{ + + namespace fun + { + + namespace vv2b + { + + /// Functor computing "lower or equal than" between two values. + template <typename L, typename R = L> + struct le : public Function_vv2b< le<L,R> > + { + bool operator()(const L& v1, const R& v2) const; + }; + + +# ifndef MLN_INCLUDE_ONLY + + template <typename L, typename R> + inline + bool + le<L,R>::operator()(const L& v1, const R& v2) const + { + return v1 <= v2; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::fun::vv2b + + } // end of namespace mln::fun + +} // end of namespace mln + + +#endif // ! MLN_FUN_VV2B_LE_HH