https://svn.lrde.epita.fr/svn/oln/trunk/milena
Index: ChangeLog
from Thierry Geraud <thierry.geraud(a)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;
};