1016: Add delta to windows in mln.

https://svn.lrde.epita.fr/svn/oln/trunk/milena Index: ChangeLog from Thierry Geraud <thierry.geraud@lrde.epita.fr> Add delta to windows in mln. * tests/erosion.cc: New. * mln/arith/minus.hh: New. * mln/core/point.hh, * mln/core/dpoint.hh (vec_t, to_vec): New. * mln/core/rectangle2d.hh, * mln/core/concept/window.hh, * mln/core/concept/doc/window.hh, * mln/core/window.hh (delta): New. * mln/level/fill.hh: New overload. * mln/norm: New. * mln/norm/infty.hh: New. * mln/accu/min.hh: New. * mln/accu/sum.hh: New. * mln/accu/max.hh: New. * tests/window2d.cc: Use delta. * tests/box2d.cc: Add assertion. * tests/dpoint2d.cc: Test to_vec. * mln/morpho/erosion.hh: Add dispatch. * mln/accu/mean.hh: Rewrite. mln/accu/max.hh | 112 +++++++++++++++++++++++++++++++++++++++++ mln/accu/mean.hh | 17 +++--- mln/accu/min.hh | 112 +++++++++++++++++++++++++++++++++++++++++ mln/accu/sum.hh | 112 +++++++++++++++++++++++++++++++++++++++++ mln/arith/minus.hh | 82 ++++++++++++++++++++++++++++++ mln/core/concept/doc/window.hh | 5 + mln/core/concept/window.hh | 6 +- mln/core/dpoint.hh | 8 ++ mln/core/point.hh | 7 ++ mln/core/rectangle2d.hh | 10 +++ mln/core/window.hh | 24 ++++++++ mln/level/fill.hh | 24 ++++++++ mln/morpho/erosion.hh | 99 ++++++++++++++++++++++++++++++------ mln/norm/infty.hh | 86 +++++++++++++++++++++++++++++++ tests/box2d.cc | 1 tests/dpoint2d.cc | 3 + tests/erosion.cc | 78 ++++++++++++++++++++++++++++ tests/window2d.cc | 1 18 files changed, 761 insertions(+), 26 deletions(-) Index: tests/window2d.cc --- tests/window2d.cc (revision 1015) +++ tests/window2d.cc (working copy) @@ -49,4 +49,5 @@ w.insert(make::dpoint2d( 1, 1)); image2d_b<bool> ima = convert::to_image(w); debug::println(ima); + mln_assertion(w.delta() = 1); } Index: tests/erosion.cc --- tests/erosion.cc (revision 0) +++ tests/erosion.cc (revision 0) @@ -0,0 +1,78 @@ +// Copyright (C) 2007 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/median.cc + * + * \brief Test on mln::level::median. + */ + +#include <mln/core/image2d_b.hh> +#include <mln/core/rectangle2d.hh> + +#include <mln/io/load_pgm.hh> +#include <mln/io/save_pgm.hh> + +#include <mln/value/int_u.hh> +#include <mln/level/fill.hh> +#include <mln/morpho/erosion.hh> + +#include <mln/fun/pw_value.hh> +#include <mln/fun/val.hh> +#include <mln/fun/ops.hh> + + +using namespace mln; +using namespace mln::value; + + +int main() +{ + rectangle2d rec(4, 4);//64, 64); + border::thickness = 66; + + image2d_b<int_u8> + lena = io::load_pgm("../img/lena.pgm"), + out(lena.domain()); + + morpho::erosion(lena, rec, out); + io::save_pgm(out, "out.pgm"); + + /* + { + image2d_b<bool> bin(lena.domain()), out(lena.domain()); + level::fill(bin, pw_value(1) > val(127)); + morpho::erosion(bin, rec, out); + + image2d_b<int_u8> test(lena.domain()); + image2d_b<int_u8>::piter p(lena.domain()); + for_all(p) + test(p) = out(p) ? 255 : 0; + io::save_pgm(test, "test.pgm"); + } + */ + +} Index: tests/box2d.cc --- tests/box2d.cc (revision 1015) +++ tests/box2d.cc (working copy) @@ -39,4 +39,5 @@ using namespace mln; box2d b = make::box2d(2, 3); + mln_assertion(b.nrows() = 2); } Index: tests/dpoint2d.cc --- tests/dpoint2d.cc (revision 1015) +++ tests/dpoint2d.cc (working copy) @@ -47,4 +47,7 @@ mln_assertion(dp = q - p); mln_assertion(q = p + dp); + + const int (&vec)[2] = dp.to_vec(); + mln_assertion(vec[0] = 3); } Index: mln/core/point.hh --- mln/core/point.hh (revision 1015) +++ mln/core/point.hh (working copy) @@ -96,6 +96,13 @@ /// Origin point (all coordinates are 0). static const point_<n,C> zero; + + /// Type of the array of coordinates. + typedef const C (&vec_t)[n]; + + /// Hook to coordinates. + vec_t to_vec() const { return coord_; } + protected: C coord_[n]; }; Index: mln/core/rectangle2d.hh --- mln/core/rectangle2d.hh (revision 1015) +++ mln/core/rectangle2d.hh (working copy) @@ -107,6 +107,11 @@ */ unsigned width() const; + /*! \brief Give the maximum coordinate gap between the window + * center and a window point. + */ + unsigned delta() const; + /// Get the symmetrical window. rectangle2d sym_() const; @@ -162,6 +167,11 @@ return 2 * half_width_ + 1; } + unsigned rectangle2d::delta() const + { + return half_width_ > half_height_ ? half_width_ : half_height_; + } + rectangle2d rectangle2d::sym_() const { return *this; Index: mln/core/dpoint.hh --- mln/core/dpoint.hh (revision 1015) +++ mln/core/dpoint.hh (working copy) @@ -96,6 +96,14 @@ /// Null delta-point (all coordinates are 0). static const dpoint_<n,C> zero; + const C* coords_() const { return coord_; } + + /// Type of the array of coordinates. + typedef const C (&vec_t)[n]; + + /// Hook to coordinates. + vec_t to_vec() const { return coord_; } + protected: C coord_[n]; }; Index: mln/core/concept/window.hh --- mln/core/concept/window.hh (revision 1015) +++ mln/core/concept/window.hh (working copy) @@ -59,6 +59,8 @@ bool is_centered() const; bool is_symmetric() const; + unsigned delta() const; + E sym_() const; */ @@ -93,8 +95,10 @@ m2 = 0; bool (E::*m3)() const = & E::is_symmetric; m3 = 0; - E (E::*m4)() const = & E::sym_; + unsigned (E::*m4)() const = & E::delta; m4 = 0; + E (E::*m_)() const = & E::sym_; + m_ = 0; } template <typename W> Index: mln/core/concept/doc/window.hh --- mln/core/concept/doc/window.hh (revision 1015) +++ mln/core/concept/doc/window.hh (working copy) @@ -76,6 +76,11 @@ */ bool is_symmetric() const; + /*! \brief Give the maximum coordinate gap between the window + center and a window point. + */ + unsigned delta() const; + /*! \brief Give the symmetrical window. */ E sym_() const; Index: mln/core/window.hh --- mln/core/window.hh (revision 1015) +++ mln/core/window.hh (working copy) @@ -41,6 +41,7 @@ # include <mln/convert/to_dpoint.hh> # include <mln/fun/all.hh> +# include <mln/norm/infty.hh> namespace mln @@ -97,6 +98,11 @@ */ bool is_symmetric() const; + /*! \brief Give the maximum coordinate gap between the window + center and a window point. + */ + unsigned delta() const; + /// Give the symmetrical window. window_<D> sym_() const; @@ -128,6 +134,8 @@ # ifndef MLN_INCLUDE_ONLY + // window_<D> + template <typename D> window_<D>::window_() { @@ -147,6 +155,20 @@ } template <typename D> + unsigned window_<D>::delta() const + { + unsigned d = 0; + const unsigned n = this->nelements(); + for (unsigned i = 0; i < n; ++i) + { + unsigned dd = norm::infty(this->element(i).to_vec()); + if (dd > d) + d = dd; + } + return d; + } + + template <typename D> window_<D> window_<D>::sym_() const { @@ -157,6 +179,8 @@ return tmp; } + // operators + template <typename W> window_<mln_dpoint(W)> operator+(const Window<W>& win, const mln_dpoint(W)& dp) Index: mln/morpho/erosion.hh --- mln/morpho/erosion.hh (revision 1015) +++ mln/morpho/erosion.hh (working copy) @@ -30,8 +30,11 @@ # include <mln/core/concept/image.hh> # include <mln/core/concept/window.hh> -// FIXME: # include <mln/border/assign.hh> +# include <mln/accu/min.hh> # include <mln/value/props.hh> +# include <mln/level/compare.hh> +# include <mln/level/fill.hh> +// FIXME: # include <mln/border/assign.hh> namespace mln @@ -40,8 +43,8 @@ namespace morpho { - template <typename I, typename W> - I erosion(const Image<I>& input, const Window<W>& win); + template <typename I, typename W, typename O> + void erosion(const Image<I>& input, const Window<W>& win, Image<O>& output); # ifndef MLN_INCLUDE_ONLY @@ -49,41 +52,103 @@ namespace impl { - template <typename I, typename W> - I erosion(const Image<I>& input_, const Window<W>& win_) + // on function + + template <typename I, typename W, typename O> + void erosion_on_function(const Image<I>& input_, const Window<W>& win_, Image<O>& output_) { const I& input = exact(input_); const W& win = exact(win_); + O& output = exact(output_); - typedef mln_value(I) value; + accu::min<mln_value(I)> min; - I output(input.domain()); mln_piter(I) p(input.domain()); mln_qiter(W) q(win, p); for_all(p) { - value v = mln_max(value); - for_all(q) if (input.owns_(q)) - { - if (input(q) < v) - v = input(q); + min.init(); + for_all(q) if (input.has(q)) + min.take(input(q)); + output(p) = min; + } } - output(p) = v; + + + // on set + + template <typename I, typename W, typename O> + void erosion_on_set(const Image<I>& input_, const Window<W>& win_, Image<O>& output_) + { + const I& input = exact(input_); + const W& win = exact(win_); + O& output = exact(output_); + + level::fill(output, input); + + mln_piter(I) p(input.domain()); + mln_qiter(W) q(win, p); + for_all(p) + if (input(p)) + for_all(q) if (input.has(q)) + if (! input(q)) + { + output(p) = false; + break; } - return output; } + + // ... + + + // FIXME: stage 3: dispatch w.r.t. fast property + + // stage 2: dispatch w.r.t. the value kind + + template <typename I, typename W, typename O> + void erosion_wrt_value(value::binary_kind, // binary => morphology on sets + const Image<I>& input, const Window<W>& win, Image<O>& output) + { + return impl::erosion_on_set(exact(input), exact(win), output); + } + + template <typename K, typename I, typename W, typename O> + void erosion_wrt_value(K, // otherwise => morphology on functions + const Image<I>& input, const Window<W>& win, Image<O>& output) + { + return impl::erosion_on_function(exact(input), exact(win), output); + } + + + // stage 1: dispatch w.r.t. the window type + + template <typename I, typename W, typename O> // general case + void erosion_wrt_win(const Image<I>& input, const Window<W>& win, Image<O>& output) + { + erosion_wrt_value(mln_kind(I)(), exact(input), exact(win), output); + } + +// template <typename I, typename O> // rectangle2d +// void erosion_wrt_win(const Image<I>& input, const rectangle2d& win, Image<O>& output) +// { +// return FIXME; +// } + + } // end of namespace mln::morpho::impl // facade - template <typename I, typename W> - I erosion(const Image<I>& input, const Window<W>& win) + template <typename I, typename W, typename O> + void erosion(const Image<I>& input, const Window<W>& win, Image<O>& output) { - return impl::erosion(exact(input), exact(win)); + impl::erosion_wrt_win(input, exact(win), output); + if (exact(win).is_centered()) + mln_postcondition(output <= input); } # endif // ! MLN_INCLUDE_ONLY Index: mln/level/fill.hh --- mln/level/fill.hh (revision 1015) +++ mln/level/fill.hh (working copy) @@ -34,6 +34,7 @@ */ # include <mln/core/concept/image.hh> +# include <mln/core/concept/function.hh> namespace mln @@ -53,6 +54,17 @@ void fill(Image<I>& ima, const mln_value(I)& v); + /*! Fill the whole image \p ima with the function \p f. + * + * \param[in,out] ima The image to be filled. + * \param[in] f The function. + * + * \pre \p ima has to be initialized. + */ + template <typename I, typename F> + void fill(Image<I>& ima, const Function_p2v<F>& f); + + /*! Fill the image \p ima by applying the function \p f. * * \param[in,out] ima The image to be filled. @@ -110,6 +122,18 @@ ima(p) = value; } + template <typename I, typename F> + void fill(Image<I>& ima_, + const Function_p2v<F>& f_) + { + I& ima = exact(ima_); + mln_precondition(ima.has_data()); + const F& f = exact(f_); + mln_piter(I) p(ima.domain()); + for_all(p) + ima(p) = f(p); + } + template <typename I> void fill(Image<I>& ima_, mln_value(I) (*f)(const mln_point(I)& p)) Index: mln/arith/minus.hh --- mln/arith/minus.hh (revision 0) +++ mln/arith/minus.hh (revision 0) @@ -0,0 +1,82 @@ +// Copyright (C) 2007 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. + +#ifndef MLN_ARITH_MINUS_HH +# define MLN_ARITH_MINUS_HH + +/*! \file mln/arith/minus.hh + * + * \brief Point-wise substraction between images. + */ + +# include <mln/core/concept/image.hh> + + +namespace mln +{ + + namespace arith + { + + /*! Point-wise substraction of images \p lhs and \p rhs. + * + * \param[in] lhs First operand image. + * \param[in] rhs Second operand image. + * \param[out] output The result image. + * + * \pre \p output.domain = \p lhs.domain = \p rhs.domain + */ + template <typename L, typename R, typename O> + void minus(const Image<L>& lhs, const Image<R>& rhs, Image<O>& output); + + + +# ifndef MLN_INCLUDE_ONLY + + template <typename L, typename R, typename O> + void minus(const Image<L>& lhs_, const Image<R>& rhs_, Image<O>& output_) + { + const L& lhs = exact(lhs_); + const R& rhs = exact(rhs_); + O& output = exact(output_); + + mln_precondition(rhs.domain() = lhs.domain()); + mln_precondition(output.domain() = lhs.domain()); + + mln_piter(I) p(output.domain()); + for_all(p) + output(p) = lhs(p) - rhs(p); + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::arith + +} // end of namespace mln + + +#endif // ! MLN_ARITH_MINUS_HH Index: mln/norm/infty.hh --- mln/norm/infty.hh (revision 0) +++ mln/norm/infty.hh (revision 0) @@ -0,0 +1,86 @@ +// Copyright (C) 2007 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. + +#ifndef MLN_NORM_INFTY_HH +# define MLN_NORM_INFTY_HH + +/*! \file mln/norm/infty.hh + * + * \brief Define some infinity-norm related routines. + */ + +# include <cmath> + + +namespace mln +{ + + namespace norm + { + + /// Infinity-norm of a vector \p vec. + template <unsigned n, typename C> + C infty(const C (&vec)[n]); + + /// Infinity-norm distance between vectors \p v1 and \p v2. + template <unsigned n, typename C> + C infty_distance(const C (&v1)[n], const C (&v2)[n]); + + +# ifndef MLN_INCLUDE_ONLY + + template <unsigned n, typename C> + C infty(const C (&vec)[n]) + { + C c = 0; + for (unsigned i = 0; i < n; ++i) + if (std::abs(vec[i]) > c) + c = std::abs(vec[i]); + return c; + } + + template <unsigned n, typename C> + C infty_distance(const C (&v1)[n], const C (&v2)[n]) + { + C d = 0; + for (unsigned i = 0; i < n; ++i) + { + C dd = v2[i] > v1[i] ? v2[i] - v1[i] : v1[i] - v2[i]; + if (dd > d) + d = dd; + } + return d; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::norm + +} // end of namespace mln + + +#endif // ! MLN_NORM_INFTY_HH Index: mln/accu/min.hh --- mln/accu/min.hh (revision 0) +++ mln/accu/min.hh (revision 0) @@ -0,0 +1,112 @@ +// Copyright (C) 2007 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. + +#ifndef MLN_ACCU_MIN_HH +# define MLN_ACCU_MIN_HH + +/*! \file mln/accu/min.hh + * + * \brief Define an accumulator that computes a min. + */ + +# include <mln/core/concept/accumulator.hh> +# include <mln/value/props.hh> + + +namespace mln +{ + + namespace accu + { + + + /*! Generic min accumulator class. + * + * The parameter \c V is the type of values. + */ + template <typename V> + struct min : public Accumulator< min<V> > + { + typedef V value; + + min(); + void take(const value& v); + void init(); + + operator V() const; + V to_value() const; + + protected: + + V v_; + }; + + + +# ifndef MLN_INCLUDE_ONLY + + template <typename V> + min<V>::min() + { + init(); + } + + template <typename V> + void min<V>::take(const value& v) + { + if (v < v_) + v_ = v; + } + + template <typename V> + void + min<V>::init() + { + v_ = mln_max(V); + } + + template <typename V> + min<V>::operator V() const + { + return v_; + } + + template <typename V> + V + min<V>::to_value() const + { + return v_; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::accu + +} // end of namespace mln + + +#endif // ! MLN_ACCU_MIN_HH Index: mln/accu/sum.hh --- mln/accu/sum.hh (revision 0) +++ mln/accu/sum.hh (revision 0) @@ -0,0 +1,112 @@ +// Copyright (C) 2007 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. + +#ifndef MLN_ACCU_SUM_HH +# define MLN_ACCU_SUM_HH + +/*! \file mln/accu/sum.hh + * + * \brief Define an accumulator that computes a sum. + */ + +# include <mln/core/concept/accumulator.hh> + + +namespace mln +{ + + namespace accu + { + + + /*! Generic sum accumulator class. + * + * Parameter \c V is the type of values that we sum. Parameter \c + * S is the type to store the sum value; the default type of + * \c S is \c V. + */ + template <typename V, typename S = V> + struct sum : public Accumulator< sum<V,S> > + { + typedef V value; + + sum(); + void take(const value& v); + void init(); + + operator S() const; + S to_value() const; + + protected: + + S sum_; + }; + + + +# ifndef MLN_INCLUDE_ONLY + + template <typename V, typename S> + sum<V,S>::sum() + { + init(); + } + + template <typename V, typename S> + void sum<V,S>::take(const value& v) + { + sum_ += v; + } + + template <typename V, typename S> + void + sum<V,S>::init() + { + sum_ = 0; + } + + template <typename V, typename S> + sum<V,S>::operator S() const + { + return to_value; + } + + template <typename V, typename S> + S + sum<V,S>::to_value() const + { + return sum_ / count_; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::accu + +} // end of namespace mln + + +#endif // ! MLN_ACCU_SUM_HH Index: mln/accu/max.hh --- mln/accu/max.hh (revision 0) +++ mln/accu/max.hh (revision 0) @@ -0,0 +1,112 @@ +// Copyright (C) 2007 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. + +#ifndef MLN_ACCU_MAX_HH +# define MLN_ACCU_MAX_HH + +/*! \file mln/accu/max.hh + * + * \brief Define an accumulator that computes a max. + */ + +# include <mln/core/concept/accumulator.hh> +# include <mln/value/props.hh> + + +namespace mln +{ + + namespace accu + { + + + /*! Generic max accumulator class. + * + * The parameter \c V is the type of values. + */ + template <typename V> + struct max : public Accumulator< max<V> > + { + typedef V value; + + max(); + void take(const value& v); + void init(); + + operator V() const; + V to_value() const; + + protected: + + V v_; + }; + + + +# ifndef MLN_INCLUDE_ONLY + + template <typename V> + max<V>::max() + { + init(); + } + + template <typename V> + void max<V>::take(const value& v) + { + if (v > v_) + v_ = v; + } + + template <typename V> + void + max<V>::init() + { + v_ = mln_min(V); + } + + template <typename V> + max<V>::operator V() const + { + return v_; + } + + template <typename V> + V + max<V>::to_value() const + { + return v_; + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::accu + +} // end of namespace mln + + +#endif // ! MLN_ACCU_MAX_HH Index: mln/accu/mean.hh --- mln/accu/mean.hh (revision 1015) +++ mln/accu/mean.hh (working copy) @@ -33,7 +33,8 @@ * \brief Define an accumulator that computes a mean. */ -# include <mln/core/concept/accumulator.hh> +# include <mln/accu/counter.hh> +# include <mln/accu/sum.hh> namespace mln @@ -64,8 +65,8 @@ protected: - std::size_t count_; - S sum_; + accu::counter<V> count_; + accu::sum<V,S> sum_; }; @@ -81,16 +82,16 @@ template <typename V, typename S, typename M> void mean<V,S,M>::take(const value& v) { - ++count_; - sum_ += v; + count_.take(v); + sum_.take(v); } template <typename V, typename S, typename M> void mean<V,S,M>::init() { - count_ = 0; - sum_ = 0; + count_.init(); + sum_.init(); } template <typename V, typename S, typename M> @@ -103,7 +104,7 @@ M mean<V,S,M>::to_value() const { - return sum_ / count_; + return sum_.to_value() / count_.to_value(); } # endif // ! MLN_INCLUDE_ONLY
participants (1)
-
Thierry Geraud