
https://svn.lrde.epita.fr/svn/oln/trunk/milena Index: ChangeLog from Thierry Geraud <thierry.geraud@lrde.epita.fr> Handle low quantization and fast properties. * tests/transform.cc: New. * tests/fill.cc: New. * mln/core/macros.hh (mln_value_kind, mln_vset): New. * mln/core/trait/is_fast.hh: New. * mln/core/trait/all.hh: New. * mln/core/trait/is_lowq.hh: New. * mln/core/internal/image_base.hh (select_image_concept_): New. * mln/core/concept/image.hh (vset, values): New. Update. * mln/core/concept/fast_image.hh (operator[]): New. * mln/metal/math.hh: New. * mln/metal/bool.hh: New. * mln/metal/bexpr.hh: New. * mln/value/lut_vec.hh: New. * mln/value/int_u.hh (nbits, card): New. * tests/README (g++-2.95): New hints. * tests/pixter_dpoint2d.cc: Fix warning. * tests/erosion.cc: Fix doc. * doc/Doxyfile.in: Update. * mln/debug/iota.hh: New overload. * mln/fun/pw_value.hh (function_): Rename as... (select_function_): ...this. * mln/core/trait/pixter.hh (pixter, qixter, nixter): Remove; obsolete. * mln/core/concept/value_set.hh (viter): Likewise. * mln/core/concept/doc/image.hh, * mln/core/concept/doc/value_set.hh, * mln/core/concept/doc/fast_image.hh: Update. * mln/core/image2d_b.hh: Update. * mln/metal/none.hh: Fix doc. * mln/morpho/erosion.hh: Update. * mln/level/fill.hh: Add todos. New overload. * mln/level/fast_median.hh: Fix doc. * mln/level/transform.hh: New overload. * mln/value/props.hh (min): Change to var. * mln/value/kind.hh: Fix doc. * mln/value/set.hh (viter): Remove; obsolete. doc/Doxyfile.in | 1 mln/core/concept/doc/fast_image.hh | 25 +++++ mln/core/concept/doc/image.hh | 17 +++ mln/core/concept/doc/value_set.hh | 4 mln/core/concept/fast_image.hh | 20 +++- mln/core/concept/image.hh | 6 + mln/core/concept/value_set.hh | 2 mln/core/image2d_b.hh | 65 +++++++++++++- mln/core/internal/image_base.hh | 20 ++++ mln/core/macros.hh | 12 ++ mln/core/tags.hh | 1 mln/core/trait/all.hh | 52 +++++++++++ mln/core/trait/is_fast.hh | 60 +++++++++++++ mln/core/trait/is_lowq.hh | 65 ++++++++++++++ mln/core/trait/pixter.hh | 15 --- mln/debug/iota.hh | 23 +++++ mln/fun/pw_value.hh | 6 - mln/level/fast_median.hh | 2 mln/level/fill.hh | 75 ++++++++++++++-- mln/level/transform.hh | 56 +++++++++++- mln/metal/bexpr.hh | 102 ++++++++++++++++++++++ mln/metal/bool.hh | 76 +++++++++++++++++ mln/metal/math.hh | 63 ++++++++++++++ mln/metal/none.hh | 2 mln/morpho/erosion.hh | 2 mln/value/int_u.hh | 3 mln/value/kind.hh | 2 mln/value/lut_vec.hh | 165 +++++++++++++++++++++++++++++++++++++ mln/value/props.hh | 85 ++++++++++--------- mln/value/set.hh | 11 -- tests/README | 4 tests/erosion.cc | 4 tests/fill.cc | 63 ++++++++++++++ tests/pixter_dpoint2d.cc | 2 tests/transform.cc | 66 ++++++++++++++ 35 files changed, 1066 insertions(+), 111 deletions(-) Index: tests/README --- tests/README (revision 1025) +++ tests/README (working copy) @@ -1 +1,3 @@ -g++-4.1 -I.. -ansi -pedantic -W -Wall -Wextra -Wconversion sample.cc +g++-4.1 -ansi -pedantic -W -Wall -Wextra -Wconversion -I.. sample.cc + +g++-2.95 -ansi -pedantic -W -Wall -Wconversion -ftemplate-depth-51 -I.. sample.cc \ No newline at end of file Index: tests/transform.cc --- tests/transform.cc (revision 0) +++ tests/transform.cc (revision 0) @@ -0,0 +1,66 @@ +// 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/transform.cc + * + * \brief Tests on mln::level::transform + */ + +#include <cmath> + +#include <mln/core/image2d_b.hh> +#include <mln/level/transform.hh> +#include <mln/debug/iota.hh> + + +struct mysqrt : mln::Function_v2v<mysqrt> +{ + typedef unsigned short result; + result operator()(unsigned short c) const + { + return result( std::sqrt(float(c)) ); + } +}; + + + +int main() +{ + using namespace mln; + + const unsigned size = 10000; + image2d_b<unsigned short> + ima(size, size); + + (std::cout << "iota... ").flush(); + debug::iota(ima); + std::cout << "done" << std::endl; + + (std::cout << "transform... ").flush(); + level::transform(ima, mysqrt(), ima); + std::cout << "done" << std::endl; +} Index: tests/pixter_dpoint2d.cc --- tests/pixter_dpoint2d.cc (revision 1025) +++ tests/pixter_dpoint2d.cc (working copy) @@ -67,7 +67,7 @@ qixter qix(ima, win, p); for_all(p) - if (p[0] > 0 && p[1] > 0 && p[0] < size - 1 && p[1] < size - 1) + if (p[0] > 0 && p[1] > 0 && p[0] < int(size - 1) && p[1] < int(size - 1)) for_all(qix) mln_assertion(*qix = value); } Index: tests/erosion.cc --- tests/erosion.cc (revision 1025) +++ tests/erosion.cc (working copy) @@ -25,9 +25,9 @@ // reasons why the executable file might be covered by the GNU General // Public License. -/*! \file tests/median.cc +/*! \file tests/erosion.cc * - * \brief Test on mln::level::median. + * \brief Test on mln::morpho::erosion. */ #include <mln/core/image2d_b.hh> Index: tests/fill.cc --- tests/fill.cc (revision 0) +++ tests/fill.cc (revision 0) @@ -0,0 +1,63 @@ +// 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/fill.cc + * + * \brief Tests on mln::level::fill + */ + +#include <mln/core/image2d_b.hh> +#include <mln/level/fill.hh> + +#include <mln/debug/println.hh> +#include <mln/value/props.hh> + + +int main() +{ + using namespace mln; + + + unsigned u = 300; + unsigned char uc = u; + mln_assertion(uc = 44); + +// { +// const unsigned size = 3; +// image2d_b<unsigned> ima(size, size); +// level::fill(ima, u); +// debug::println(ima); +// } + + { + const unsigned size = 10000; + image2d_b<unsigned char> ima(size, size); + for (unsigned i = 0; i < 5; ++i) + level::fill(ima, uc); + } + +} Index: doc/Doxyfile.in --- doc/Doxyfile.in (revision 1025) +++ doc/Doxyfile.in (working copy) @@ -1055,6 +1055,7 @@ "mln_fwd_viter(T)=typename T::fwd_viter" \ "mln_bkd_viter(T)=typename T::bkd_viter" \ "mln_value(T)=typename T::value" \ + "mln_vset(T)=typename T::vset" \ "mln_rvalue(T)=typename T::rvalue" \ "mln_lvalue(T)=typename T::lvalue" \ "mln_coord(T)=typename T::coord" \ Index: mln/debug/iota.hh --- mln/debug/iota.hh (revision 1025) +++ mln/debug/iota.hh (working copy) @@ -49,6 +49,9 @@ # ifndef MLN_INCLUDE_ONLY + namespace impl + { + template <typename I> void iota(Image<I>& input_) { @@ -59,6 +62,26 @@ input(p) = ++i; } + template <typename I> + void iota(Fast_Image<I>& input_) + { + unsigned i = 0; + I& input = exact(input_); + mln_pixter(I) p(input); + for_all(p) + *p = ++i; + } + + } // end of namespace mln::debug::impl + + + template <typename I> + void iota(Image<I>& input) + { + mln_precondition(exact(input).has_data()); + impl::iota(exact(input)); + } + # endif // ! MLN_INCLUDE_ONLY } // end of namespace mln::debug Index: mln/fun/pw_value.hh --- mln/fun/pw_value.hh (revision 1025) +++ mln/fun/pw_value.hh (working copy) @@ -63,11 +63,11 @@ { template <typename K, typename E> - struct function_ : Function_p2v<E> + struct select_function_ : Function_p2v<E> {}; template <typename E> - struct function_< value::binary_kind, E > : Function_p2b<E> + struct select_function_< value::binary_kind, E > : Function_p2b<E> {}; } // end of namespace mln::fun::internal @@ -76,7 +76,7 @@ // FIXME: Doc! template <typename I> - struct pw_value : public internal::function_< mln_kind(I), pw_value<I> > + struct pw_value : public internal::select_function_< mln_value_kind(I), pw_value<I> > { typedef mln_value(I) result; pw_value(const I& ima); Index: mln/core/macros.hh --- mln/core/macros.hh (revision 1025) +++ mln/core/macros.hh (working copy) @@ -105,14 +105,14 @@ // p -/// Shortcut to access the piter type associated to T. +/// Shortcut to access the type of point iterator (piter) associated to T. # define mln_piter(T) typename T::fwd_piter # define mln_piter_(T) T::fwd_piter -/// Shortcut to access the pset type associated to T. +/// Shortcut to access the type of point set (pset) associated to T. # define mln_pset(T) typename T::pset -/// Shortcut to access the psite type associated to T. +/// Shortcut to access the type of point site (psite) associated to T. # define mln_psite(T) typename T::psite /// Shortcut to access the point type associated to T. @@ -145,6 +145,12 @@ /// Shortcut to access the value type associated to T. # define mln_value(T) typename T::value +/// Shortcut to the kind of values for an image with type \c I. +# define mln_value_kind(T) typename mln::value::props< mln_value(I) >::kind + +/// Shortcut to access the type of value set (vset) associated to T. +# define mln_vset(T) typename T::vset + /// Shortcut to access the viter type associated to T. # define mln_viter(T) typename T::fwd_viter Index: mln/core/trait/is_fast.hh --- mln/core/trait/is_fast.hh (revision 0) +++ mln/core/trait/is_fast.hh (revision 0) @@ -0,0 +1,60 @@ +// 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_CORE_TRAIT_IS_FAST_HH +# define MLN_CORE_TRAIT_IS_FAST_HH + +/*! \file mln/core/trait/is_fast.hh + * + * \brief Definition of the is_fast image trait. + */ + +# include <mln/metal/bool.hh> + + +namespace mln +{ + + namespace trait + { + + + // FIXME: Doc! + + template <typename I> + struct is_fast + { + typedef metal::false_ ret; + }; + + + } // end of namespace mln::trait + +} // end of namespace mln + + +#endif // ! MLN_CORE_TRAIT_IS_FAST_HH Index: mln/core/trait/all.hh --- mln/core/trait/all.hh (revision 0) +++ mln/core/trait/all.hh (revision 0) @@ -0,0 +1,52 @@ +// 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_CORE_TRAIT_ALL_HH +# define MLN_CORE_TRAIT_ALL_HH + +/*! \file mln/core/trait/all.hh + * + * \brief File that includes all traits. + */ + + +namespace mln +{ + + /*! Namespace for image traits. + */ + namespace trait {} + +} + + +# include <mln/core/trait/is_fast.hh> +# include <mln/core/trait/is_lowq.hh> +# include <mln/core/trait/pixter.hh> + + +#endif // ! MLN_CORE_TRAIT_ALL_HH Index: mln/core/trait/pixter.hh --- mln/core/trait/pixter.hh (revision 1025) +++ mln/core/trait/pixter.hh (working copy) @@ -57,11 +57,6 @@ typedef metal::none ret; }; - template <typename I> - struct pixter : fwd_pixter<I> - { - }; - // qixter @@ -77,11 +72,6 @@ typedef metal::none ret; }; - template <typename I, typename W> - struct qixter : fwd_qixter<I, W> - { - }; - // nixter @@ -97,11 +87,6 @@ typedef metal::none ret; }; - template <typename I, typename N> - struct nixter : fwd_nixter<I, N> - { - }; - } // end of namespace mln::trait Index: mln/core/trait/is_lowq.hh --- mln/core/trait/is_lowq.hh (revision 0) +++ mln/core/trait/is_lowq.hh (revision 0) @@ -0,0 +1,65 @@ +// 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_CORE_TRAIT_IS_LOWQ_HH +# define MLN_CORE_TRAIT_IS_LOWQ_HH + +/*! \file mln/core/trait/is_lowq.hh + * + * \brief Definition of the is_lowq image trait. + */ + +# include <mln/metal/bool.hh> +# include <mln/value/props.hh> + + +# define mln_is_lowq(I) typename mln::trait::is_lowq< I >::ret + + + +namespace mln +{ + + namespace trait + { + + + // FIXME: Doc! + + template <typename I> + struct is_lowq + { + typedef typename metal::bool_<( mln_card(mln_value(I)) != 0 )>::type ret; + }; + + + } // end of namespace mln::trait + +} // end of namespace mln + + +#endif // ! MLN_CORE_TRAIT_IS_LOWQ_HH Index: mln/core/internal/image_base.hh --- mln/core/internal/image_base.hh (revision 1025) +++ mln/core/internal/image_base.hh (working copy) @@ -42,12 +42,30 @@ namespace internal { + + + template <typename Is_fast, typename E> + struct select_image_concept_; + + template <typename E> + struct select_image_concept_< metal::true_, E > + : public Fast_Image<E> + {}; + + template <typename E> + struct select_image_concept_< metal::false_, E > + : public Image<E> + {}; + + + /*! \brief A base class for images. * * \internal */ template <typename S, typename E> - struct image_base_ : public Image<E> + struct image_base_ : public select_image_concept_< typename trait::is_fast<E>::ret, + E > { /// Point_Set associated type. typedef S pset; Index: mln/core/concept/image.hh --- mln/core/concept/image.hh (revision 1025) +++ mln/core/concept/image.hh (working copy) @@ -33,6 +33,7 @@ */ # include <mln/core/concept/point_set.hh> +# include <mln/core/trait/all.hh> namespace mln @@ -52,8 +53,10 @@ typedef value; typedef rvalue; typedef lvalue; + typedef vset; bool has_data() const; + const vset& values() const; bool owns_(const psite& p) const; const pset& domain() const; @@ -138,4 +141,7 @@ } // end of namespace mln +# include <mln/core/concept/fast_image.hh> + + #endif // ! MLN_CORE_CONCEPT_IMAGE_HH Index: mln/core/concept/value_set.hh --- mln/core/concept/value_set.hh (revision 1025) +++ mln/core/concept/value_set.hh (working copy) @@ -48,7 +48,6 @@ { /* typedef value; - typedef viter; typedef fwd_viter; typedef bkd_viter; @@ -71,7 +70,6 @@ Value_Set<E>::Value_Set() { typedef mln_value(E) value; - typedef mln_viter(E) viter; typedef mln_fwd_viter(E) fwd_viter; typedef mln_bkd_viter(E) bkd_viter; Index: mln/core/concept/fast_image.hh --- mln/core/concept/fast_image.hh (revision 1025) +++ mln/core/concept/fast_image.hh (working copy) @@ -33,7 +33,6 @@ */ # include <mln/core/concept/image.hh> -# include <mln/core/trait/pixter.hh> namespace mln @@ -55,6 +54,9 @@ point point_at_offset(unsigned o) const; const value* buffer() const; + + rvalue operator[](unsigned o) const; + lvalue operator[](unsigned o); */ protected: @@ -69,7 +71,6 @@ { typedef mln_point(E) point; typedef mln_dpoint(E) dpoint; - typedef mln_value(E) value; typedef mln_fwd_pixter(E) fwd_pixter; typedef mln_bkd_pixter(E) bkd_pixter; @@ -80,11 +81,22 @@ m2 = 0; point (E::*m3)(unsigned) const = & E::point_at_offset; m3 = 0; - const value* (E::*m4)() const = & E::buffer; + unsigned (E::*m4)() const = & E::border; m4 = 0; - unsigned (E::*m5)() const = & E::border; + + typedef mln_value(E) value; + + const value* (E::*m5)() const = & E::buffer; m5 = 0; + typedef mln_rvalue(E) rvalue; + typedef mln_lvalue(E) lvalue; + + rvalue (E::*m6)(unsigned) const = & E::operator[]; + m6 = 0; + lvalue (E::*m7)(unsigned) = & E::operator[]; + m7 = 0; + // FIXME: how to check that qixter are defined when W is unknown! } Index: mln/core/concept/doc/image.hh --- mln/core/concept/doc/image.hh (revision 1025) +++ mln/core/concept/doc/image.hh (working copy) @@ -56,6 +56,11 @@ */ typedef void lvalue; + /*! \brief Value set associated type. + * \invariant This type has to derive from mln::Value_Set. + */ + typedef void vset; + /*! \brief Test if the image have been initialized. */ bool has_data() const; @@ -73,13 +78,19 @@ */ const pset& domain() const; - /*! \brief Read access to the image value located at \p p. + /*! \brief Give the set of values of the image. + * + * \return A reference to the value set. + */ + const vset& values() const; + + /*! \brief Read-only access to the image value located at \p p. * * \param[in] p A point site. * * \pre The image has to own the site \p p. * - * \return The value at \p p. + * \return The value at \p p (not assignable). */ rvalue operator()(const psite& p) const; @@ -89,7 +100,7 @@ * * \pre The image has to own the site \p p. * - * \return The value at \p p. + * \return The value at \p p (assignable). */ lvalue operator()(const psite& p); Index: mln/core/concept/doc/value_set.hh --- mln/core/concept/doc/value_set.hh (revision 1025) +++ mln/core/concept/doc/value_set.hh (working copy) @@ -46,10 +46,6 @@ */ typedef void value; - /*! \brief Viter associated type. - */ - typedef void viter; - /*! \brief Forward Viter associated type. */ typedef void fwd_viter; Index: mln/core/concept/doc/fast_image.hh --- mln/core/concept/doc/fast_image.hh (revision 1025) +++ mln/core/concept/doc/fast_image.hh (working copy) @@ -51,7 +51,7 @@ /*! \brief Give the offset corresponding to the delta-point \p * dp. * - * \param[in] p A delta-point. + * \param[in] dp A delta-point. * * \pre The image has to be initialized. */ @@ -69,7 +69,7 @@ /*! \brief Give the point at offset \p o. * - * \param[in] p An offset. + * \param[in] o An offset. * * \pre The image has to be initialized. * \pre o < ncells() @@ -85,6 +85,27 @@ */ const value* buffer() const; + /*! \brief Read-only access to the image value at offset \p o. + * + * \param[in] o An offset. + * + * \pre o < ncells() + * + * \return The value at \p o (not assignable). + */ + rvalue operator[](unsigned o) const; + + + /*! \brief Read-write access to the image value at offset \p o. + * + * \param[in] o An offset. + * + * \pre o < ncells() + * + * \return The value at \p o (assignable). + */ + lvalue operator[](unsigned o); + }; } // end of namespace mln::doc Index: mln/core/tags.hh --- mln/core/tags.hh (revision 1025) +++ mln/core/tags.hh (working copy) @@ -42,6 +42,7 @@ // FIXME: ... + } // end of namespace mln::core } // end of namespace mln Index: mln/core/image2d_b.hh --- mln/core/image2d_b.hh (revision 1025) +++ mln/core/image2d_b.hh (working copy) @@ -38,6 +38,7 @@ # include <mln/core/box2d.hh> # include <mln/border/thickness.hh> +# include <mln/value/set.hh> # include <mln/fun/all.hh> @@ -50,6 +51,23 @@ namespace mln { + // Fwd decl. + template <typename T> struct image2d_b; + + + namespace trait + { + + template <typename T> + struct is_fast< image2d_b<T> > + { + typedef metal::true_ ret; + }; + + } // end of mln::trait + + + /*! \brief Basic 2D image class. * * The parameter \c T is the type of pixel values. This image class @@ -71,6 +89,7 @@ // end of warning + // FIXME: // /// Forward pixel iterator associated to image2d @@ -99,6 +118,9 @@ typedef image2d_b<U> ret; }; + /// Value_Set associated type. + typedef mln::value::set_<T> vset; + /// Constructor without argument. image2d_b(); @@ -134,6 +156,9 @@ /// Test if this image has been initialized. bool has_data() const; + /// Give the set of values of the image. + const vset& values() const; + /// Give the definition domain. const box2d& domain() const; @@ -143,12 +168,18 @@ /// Give the number of cells (points including border ones). std::size_t ncells() const; - /// Read-only access to the image value located at \p p. + /// Read-only access to the image value located at point \p p. const T& operator()(const point2d& p) const; - /// Read-write access to the image value located at \p p. + /// Read-write access to the image value located at point \p p. T& operator()(const point2d& p); + /// Read-only access to the image value located at offset \p o. + const T& operator[](unsigned o) const; + + /// Read-write access to the image value located at offset \p o. + T& operator[](unsigned o); + /// Read-only access to the image value located at (\p row, \p col). const T& at(int row, int col) const; @@ -279,6 +310,13 @@ } template <typename T> + const typename image2d_b<T>::vset& + image2d_b<T>::values() const + { + return vset::the(); + } + + template <typename T> const box2d& image2d_b<T>::domain() const { @@ -328,6 +366,22 @@ template <typename T> const T& + image2d_b<T>::operator[](unsigned o) const + { + mln_precondition(o < ncells()); + return *(buffer_ + o); + } + + template <typename T> + T& + image2d_b<T>::operator[](unsigned o) + { + mln_precondition(o < ncells()); + return *(buffer_ + o); + } + + template <typename T> + const T& image2d_b<T>::at(int row, int col) const { mln_precondition(this->owns_(make::point2d(row, col))); @@ -380,7 +434,6 @@ image2d_b<T>::point_at_offset(unsigned o) const { mln_precondition(o < ncells()); - mln_precondition(this->has_data()); point2d p = make::point2d(o / vb_.len(1) + vb_.min_row(), o % vb_.len(1) + vb_.min_col()); mln_postcondition(& this->operator()(p) = this->buffer_ + o); @@ -462,6 +515,12 @@ }; template <typename T> + struct fwd_pixter< const image2d_b<T> > + { + typedef fwd_pixter2d_b< const image2d_b<T> > ret; + }; + + template <typename T> struct bkd_pixter< image2d_b<T> > { typedef internal::fixme ret; Index: mln/metal/math.hh --- mln/metal/math.hh (revision 0) +++ mln/metal/math.hh (revision 0) @@ -0,0 +1,63 @@ +// 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_METAL_MATH_HH +# define MLN_METAL_MATH_HH + +/*! \file mln/metal/math.hh + * + * \brief Definition of some mathematical static functions. + */ + + +namespace mln +{ + + namespace metal + { + + // pow<x, n> + + template <int x, unsigned n> + struct pow + { + enum { value = x * pow<x, n-1>::value }; + }; + + template <int x> + struct pow< x, 0 > + { + enum { value = 1 }; + }; + + + } // end of namespace mln::metal + +} // end of namespace mln + + +#endif // ! MLN_METAL_MATH_HH Index: mln/metal/bool.hh --- mln/metal/bool.hh (revision 0) +++ mln/metal/bool.hh (revision 0) @@ -0,0 +1,76 @@ +// 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_METAL_BOOL_HH +# define MLN_METAL_BOOL_HH + +/*! \file mln/metal/bool.hh + * + * \brief Definition of a Boolean value type. + */ + + +namespace mln +{ + + namespace metal + { + + // Fwd decls. + struct true_; + struct false_; + + + + // FIXME: Doc! + + template <bool b> struct bool_; + + template <> + struct bool_< true > + { + typedef true_ type; + static const bool value = true; + }; + + template <> + struct bool_< false > + { + typedef false_ type; + static const bool value = false; + }; + + + } // end of namespace mln::metal + +} // end of namespace mln + + +# include <mln/metal/bexpr.hh> + + +#endif // ! MLN_METAL_BOOL_HH Index: mln/metal/none.hh --- mln/metal/none.hh (revision 1025) +++ mln/metal/none.hh (working copy) @@ -28,7 +28,7 @@ #ifndef MLN_CORE_METAL_NONE_HH # define MLN_CORE_METAL_NONE_HH -/*! \file mln/core/metal/none.hh +/*! \file mln/metal/none.hh * * \brief Definition of a type that means "none". */ Index: mln/metal/bexpr.hh --- mln/metal/bexpr.hh (revision 0) +++ mln/metal/bexpr.hh (revision 0) @@ -0,0 +1,102 @@ +// 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_METAL_BEXPR_HH +# define MLN_METAL_BEXPR_HH + +/*! \file mln/metal/bexpr.hh + * + * \brief Definition of types for static Boolean expressions. + */ + +# include <mln/metal/bool.hh> + + + +namespace mln +{ + + namespace metal + { + + + /// "true" type. + struct true_ + { + static void check(); + typedef true_ eval; + enum { to_bool = true }; + }; + + + /// "false" type. + struct false_ + { + typedef false_ eval; + enum { to_bool = false }; + }; + + + /// Negate type. + template <typename B> + struct not_ : bool_<( ! B::to_bool )>::type + {}; + + + /// And type. + template <typename L, typename R> + struct and_ : bool_<( L::to_bool && R::to_bool )>::type + {}; + + + /// Or type. + template <typename L, typename R> + struct or_ : bool_<( L::to_bool || R::to_bool )>::type + {}; + + + /// Xor type. + template <typename L, typename R> + struct xor_ : bool_<( L::to_bool ^ R::to_bool )>::type + {}; + + + +# ifndef MLN_INCLUDE_ONLY + + void true_::check() + { + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::metal + +} // end of namespace mln + + +#endif // ! MLN_METAL_BOOL_HH Index: mln/morpho/erosion.hh --- mln/morpho/erosion.hh (revision 1025) +++ mln/morpho/erosion.hh (working copy) @@ -132,7 +132,7 @@ template <typename I, typename W, typename O> 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); + erosion_wrt_value(mln_value_kind(I)(), exact(input), exact(win), output); // | // --> call stage 2: dispatch w.r.t. the value kind } Index: mln/level/fill.hh --- mln/level/fill.hh (revision 1025) +++ mln/level/fill.hh (working copy) @@ -33,6 +33,8 @@ * \brief Fill an image, that is, set pixel values. */ +# include <cstring> + # include <mln/core/concept/image.hh> # include <mln/core/concept/function.hh> @@ -49,6 +51,8 @@ * \param[in] v The value to assign to all pixels. * * \pre \p ima has to be initialized. + * + * \todo Optimize when \p ima is large and sizeof(mln_value(I)) > 1. */ template <typename I> void fill(Image<I>& ima, const mln_value(I)& v); @@ -60,6 +64,8 @@ * \param[in] f The function. * * \pre \p ima has to be initialized. + * + * \todo Take benefit from quantization when possible. */ template <typename I, typename F> void fill(Image<I>& ima, const Function_p2v<F>& f); @@ -74,6 +80,8 @@ * " value f(const point& p) " * * \pre \p ima has to be initialized. + * + * \todo Take benefit from quantization when possible. */ template <typename I> void fill(Image<I>& ima, mln_value(I) (*f)(const mln_point(I)& p)); @@ -103,28 +111,70 @@ * the one of \p data. * * \pre \p ima.domain <= \p data.domain. + * + * \todo Use memcpy when possible. */ template <typename I, typename J> void fill(Image<I>& ima, const Image<J>& data); + # ifndef MLN_INCLUDE_ONLY + namespace impl + { + + + // fill_with_value + template <typename I> - void fill(Image<I>& ima_, - const mln_value(I)& value) + void fill_with_value(Image<I>& ima_, const mln_value(I)& value, + bool force_call = false) { + force_call = false; // just to avoid warning ("unused param") I& ima = exact(ima_); - mln_precondition(ima.has_data()); mln_piter(I) p(ima.domain()); for_all(p) ima(p) = value; } + template <typename I> + void fill_with_value(Fast_Image<I>& ima_, const mln_value(I)& value) + { + I& ima = exact(ima_); + if (sizeof(mln_value(I)) = 1) + { + std::memset((void*)(ima.buffer()), + value, + sizeof(mln_value(I)) * ima.ncells()); + } + else + { + // FIXME: Use memcpy on a chunck when image size is large! + fill_with_value(ima, value, true); + } + } + + + } // end of namespace mln::level::impl + + + + // with: value + + template <typename I> + void fill(Image<I>& ima, const mln_value(I)& value) + { + mln_precondition(exact(ima).has_data()); + impl::fill_with_value(exact(ima), value); + } + + + // with: Function_p2v<F> + template <typename I, typename F> - void fill(Image<I>& ima_, - const Function_p2v<F>& f_) + void fill(Image<I>& ima_, const Function_p2v<F>& f_) { I& ima = exact(ima_); mln_precondition(ima.has_data()); @@ -134,6 +184,9 @@ ima(p) = f(p); } + + // with: value f(const point&) + template <typename I> void fill(Image<I>& ima_, mln_value(I) (*f)(const mln_point(I)& p)) @@ -145,9 +198,11 @@ ima(p) = f(p); } + + // with: value arr[N] + template <typename I, unsigned N> - void fill(Image<I>& ima_, - mln_value(I) (&arr)[N]) + void fill(Image<I>& ima_, mln_value(I) (&arr)[N]) { I& ima = exact(ima_); mln_precondition(ima.has_data()); @@ -158,9 +213,11 @@ ima(p) = arr[i++]; } + + // with: Image<J> + template <typename I, typename J> - void fill(Image<I>& ima_, - const Image<J>& data_) + void fill(Image<I>& ima_, const Image<J>& data_) { I& ima = exact(ima_); const J& data = exact(data_); Index: mln/level/fast_median.hh --- mln/level/fast_median.hh (revision 1025) +++ mln/level/fast_median.hh (working copy) @@ -28,7 +28,7 @@ #ifndef MLN_LEVEL_FAST_MEDIAN_HH # define MLN_LEVEL_FAST_MEDIAN_HH -/*! \file mln/level/median.hh +/*! \file mln/level/fast_median.hh * * \brief Fast Median filtering of an image. */ Index: mln/level/transform.hh --- mln/level/transform.hh (revision 1025) +++ mln/level/transform.hh (working copy) @@ -36,6 +36,9 @@ # include <mln/core/concept/image.hh> # include <mln/core/concept/function.hh> +# include <mln/value/set.hh> +# include <mln/value/lut_vec.hh> + namespace mln { @@ -61,20 +64,67 @@ # ifndef MLN_INCLUDE_ONLY + namespace impl + { + template <typename I, typename F, typename O> - void transform(const Image<I>& input_, const Function_v2v<F>& f_, Image<O>& output_) + void transform(metal::false_, // general case + const Image<I>& input_, const Function_v2v<F>& f_, Image<O>& output_) { const I& input = exact(input_); const F& f = exact(f_); O& output = exact(output_); - mln_precondition(output.domain() >= input.domain()); - mln_piter(I) p(input.domain()); for_all(p) output(p) = f( input(p) ); } + template <typename I, typename F, typename O> + void transform(metal::true_, // low quantization + const Image<I>& input_, const Function_v2v<F>& f_, Image<O>& output_) + { + const I& input = exact(input_); + const F& f = exact(f_); + O& output = exact(output_); + + value::lut_vec<mln_vset(I), mln_result(F)> lut(input.values(), f); + mln_piter(I) p(input.domain()); + for_all(p) + output(p) = lut(input(p)); + } + +// template <typename I, typename F, typename O> +// void transform(metal::true_, // low quantization +// const Fast_Image<I>& input_, const Function_v2v<F>& f_, Image<O>& output_) +// { +// const I& input = exact(input_); +// const F& f = exact(f_); +// O& output = exact(output_); + +// value::lut_vec<mln_vset(I), mln_result(F)> lut(input.values(), f); +// mln_pixter(const I) pi(input); // FIXME +// mln_pixter(O) po(output); +// po.start(); +// for_all(pi) +// { +// *po = lut(*pi); +// po.next(); +// } +// } + + } // end of namespace mln::level::impl + + + template <typename I, typename F, typename O> + void transform(const Image<I>& input, const Function_v2v<F>& f, Image<O>& output) + { + mln_precondition(exact(output).domain() >= exact(input).domain()); + impl::transform(mln_is_lowq(I)(), + exact(input), exact(f), exact(output)); + } + + # endif // ! MLN_INCLUDE_ONLY } // end of namespace mln::level Index: mln/value/lut_vec.hh --- mln/value/lut_vec.hh (revision 0) +++ mln/value/lut_vec.hh (revision 0) @@ -0,0 +1,165 @@ +// 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_VALUE_LUT_VEC_HH +# define MLN_VALUE_LUT_VEC_HH + +/*! \file mln/value/lut_vec.hh + * + * \brief Define some basic lut_vecs of values from value types. + */ + +# include <vector> + +# include <mln/core/concept/value_set.hh> +# include <mln/core/concept/function.hh> +# include <mln/value/props.hh> + + +namespace mln +{ + + namespace value + { + + // Fwd decls. + template <typename S> struct fwd_viter_; + template <typename S> struct bkd_viter_; + + + /*! Class that defines FIXME + * + * \warning This is a multi-set!!! + * FIXME + * + */ + template <typename S, typename T> + struct lut_vec : public Value_Set< lut_vec<S,T> > + { + /// Value associated type. + typedef T value; + + /// Forward Viter associated type. + typedef fwd_viter_< lut_vec<S,T> > fwd_viter; + + /// Backward Viter associated type. + typedef bkd_viter_< lut_vec<S,T> > bkd_viter; + + /// Give the \p i-th value. + T operator[](std::size_t i) const; + + /// Give the number of values. + std::size_t nvalues() const; + + // Apply the look-up-table. FIXME: Doc! + T operator()(const mln_value(S)& val) const; + + /// Test if \p v belongs to this set. + bool has(const value& v) const; + + /// Give the index of value \p v in this set. + std::size_t index_of(const value& v) const; + + /// Ctor. FIXME! + template <typename F> + lut_vec(const S& vset, const Function_v2v<F>& f); + + protected: + + const S& vset_; + std::vector<T> vec_; + unsigned n_; + }; + + + +# ifndef MLN_INCLUDE_ONLY + + template <typename S, typename T> + bool + lut_vec<S,T>::has(const T&) const + { + mln_invariant(0); // FIXME + return false; + } + + template <typename S, typename T> + std::size_t + lut_vec<S,T>::index_of(const T& v) const + { + mln_invariant(0); // FIXME + return 0; + } + + template <typename S, typename T> + template <typename F> + lut_vec<S,T>::lut_vec(const S& vset, const Function_v2v<F>& f) + : vset_(vset) + { + const F& f_ = exact(f); + n_ = vset.nvalues(); + vec_.reserve(n_); + for (unsigned i = 0; i < n_; ++i) + vec_[i] = f_(vset[i]); + } + + template <typename S, typename T> + T + lut_vec<S,T>::operator()(const mln_value(S)& val) const + { + unsigned i = vset_.index_of(val); + mln_precondition(i < n_); + return vec_[vset_.index_of(val)]; + } + + template <typename S, typename T> + T + lut_vec<S,T>::operator[](std::size_t i) const + { + mln_precondition(i < nvalues()); + return vec_[i]; + } + + template <typename S, typename T> + std::size_t + lut_vec<S,T>::nvalues() const + { + return vec_.size(); + } + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::value + + +} // end of namespace mln + + +# include <mln/value/viter.hh> + + +#endif // ! MLN_VALUE_LUT_VEC_HH Index: mln/value/props.hh --- mln/value/props.hh (revision 1025) +++ mln/value/props.hh (working copy) @@ -41,19 +41,19 @@ /// Get the minimum value of type \c T. -# define mln_min(T) mln::value::props<T>::min() +# define mln_min(T) mln::value::props< T >::min /// Get the maximum value of type \c T. -# define mln_max(T) mln::value::props<T>::max() +# define mln_max(T) mln::value::props< T >::max /// Get the number of values for value type \c T. -# define mln_card(T) mln::value::props<T>::card() +# define mln_card(T) mln::value::props< T >::card -/// Get the kind of the value type of image \c I. -# define mln_kind(I) typename mln::value::props< mln_value(I) >::kind +/// Get the kind of value type \c T. +# define mln_kind(T) typename mln::value::props< T >::kind @@ -71,119 +71,124 @@ struct props { /// Minimum value for type \c T. - static T min(); + static const T min; /// Maximum value for type \c T. - static T max(); + static const T max; /// Number of values for type \c T. - static std::size_t card(); + static const std::size_t card; }; -# ifndef MLN_INCLUDE_ONLY + + // bool template <> struct props<bool> { - static bool min() { return false; } - static bool max() { return true; } - static std::size_t card() { return 2; } + static const bool min = false; + static const bool max = true; + static const std::size_t card = 2; typedef binary_kind kind; }; + // integers template <> struct props<unsigned char> { - static unsigned char min() { return 0; } - static unsigned char max() { return 255; } - static std::size_t card() { return 256; } + static const unsigned char min = 0; + static const unsigned char max = 255; + static const std::size_t card = 256; typedef data_kind kind; }; template <> struct props<signed char> { - static signed char min() { return -128; } - static signed char max() { return 127; } - static std::size_t card() { return 256; } + static const signed char min = -128; + static const signed char max = 127; + static const std::size_t card = 256; typedef data_kind kind; }; template <> struct props<unsigned short> { - static unsigned short min() { return 0; } - static unsigned short max() { return 65535; } - static std::size_t card() { return 65536; } + static const unsigned short min = 0; + static const unsigned short max = 65535; + static const std::size_t card = 65536; typedef data_kind kind; }; template <> struct props<signed short> { - static signed short min() { return -32768; } - static signed short max() { return 32767; } - static std::size_t card() { return 655356; } + static const signed short min = -32768; + static const signed short max = 32767; + static const std::size_t card = 655356; typedef data_kind kind; }; template <> struct props<unsigned int> { - static unsigned int min() { return 0; } - static unsigned int max() { return UINT_MAX; } - static std::size_t card() { return std::size_t(UINT_MAX) + 1; } + static const unsigned int min = 0; + static const unsigned int max = UINT_MAX; typedef data_kind kind; + static const std::size_t card = 0; }; template <> struct props<signed int> { - static signed int min() { return INT_MIN; } - static signed int max() { return INT_MAX; } - static std::size_t card() { return std::size_t(UINT_MAX) + 1; } + static const signed int min = INT_MIN; + static const signed int max = INT_MAX; typedef data_kind kind; + static const std::size_t card = 0; }; template <> struct props<unsigned long int> { - static unsigned long int min() { return 0; } - static unsigned long int max() { return ULONG_MAX; } + static const unsigned long int min = 0; + static const unsigned long int max = ULONG_MAX; typedef data_kind kind; + static const std::size_t card = 0; }; template <> struct props<signed long int> { - static signed long int min() { return LONG_MIN; } - static signed long int max() { return LONG_MAX; } + static const signed long int min = LONG_MIN; + static const signed long int max = LONG_MAX; typedef data_kind kind; + static const std::size_t card = 0; }; + // floating template <> struct props<float> { - static float min() { return FLT_MIN; } - static float max() { return FLT_MAX; } + static const float min() { return FLT_MIN; } + static const float max() { return FLT_MAX; } typedef data_kind kind; + static const std::size_t card = 0; }; template <> struct props<double> { - static double min() { return DBL_MIN; } - static double max() { return DBL_MAX; } + static const double min() { return DBL_MIN; } + static const double max() { return DBL_MAX; } typedef data_kind kind; + static const std::size_t card = 0; }; -# endif // ! MLN_INCLUDE_ONLY - } // end of namespace mln::value } // end of namespace mln Index: mln/value/kind.hh --- mln/value/kind.hh (revision 1025) +++ mln/value/kind.hh (working copy) @@ -28,7 +28,7 @@ #ifndef MLN_VALUE_KIND_HH # define MLN_VALUE_KIND_HH -/*! \file mln/value/tags.hh +/*! \file mln/value/kind.hh * * \brief Define the set of kinds of value. */ Index: mln/value/set.hh --- mln/value/set.hh (revision 1025) +++ mln/value/set.hh (working copy) @@ -64,9 +64,6 @@ /// Backward Viter associated type. typedef bkd_viter_< set_<T> > bkd_viter; - /// Viter associated type. - typedef fwd_viter viter; - /// Test if \p v belongs to this set: always true! bool has(const T& v) const; @@ -129,14 +126,6 @@ } // end of namespace mln::value - - // FIXME: Turn definitions into objects! - typedef value::set_<bool> Booleans; - typedef value::set_<int> integers; - typedef value::set_<unsigned> naturals; - - - } // end of namespace mln Index: mln/value/int_u.hh --- mln/value/int_u.hh (revision 1025) +++ mln/value/int_u.hh (working copy) @@ -34,6 +34,7 @@ */ # include <mln/core/concept/value.hh> +# include <mln/metal/math.hh> # include <mln/value/internal/value_like.hh> # include <mln/value/props.hh> @@ -83,6 +84,8 @@ template <unsigned n> struct props< int_u_<n> > : public props< typename internal::encoding_<n>::ret > { + static const unsigned nbits = n; + static const std::size_t card = metal::pow<2, n>::value; };