https://svn.lrde.epita.fr/svn/oln/trunk/olena
Index: ChangeLog
from Roland Levillain <roland(a)lrde.epita.fr>
Add a specialization of level::fill for value-wise random-accessible
images.
* tests/morphers/with_lut.cc (main): More static checking of
the interface of an image with LUT.
Test oln::level::fill on an image with LUT.
* oln/level/fill.hh
(level::fill(abstract::
mutable_image_being_value_wise_random_accessible<I>&))
(level::impl::
fill(abstract::mutable_image_being_value_wise_random_accessible<I>&)):
New.
* oln/core/typedefs.hh (oln_fwd_viter, oln_fwd_viter_)
(oln_bkd_viter, oln_bkd_viter_, oln_viter, oln_viter_): New macros.
* oln/core/gen/bkd_viter_lut.hh
(bkd_viter_lut::bkd_viter_lut(const morpher::with_lut<Image, Lut>&))
* oln/core/gen/fwd_viter_lut.hh
(fwd_viter_lut::fwd_viter_lut(const morpher::with_lut<Image, Lut>&))
New ctors.
oln/core/gen/bkd_viter_lut.hh | 19 ++++++++++++++++++-
oln/core/gen/fwd_viter_lut.hh | 21 +++++++++++++++++++--
oln/core/typedefs.hh | 14 +++++++++++++-
oln/level/fill.hh | 26 ++++++++++++++++++++++++++
tests/morphers/with_lut.cc | 24 +++++++++++++++++-------
5 files changed, 93 insertions(+), 11 deletions(-)
Index: tests/morphers/with_lut.cc
--- tests/morphers/with_lut.cc (revision 708)
+++ tests/morphers/with_lut.cc (working copy)
@@ -114,7 +114,16 @@
add(1, white).
add(2, c);
+ // Type of our image with look-up table.
typedef oln::morpher::with_lut<image_t, lut_t> image_with_lut_t;
+ // Interface check.
+ mlc::assert_<
+ mlc_is_not_a_(image_with_lut_t, oln::abstract::mutable_image)
+ >::check();
+ mlc::assert_<
+ mlc_is_a_(image_with_lut_t,
+ oln::abstract::mutable_image_being_value_wise_random_accessible)
+ >::check();
// FIXME: ``ima + lut'' doesn't work. Maybe a `using' statement is
// required.
image_with_lut_t ima_with_lut(ima, lut);
@@ -149,14 +158,14 @@
// Check fwd_viter_lut.
- oln_type_of_(image_with_lut_t, fwd_viter) fv(ima_with_lut.lut());
+ oln_fwd_viter_(image_with_lut_t) fv(ima_with_lut);
std::list<rgb8> fwd_values;
std::cout << "values of lut (fwd) =" << std::endl;
// Push the values to the *back* of the list.
for_all (fv)
fwd_values.push_back(fv);
// Check bkd_viter_lut.
- oln_type_of_(image_with_lut_t, bkd_viter) bv(ima_with_lut.lut());
+ oln_bkd_viter_(image_with_lut_t) bv(ima_with_lut);
std::list<rgb8> bkd_values;
std::cout << "values of lut (bkd) =" << std::endl;
// Push the values to the *front* of the list (i.e., in reverse order).
@@ -166,9 +175,10 @@
assert (fwd_values == bkd_values);
- // FIXME: To be enabled later, when oln::level::fill is specialized
- // for abstract::mutable_image_being_value_wise_random_accessible.
-#if 0
- oln::level::apply(ima_with_lut, fun); // 3 ops only !!!
-#endif
+ // Test level::fill.
+ oln::debug::print(ima_with_lut);
+ std::cout << std::endl << std::endl;
+ // Three ops only!
+ oln::level::fill(ima_with_lut, blue);
+ oln::debug::print(ima_with_lut);
}
Index: oln/level/fill.hh
--- oln/level/fill.hh (revision 708)
+++ oln/level/fill.hh (working copy)
@@ -32,6 +32,7 @@
# include <iostream>
# include <oln/core/abstract/image.hh>
+# include <oln/core/abstract/image/value_wise_accessibility/hierarchy.hh>
# include <oln/core/abstract/iterator.hh>
# include <oln/core/abstract/functions.hh>
@@ -73,6 +74,11 @@
template <typename I, typename F>
void fill(abstract::mutable_image<I>& input, const
abstract::fun_p2v<F>& fun);
+ /// Fwd decl.
+ template <typename I>
+ void fill(abstract::mutable_image_being_value_wise_random_accessible<I>&
input,
+ const oln_value(I)& value);
+
# ifndef OLN_INCLUDE_ONLY
@@ -117,6 +123,18 @@
input(p) = fun.exact()(p);
}
+ /// Version specialized for mutable images being value-wise
+ /// random accessible.
+ template <typename I>
+ void fill(abstract::mutable_image_being_value_wise_random_accessible<I>&
input,
+ const oln_value(I)& value)
+ {
+ // FIXME: We should not need to call exact() here.
+ oln_viter(I) v(input.exact());
+ for_all(v)
+ input.value(v) = value;
+ }
+
} // end of namespace oln::level::impl
@@ -148,6 +166,14 @@
return impl::fill(input.exact(), fun);
}
+ /// Facade.
+ template <typename I>
+ void fill(abstract::mutable_image_being_value_wise_random_accessible<I>&
input,
+ const oln_value(I)& value)
+ {
+ return impl::fill(input.exact(), value);
+ }
+
# endif
} // end of namespace oln::level
Index: oln/core/typedefs.hh
--- oln/core/typedefs.hh (revision 708)
+++ oln/core/typedefs.hh (working copy)
@@ -167,8 +167,9 @@
+/// Shortcuts formed such as "oln_something(T) means
+/// oln_type_of(T, something)".
/// \{
-/// Shortcuts formed such as "oln_something(T) means oln_type_of(T,
something)".
# define oln_dim(T) oln_type_of(T, dim)
# define oln_dim_(T) oln_type_of_(T, dim)
@@ -227,6 +228,14 @@
# define oln_bkd_niter(T) oln_type_of(T, bkd_niter)
# define oln_bkd_niter_(T) oln_type_of_(T, bkd_niter)
+# define oln_fwd_viter(T) oln_type_of(T, fwd_viter)
+# define oln_fwd_viter_(T) oln_type_of_(T, fwd_viter)
+
+# define oln_bkd_viter(T) oln_type_of(T, bkd_viter)
+# define oln_bkd_viter_(T) oln_type_of_(T, bkd_viter)
+
+/// Even shorter shortcuts.
+/// \{
# define oln_piter(T) oln_type_of(T, fwd_piter)
# define oln_piter_(T) oln_type_of_(T, fwd_piter)
@@ -236,8 +245,11 @@
# define oln_niter(T) oln_type_of(T, fwd_niter)
# define oln_niter_(T) oln_type_of_(T, fwd_niter)
+# define oln_viter(T) oln_type_of(T, fwd_viter)
+# define oln_viter_(T) oln_type_of_(T, fwd_viter)
/// \}
+/// \}
// Fwd decls.
Index: oln/core/gen/bkd_viter_lut.hh
--- oln/core/gen/bkd_viter_lut.hh (revision 708)
+++ oln/core/gen/bkd_viter_lut.hh (working copy)
@@ -36,6 +36,9 @@
// Forward declaration.
template <typename Lut> class bkd_viter_lut;
+ namespace morpher {
+ template <typename Image, typename Lut> struct with_lut;
+ } // end of namespace oln::morpher
/// Super type declaration.
@@ -74,8 +77,11 @@
typedef oln_type_of(self_t, value) value_type;
public:
- // Construct an uninitialized value iterator.
+ /// Construct a backward value iterator from a look-up table (LUT).
bkd_viter_lut(const Lut& lut);
+ /// Construct a backward value iterator from an image having a LUT.
+ template <typename Image>
+ bkd_viter_lut(const morpher::with_lut<Image, Lut>& ima);
/// Iterator manipulators.
/// \{
@@ -116,6 +122,17 @@
this->invalidate();
}
+ template <typename Lut>
+ template <typename Image>
+ bkd_viter_lut<Lut>::bkd_viter_lut(const morpher::with_lut<Image, Lut>&
ima) :
+ super_t(),
+ lut_(ima.lut()),
+ i_()
+ {
+ // Initialize underlying iterator (i.e., \a i_.)
+ this->invalidate();
+ }
+
template <typename Exact>
void
bkd_viter_lut<Exact>::impl_start()
Index: oln/core/gen/fwd_viter_lut.hh
--- oln/core/gen/fwd_viter_lut.hh (revision 708)
+++ oln/core/gen/fwd_viter_lut.hh (working copy)
@@ -34,8 +34,11 @@
namespace oln
{
- // Forward declaration.
+ // Forward declarations.
template <typename Lut> class fwd_viter_lut;
+ namespace morpher {
+ template <typename Image, typename Lut> struct with_lut;
+ } // end of namespace oln::morpher
/// Super type declaration.
@@ -74,8 +77,11 @@
typedef oln_type_of(self_t, value) value_type;
public:
- // Construct an uninitialized value iterator.
+ /// Construct a forward value iterator from a look-up table (LUT).
fwd_viter_lut(const Lut& lut);
+ /// Construct a forward value iterator from an image having a LUT.
+ template <typename Image>
+ fwd_viter_lut(const morpher::with_lut<Image, Lut>& ima);
/// Iterator manipulators.
/// \{
@@ -116,6 +122,17 @@
this->invalidate();
}
+ template <typename Lut>
+ template <typename Image>
+ fwd_viter_lut<Lut>::fwd_viter_lut(const morpher::with_lut<Image, Lut>&
ima) :
+ super_t(),
+ lut_(ima.lut()),
+ i_()
+ {
+ // Initialize underlying iterator (i.e., \a i_.)
+ this->invalidate();
+ }
+
template <typename Exact>
void
fwd_viter_lut<Exact>::impl_start()