
* mln/value/label.hh: Include next routine. * mln/value/next.hh: New. --- milena/ChangeLog | 8 +++ milena/mln/value/{cast.hh => next.hh} | 92 +++++++++++++++++++++------------ scribo/scribo/core/component_set.hh | 17 ++++--- 3 files changed, 77 insertions(+), 40 deletions(-) copy milena/mln/value/{cast.hh => next.hh} (59%) diff --git a/milena/ChangeLog b/milena/ChangeLog index 1eedf26..a5da997 100644 --- a/milena/ChangeLog +++ b/milena/ChangeLog @@ -1,3 +1,11 @@ +2010-10-21 Guillaume Lazzara <z@lrde.epita.fr> + + Add value::next routine. + + * mln/value/label.hh: Include next routine. + + * mln/value/next.hh: New. + 2010-09-15 Guillaume Lazzara <z@lrde.epita.fr> Temporarily disable static tests on Magick::Quantum type size. diff --git a/milena/mln/value/cast.hh b/milena/mln/value/next.hh similarity index 59% copy from milena/mln/value/cast.hh copy to milena/mln/value/next.hh index 0f7939b..e1dac48 100644 --- a/milena/mln/value/cast.hh +++ b/milena/mln/value/next.hh @@ -1,4 +1,4 @@ -// Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE) +// Copyright (C) 2010 EPITA Research and Development Laboratory (LRDE) // // This file is part of Olena. // @@ -23,16 +23,14 @@ // exception does not however invalidate any other reasons why the // executable file might be covered by the GNU General Public License. -#ifndef MLN_VALUE_CAST_HH -# define MLN_VALUE_CAST_HH +#ifndef MLN_VALUE_NEXT_HH +# define MLN_VALUE_NEXT_HH -/*! \file - * - * \brief Definition of the mln::value::cast routine. - */ +/// \file +/// +/// Return a given value incremented by 1. -# include <mln/core/concept/value.hh> -# include <mln/value/equiv.hh> +# include <mln/value/label.hh> namespace mln @@ -41,59 +39,87 @@ namespace mln namespace value { + template <typename V> + V + next(const V&); - /// Cast a value \p src from type \c Src to type \c Dest. - template <typename Dest, typename Src> - Dest cast(const Src& src); +# ifndef MLN_INCLUDE_ONLY -# ifndef MLN_INCLUDE_ONLY + // Implementations - namespace internal + namespace implementation { - template <typename S> + namespace generic + { + + template <typename V> + inline + V + next(const V& v) + { + return v + 1; + } + + } // end of namespace mln::value::implementation::generic + + + template <unsigned n> inline - const S& - cast_(const void*, const S& src) + mln::value::label<n> + next_label(const mln::value::label<n>& v) { - return src; + return v.next(); } - template <typename O, typename S> + } // end of namespace mln::value::implementation + + + + // Dispatch + + namespace internal + { + + template <unsigned n> inline - const S& - cast_(const Object<O>*, const S& src) + label<n> + next_dispatch(const label<n>& v) { - return src; + return implementation::next_label(v); } - template <typename V, typename S> + + template <typename V> inline - mln_value_equiv(S) - cast_(const Value<V>*, const S& src) + V + next_dispatch(const V& v) { - return mln::value::equiv(src); + return implementation::generic::next(v); } } // end of namespace mln::value::internal - template <typename Dest, typename Src> + + // Facade + + template <typename V> inline - Dest cast(const Src& src) + V + next(const V& v) { - // FIXME: Add static_cast<Dest>? - // FIXME: Add exact()? - return static_cast<Dest>(internal::cast_(&src, src)); + return internal::next_dispatch(v); } + # endif // ! MLN_INCLUDE_ONLY + } // end of namespace mln::value } // end of namespace mln - -#endif // ! MLN_VALUE_CAST_HH +#endif // ! MLN_VALUE_NEXT_HH diff --git a/scribo/scribo/core/component_set.hh b/scribo/scribo/core/component_set.hh index b8445eb..937ba4f 100644 --- a/scribo/scribo/core/component_set.hh +++ b/scribo/scribo/core/component_set.hh @@ -115,6 +115,9 @@ namespace scribo typedef mln_result(center_accu_t) center_t; + typedef internal::component_set_data<L> data_t; + typedef data_t* id_t; + public: /// Constructors @@ -190,7 +193,7 @@ namespace scribo const mln::util::array<scribo::component_info>& infos_() const; /// Unique set Id. - unsigned id_() const; + id_t id_() const; /// Read/Write access to the underlying labeled image. @@ -212,7 +215,7 @@ namespace scribo /// Duplicate the underlying image and create a new component_set. void init_(const component_set<L>& model); - mln::util::tracked_ptr< internal::component_set_data<L> > data_; + mln::util::tracked_ptr<data_t> data_; }; @@ -312,7 +315,7 @@ namespace scribo { typedef mln_site(L) P; - infos_.reserve(static_cast<unsigned>(ncomps_) + 1); + infos_.reserve(value::next(ncomps_)); infos_.append(component_info()); // Component 0, i.e. the background. for_all_comp_data(i, attribs) @@ -330,7 +333,7 @@ namespace scribo { typedef mln_site(L) P; - infos_.reserve(static_cast<unsigned>(ncomps_) + 1); + infos_.reserve(value::next(ncomps_)); infos_.append(component_info()); // Component 0, i.e. the background. for_all_comp_data(i, attribs) @@ -485,10 +488,10 @@ namespace scribo template <typename L> inline - unsigned + typename component_set<L>::id_t component_set<L>::id_() const { - return (unsigned)data_.ptr_; + return data_.ptr_; } @@ -506,7 +509,7 @@ namespace scribo mln_concrete(L) component_set<L>::valid_comps_image_() const { - mln::util::array<bool> f(unsigned(this->data_->ncomps_) + 1); + mln::util::array<bool> f(value::next(this->data_->ncomps_)); f(0) = true; for_all_comps(c, (*this)) -- 1.5.6.5