LRE
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
List overview
Download
Olena-patches
November 2008
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
olena-patches@lrde.epita.fr
14 participants
266 discussions
Start a n
N
ew thread
cleanup-2008 2887: Cleanup basic graph class and related materials.
by Thierry Geraud
https://svn.lrde.epita.fr/svn/oln/branches/cleanup-2008/milena
Index: ChangeLog from Thierry Geraud <thierry.geraud(a)lrde.epita.fr> Cleanup basic graph class and related materials. * mln/core/site_set/p_graph_piter.hh: Upgrade doc style. (operator<<): Remove; useless. * mln/core/site_set/p_vertices.hh (vertex, graph_element): New typedefs. (graph_t): Remove; use explicitly G instead. * mln/core/site_set/p_edges.hh (edge, graph_element): New typedefs. (graph_t): Remove; use explicitly G instead. * mln/util/graph.hh: Layout. * mln/util/internal/graph_base.hh (graph_id): Fix return type. That avoids a warning at compile-time. * mln/core/concept/graph.hh: Update. * mln/util/internal/graph_iter.hh: Layout. * mln/util/internal/graph_edge.hh: Upgrade doc style. (operator<<): Fix missing const. (edge::edge): Prefer invalidate over id_ set to 0. (FIXME): New. (invalidate): Set id_ to unsigned max value; less error-prone. (graph_t): Use instead explicit... (G): ...parameter type. * mln/util/internal/graph_edge_psite.hh: Upgrade doc style. (target_t, edge_t): Use instead the explicit... (p_edges, util::edge): ...types. * mln/util/internal/graph_vertex.hh (vertex::vertex): Prefer invalidate over id_ set to 0. (FIXME): New. (invalidate): Set id_ to unsigned max value; less error-prone. (graph_t): Use instead explicit... (G): ...parameter type. Fix doc. * mln/util/internal/graph_psite_base.hh: Fix doc. (V, P): Remove these useless parameters, now deduce from S. (v_): Rename this attribute as... (elt_): ...this; more explicit name. (target): Prefer to use the explicit... (S): ...type. (t_): Rename as... (s_): ...this; consistent with other classes. (q_subject): Remove; obsolete. (to_site): Remove; inherited. (operator<<): Remove; useless. (operator graph_element): New conversion operator. (site_set, graph, subj_): Fix missing precondition. * mln/util/internal/graph_vertex_psite.hh: Fix doc. (target_t, vertex_t): Prefer to use explicit... (p_vertices, util::vertex): ...types. * mln/util/internal/graph_iter_base.hh (P): Rename this parameter as... (Elt): ...this; more explicit. (invalidate): Fix missing postcondition. (next): Fix missing precondition. core/concept/graph.hh | 2 core/site_set/p_edges.hh | 28 +++-- core/site_set/p_graph_piter.hh | 34 ++---- core/site_set/p_vertices.hh | 43 +++++--- util/graph.hh | 12 +- util/internal/graph_base.hh | 6 - util/internal/graph_edge.hh | 50 ++++----- util/internal/graph_edge_psite.hh | 53 +++------ util/internal/graph_iter.hh | 6 - util/internal/graph_iter_base.hh | 59 +++++------ util/internal/graph_psite_base.hh | 193 +++++++++++++++++------------------- util/internal/graph_vertex.hh | 41 ++++--- util/internal/graph_vertex_psite.hh | 48 ++++---- 13 files changed, 291 insertions(+), 284 deletions(-) Index: mln/core/site_set/p_graph_piter.hh --- mln/core/site_set/p_graph_piter.hh (revision 2886) +++ mln/core/site_set/p_graph_piter.hh (working copy) @@ -30,15 +30,17 @@ # define MLN_CORE_SITE_SET_P_GRAPH_PITER_HH /// \file mln/core/site_set/p_graph_piter.hh -/// \brief Definition of point iterator on graph-based point set. +/// +/// Definition of point iterator on graph-based point set. # include <mln/core/internal/site_set_iterator_base.hh> -//# include <mln/core/site_set/p_graph.hh> -//# include <mln/core/image/graph_psite.hh> + + namespace mln { - // Fwd decls. + + // Forward declaration. template <typename S, typename I> class graph_psite; @@ -46,7 +48,7 @@ | p_graph_piter<S,I>. | `------------------------*/ - /// \brief Generic iterator on point sites of a mln::S. + /// Generic iterator on point sites of a mln::S. template <typename S, typename I> class p_graph_piter : public internal::site_set_iterator_base< S, @@ -57,7 +59,8 @@ typedef I iter; public: - /// Construction and assignment. + + /// Constructors. /// \{ p_graph_piter(); p_graph_piter(const S& pv); @@ -77,10 +80,12 @@ /// \} private: + /// Update the psite corresponding to this iterator. void update_(); private: + /// The psite corresponding to this iterator. using super_::p_; @@ -89,11 +94,6 @@ }; - /// Print an mln::p_graph_piter<S,I>. - template <typename S, typename I> - inline - std::ostream& - operator<<(std::ostream& ostr, const p_graph_piter<S,I>& p); # ifndef MLN_INCLUDE_ONLY @@ -164,19 +164,9 @@ p_.update_id(iter_.id()); } - - - template <typename S, typename I> - inline - std::ostream& - operator<<(std::ostream& ostr, const p_graph_piter<S,I>& p) - { - return ostr << p.unproxy_(); - } - # endif // ! MLN_INCLUDE_ONLY -} // end of mln +} // end of namespace mln #endif // ! MLN_CORE_SITE_SET_P_GRAPH_PITER_HH Index: mln/core/site_set/p_vertices.hh --- mln/core/site_set/p_vertices.hh (revision 2886) +++ mln/core/site_set/p_vertices.hh (working copy) @@ -29,7 +29,8 @@ # define MLN_CORE_SITE_SET_P_VERTICES_HH /// \file mln/core/site_set/p_vertices.hh - /// \brief Definition of a point set based on a graph. +/// +/// Definition of a point set based on a graph. # include <mln/core/internal/site_set_base.hh> # include <mln/core/site_set/p_graph_piter.hh> @@ -41,11 +42,14 @@ //# include <mln/core/image/graph_psite.hh> //# include <mln/core/site_set/p_vertices_piter.hh> + namespace mln { + // Forward declaration. template <typename G, typename F> struct p_vertices; + namespace trait { template <typename G, typename F> @@ -60,33 +64,41 @@ } // end of namespace mln::trait + template <typename G, typename F> class p_vertices - : public internal::site_set_base_< typename F::result, p_vertices<G, F> > + : public internal::site_set_base_< mln_result(F), p_vertices<G, F> > { - typedef util::vertex<G> vertex_t; typedef p_vertices<G, F> self_; - typedef internal::site_set_base_< typename F::result, self_ > super_; + typedef internal::site_set_base_< mln_result(F), self_ > super_; public: - /// Type of the graph this site set is based on. - typedef G graph_t; + /// Type of graph vertex. + typedef util::vertex<G> vertex; - /// \brief Construct a graph psite set from a graph of points. - /// \{ + + /// Type of graph element this site set focuses on. + typedef util::vertex<G> graph_element; + + + /// Constructor without argument. p_vertices(); + /// Construct a graph psite set from a graph of points. /// \param gr The graph upon which the graph psite set is built. /// \param f the function which maps a vertex to a site. - p_vertices(const graph_t& gr, const F& f); + p_vertices(const G& gr, const F& f); /// \} + /// Associated types. /// \{ + /// Element associated type. typedef mln_site(super_) element; + /// Point_Site associated type. typedef internal::vertex_psite<G, F> psite; @@ -98,8 +110,10 @@ /// Site_Iterator associated type. typedef fwd_piter piter; + /// \} + /// \brief Return The number of points (sites) of the set, i.e., /// the number of \em vertices. /// @@ -109,8 +123,9 @@ /// Return The number of vertices in the graph. unsigned nvertices() const; - /// Is this site set valid? + /// Test this site set validity. bool is_valid() const; + /// Invalidate this site set. void invalidate(); @@ -134,13 +149,13 @@ /// Accessors. /// \{ /// Return the graph associated to this site set (const version) - const graph_t& graph() const; + const G& graph() const; /// Return the association function. const F& function() const; /// \} private: - mlc_const(graph_t)* g_; + const G* g_; F f_; }; @@ -182,7 +197,7 @@ template <typename G, typename F> inline - p_vertices<G, F>::p_vertices(const graph_t& g, const F& f) + p_vertices<G, F>::p_vertices(const G& g, const F& f) : g_ (&g), f_(f) { } @@ -282,7 +297,7 @@ template <typename G, typename F> inline - const typename p_vertices<G, F>::graph_t& + const G& p_vertices<G, F>::graph() const { mln_precondition(is_valid()); Index: mln/core/site_set/p_edges.hh --- mln/core/site_set/p_edges.hh (revision 2886) +++ mln/core/site_set/p_edges.hh (working copy) @@ -58,27 +58,32 @@ template <typename G, typename F> class p_edges - : public internal::site_set_base_< typename F::result, p_edges<G, F> > + : public internal::site_set_base_< mln_result(F), p_edges<G, F> > { - typedef util::edge<G> edge_t; typedef p_edges<G, F> self_; - typedef internal::site_set_base_< typename F::result, self_ > super_; + typedef internal::site_set_base_< mln_result(F), self_ > super_; public: - /// Type of the graph this site set is based on. - typedef G graph_t; - /// \brief Construct a graph edge psite set from a graph and a function. + /// Type of graph edge. + typedef util::edge<G> edge; + + /// Type of graph element this site set focuses on. + typedef util::edge<G> graph_element; + + + /// Construct a graph edge psite set from a graph and a function. /// /// \param gr The graph upon which the graph edge psite set is built. /// \param f the function mapping edges and sites. - p_edges(const graph_t& gr, const F& f); + p_edges(const G& gr, const F& f); /// Associated types. /// \{ /// Element associated type. typedef mln_site(super_) element; + /// Point_Site associated type. typedef internal::edge_psite<G, F> psite; @@ -117,13 +122,14 @@ /// Accessors. /// \{ /// Return the graph associated to this site set - const graph_t& graph() const; + const G& graph() const; /// Return the mapping function. const F& function() const; /// \} private: - mlc_const(graph_t)* g_; + + const G* g_; F f_; }; @@ -155,7 +161,7 @@ template <typename G, typename F> inline - p_edges<G, F>::p_edges(const graph_t& g, const F& f) + p_edges<G, F>::p_edges(const G& g, const F& f) : g_ (&g), f_(f) { } @@ -223,7 +229,7 @@ template <typename G, typename F> inline - const typename p_edges<G, F>::graph_t& + const G& p_edges<G, F>::graph() const { mln_precondition(is_valid()); Index: mln/core/concept/graph.hh --- mln/core/concept/graph.hh (revision 2886) +++ mln/core/concept/graph.hh (working copy) @@ -109,7 +109,7 @@ //typedef mln_bkd_piter(E) bkd_piter; // Check methods - const void * const(E::*m1)() const = & E::graph_id; + const void* (E::*m1)() const = & E::graph_id; m1 = 0; unsigned (E::*m2)(unsigned id_e, unsigned id_v) const = & E::v_other; m2 = 0; Index: mln/util/graph.hh --- mln/util/graph.hh (revision 2886) +++ mln/util/graph.hh (working copy) @@ -30,19 +30,21 @@ # define MLN_UTIL_GRAPH_HH /// \file mln/util/graph.hh -/// Definitions of undirected graphs. +/// +/// Definition of a basic undirected graph. # include <mln/util/internal/graph_base.hh> # include <mln/util/internal/graph_iter.hh> # include <mln/util/internal/graph_nbh_iter.hh> # include <mln/util/ord_pair.hh> + namespace mln { namespace util { - /// Fwd declaration. + /// Forward declaration. class graph; } @@ -134,6 +136,8 @@ graph(); + + /// Vertex oriented. /// \{ /// Shortcuts factoring the insertion of vertices and edges. @@ -173,7 +177,6 @@ - /// Edge oriented. /// \{ /// Add an edge. @@ -219,6 +222,9 @@ } // end of namespace mln + + + # ifndef MLN_INCLUDE_ONLY namespace mln Index: mln/util/internal/graph_iter.hh --- mln/util/internal/graph_iter.hh (revision 2886) +++ mln/util/internal/graph_iter.hh (working copy) @@ -148,6 +148,8 @@ friend class graph_iter_base<G, util::edge<G>, edge_bkd_iterator<G> >; }; + + # ifndef MLN_INCLUDE_ONLY /*--------------------` @@ -290,9 +292,9 @@ # endif // !MLN_INCLUDE_ONLY - } // End of namespace mln::internal + } // end of namespace mln::internal -} // End of namespace mln +} // end of namespace mln #endif // !MLN_UTIL_INTERNAL_GRAPH_ITER_HH Index: mln/util/internal/graph_edge.hh --- mln/util/internal/graph_edge.hh (revision 2886) +++ mln/util/internal/graph_edge.hh (working copy) @@ -28,11 +28,12 @@ #ifndef MLN_UTIL_INTERNAL_GRAPH_EDGE_HH # define MLN_UTIL_INTERNAL_GRAPH_EDGE_HH +/// \file mln/util/internal/graph_edge.hh +/// +/// Definition of a graph edge. + # include <mln/util/internal/graph_edge_impl.hh> -/*! \file mln/util/internal/graph_edge.hh - * \brief Definition of a graph edge. - */ namespace mln { @@ -44,22 +45,23 @@ | Edge. | `-------*/ - /// \brief Edge of a graph \p G. + /// Edge of a graph \p G. template <typename G> class edge : public internal::edge_impl_<G> { - typedef mlc_unconst(G) graph_t; - public: + + /// Graph associated type. + typedef G graph_t; + /// Constructors /// \{ edge(); - explicit edge(const graph_t& g); - edge(const graph_t& g, unsigned id); + explicit edge(const G& g); + edge(const G& g, unsigned id); /// \} - /// Misc. /// \{ /// Return whether is points to a known edge. @@ -74,14 +76,13 @@ void update_id(unsigned id); /// Return a reference to the graph holding this edge. - const graph_t& graph() const; + const G& graph() const; /// Set g_ with \p g; - void change_graph(const graph_t& g); + void change_graph(const G& g); /// \} - /// Vertex and edges oriented. /// \{ /// Return the vertex id of this edge which is different from \p id_v. @@ -105,13 +106,13 @@ /// \} private: - graph_t g_; + G g_; unsigned id_; }; template <typename G> std::ostream& - operator<<(std::ostream& ostr, edge<G>& p); + operator<<(std::ostream& ostr, const edge<G>& p); template <typename G> bool @@ -174,23 +175,24 @@ template <typename G> inline edge<G>::edge() - : id_(0) { + invalidate(); } template <typename G> inline - edge<G>::edge(const graph_t& g) - : g_(g), id_(g.e_nmax()) + edge<G>::edge(const G& g) + : g_(g) { + invalidate(); } template <typename G> inline - edge<G>::edge(const graph_t& g, unsigned id) + edge<G>::edge(const G& g, unsigned id) : g_(g), id_(id) { - mln_precondition(g.has_e(id)); + mln_precondition(/* FIXME: g_.is_valid() && */ g.has_e(id)); } template <typename G> @@ -211,7 +213,7 @@ template <typename G> inline - const typename edge<G>::graph_t& + const typename edge<G>::G& edge<G>::graph() const { return g_; @@ -220,7 +222,7 @@ template <typename G> inline void - edge<G>::change_graph(const graph_t& g) + edge<G>::change_graph(const G& g) { g_ = g; } @@ -230,7 +232,7 @@ bool edge<G>::is_valid() const { - return g_.has_e(id_); + return /* FIXME: g_.is_valid() && */ g_.has_e(id_); } template <typename G> @@ -238,7 +240,7 @@ void edge<G>::invalidate() { - id_ = g_.e_nmax(); + id_ = mln_max(unsigned); } @@ -289,7 +291,7 @@ template <typename G> std::ostream& - operator<<(std::ostream& ostr, edge<G>& p) + operator<<(std::ostream& ostr, const edge<G>& p) { return ostr << p.id(); } Index: mln/util/internal/graph_edge_psite.hh --- mln/util/internal/graph_edge_psite.hh (revision 2886) +++ mln/util/internal/graph_edge_psite.hh (working copy) @@ -28,67 +28,56 @@ #ifndef MLN_UTIL_INTERNAL_GRAPH_EDGE_PSITE_HH # define MLN_UTIL_INTERNAL_GRAPH_EDGE_PSITE_HH -# include <mln/core/concept/pseudo_site.hh> +/// \file mln/util/internal/graph_edge_psite.hh +/// +/// Implementation of p_edges psite. + # include <mln/util/internal/graph_psite_base.hh> # include <mln/util/internal/graph_edge.hh> + namespace mln { + // Forward declaration. template <typename G, typename F> class p_edges; -} // end of namespace mln - -/// \file mln/util/internal/graph_edge_psite.hh -/// \brief Implementation of p_edges psite. - -namespace mln -{ namespace internal { + template <typename G, typename F> class edge_psite : - public graph_psite_base<util::edge<G>, typename F::result, - p_edges<G, F>, + public graph_psite_base< p_edges<G,F>, edge_psite<G, F> > { typedef edge_psite<G, F> self_; - typedef p_edges<G, F> target_t; - typedef graph_psite_base<util::edge<G>, typename F::result, target_t, self_> super_; - typedef util::edge<G> edge_t; + typedef graph_psite_base<p_edges<G,F>, self_> super_; public: - /// Associated Types - /// \{ - /// Site type, the return type of the mapping function \p F here. - typedef typename F::result site; - /// \} /// Constructors /// \{ edge_psite(); - edge_psite(const target_t& t); - edge_psite(const target_t& t, unsigned); + edge_psite(const p_edges<G,F>& s); + edge_psite(const p_edges<G,F>& s, unsigned); /// \} /// Accessors /// \{ /// Return the underlying edge. - const edge_t& e() const; + const util::edge<G>& e() const; /// \} - - protected: - /// The underlying edge (inherited). - using super_::v_; }; - } // end of namespace internal + + } // end of namespace mln::internal } // end of namespace mln + # ifndef MLN_INCLUDE_ONLY namespace mln @@ -105,24 +94,24 @@ template <typename G, typename F> inline - edge_psite<G, F>::edge_psite(const target_t& t) - : super_(t) + edge_psite<G, F>::edge_psite(const p_edges<G,F>& s) + : super_(s) { } template <typename G, typename F> inline - edge_psite<G, F>::edge_psite(const target_t& t, unsigned id) - : super_(t, id) + edge_psite<G, F>::edge_psite(const p_edges<G,F>& s, unsigned id) + : super_(s, id) { } template <typename G, typename F> inline - const typename edge_psite<G, F>::edge_t& + const util::edge<G>& edge_psite<G, F>::e() const { - return v_; + return this->v_; } } // end of namespace internal Index: mln/util/internal/graph_base.hh --- mln/util/internal/graph_base.hh (revision 2886) +++ mln/util/internal/graph_base.hh (working copy) @@ -83,7 +83,7 @@ /// Misc. methods /// \{ /// Returns the graph id, the "this" pointer. - const void * const graph_id() const; + const void* graph_id() const; /// \} /// Vertex oriented methods @@ -158,10 +158,10 @@ template<typename E> inline - const void * const + const void* graph_base<E>::graph_id() const { - return static_cast<const void * const>(data_.ptr_); + return static_cast<const void*>(data_.ptr_); } /*-------------------------. Index: mln/util/internal/graph_vertex.hh --- mln/util/internal/graph_vertex.hh (revision 2886) +++ mln/util/internal/graph_vertex.hh (working copy) @@ -31,7 +31,10 @@ # include <mln/util/internal/graph_vertex_impl.hh> /// \file mln/util/internal/graph_vertex.hh -/// \brief Implementation of a graph vertex. +/// +/// Implementation of a graph vertex. + + namespace mln { @@ -39,19 +42,20 @@ namespace util { - /// \brief Vertex of a graph \p G. + /// Vertex of a graph \p G. template<typename G> class vertex : public internal::vertex_impl_<G> { - typedef mlc_unconst(G) graph_t; - public: + /// Graph associated type. + typedef G graph_t; + /// Constructors. /// \{ vertex(); - explicit vertex(const graph_t& g); - vertex(const graph_t& g, unsigned id); + explicit vertex(const G& g); + vertex(const G& g, unsigned id); /// \} /// Check whether the vertex is still part of the graph. @@ -78,17 +82,17 @@ /// Change the parent graph of that vertex. void change_graph(const G& g); - /// Update vertex id. + /// Update the vertex id. void update_id(unsigned id); /// Returns the graph pointer this vertex belongs to. - const graph_t& graph() const; + const G& graph() const; - /// Returns vertex id. + /// Returns the vertex id. unsigned id() const; protected: - graph_t g_; + G g_; unsigned id_; }; @@ -173,23 +177,24 @@ template <typename G> inline vertex<G>::vertex() - : id_(0) { + invalidate(); } template <typename G> inline - vertex<G>::vertex(const graph_t& g) - : g_(g), id_(g_.v_nmax()) + vertex<G>::vertex(const G& g) + : g_(g) { + invalidate(); } template<typename G> inline - vertex<G>::vertex(const graph_t& g, unsigned id) + vertex<G>::vertex(const G& g, unsigned id) : g_(g), id_(id) { - mln_precondition(g_.has_v(id)); + mln_precondition(/* FIXME: g_.is_valid() && */ g_.has_v(id)); } template<typename G> @@ -197,7 +202,7 @@ bool vertex<G>::is_valid() const { - return g_.has_v(id_); + return /* FIXME: g_.is_valid() && */ g_.has_v(id_); } template<typename G> @@ -205,7 +210,7 @@ void vertex<G>::invalidate() { - id_ = g_.v_nmax(); + id_ = mln_max(unsigned); } @@ -274,7 +279,7 @@ template<typename G> inline - const typename vertex<G>::graph_t& + const typename vertex<G>::G& vertex<G>::graph() const { return g_; Index: mln/util/internal/graph_psite_base.hh --- mln/util/internal/graph_psite_base.hh (revision 2886) +++ mln/util/internal/graph_psite_base.hh (working copy) @@ -28,6 +28,10 @@ #ifndef MLN_UTIL_INTERNAL_GRAPH_PSITE_BASE_HH # define MLN_UTIL_INTERNAL_GRAPH_PSITE_BASE_HH +/// \file mln/util/internal/graph_psite_base.hh +/// +/// Base implementation for graph based psites. + # include <mln/core/concept/pseudo_site.hh> namespace mln @@ -37,8 +41,6 @@ } // end of namespace mln -/// \file mln/util/internal/graph_psite_base.hh -/// \brief Base implementation for graph based psites. namespace mln { @@ -46,41 +48,43 @@ namespace internal { - template <typename V, typename P, typename S, typename E> - class graph_psite_base : public mln::Pseudo_Site<E>, - public internal::proxy_impl<const P&, E> + template <typename S, typename E> + class graph_psite_base : public internal::pseudo_site_base_< const mln_site(S)&, + E > { - typedef Pseudo_Site< graph_psite_base<V, P, S, E> > super; - typedef typename S::graph_t graph_t; + typedef Pseudo_Site< graph_psite_base<S,E> > super; public: - /// Associated types. - /// \{ - typedef P site; + + // This associated type is important to know that this particular + // pseudo site knows the site set it refers to. typedef S target; - /// \} + + // As a Proxy: + const mln_site(S)& subj_(); + /// Setters. /// \{ /// Change the targe site set. - void change_target(const target& new_target); + void change_target(const S& new_target); /// Update the underlying element's id. /// This element can be an edge, a vertex... - void update_id(unsigned v_id); + void update_id(unsigned elt_id); /// \} /// Getters. /// \{ /// Return the target (the site set). - const target* target_() const; // Hook to the target. + const S* target_() const; // Hook to the target. /// Return the site set (the target). - const target& site_set() const; + const S& site_set() const; /// Return the graph associated to the target of this psite. - const graph_t& graph() const; + const typename S::graph_t& graph() const; - /// Return the graph associated to the target of this psite. + /// Return the id of the graph element designated by this psite. unsigned id() const; /// \} @@ -90,38 +94,30 @@ /// Invalidate this psite. void invalidate(); - /// Pseudo site Interface - /// \{ - /// Subject type. - typedef const site& q_subject; - /// Return the subject. - const site& subj_(); - /// Return the underlying site. - const site& to_site() const; - /// \} + /// Conversion towards the graph element (vertex or edge). + operator const typename S::graph_element&() const; protected: + /// Constructors. + /// \{ graph_psite_base(); /// \p t A site set. /// \sa p_vertices, p_edges. - graph_psite_base(const target& t); + graph_psite_base(const S& s); /// \p t A site set. /// \sa p_vertices, p_edges. /// \p id The id of the element associated to this psite. - graph_psite_base(const target& t, unsigned id); + graph_psite_base(const S& , unsigned id); /// \} - mlc_const(target)* t_; - V v_; + const S* s_; + typename S::graph_element elt_; }; - template <typename V, typename P, typename S, typename E> - std::ostream& - operator<<(std::ostream& ostr, graph_psite_base<V, P, S, E>& p); - /// Comparison of two mln::graph_psite_base<V, P, S, E> instances. + /// Comparison of two mln::graph_psite_base<S,E> instances. /// \{ /* FIXME: Shouldn't those comparisons be part of a much general mechanism? */ @@ -130,17 +126,17 @@ /// /// \pre Arguments \a lhs and \a rhs must belong to the same /// mln::p_vertices. - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> bool - operator==(const graph_psite_base<V, P, S, E>& lhs, const graph_psite_base<V, P, S, E>& rhs); + operator==(const graph_psite_base<S,E>& lhs, const graph_psite_base<S,E>& rhs); /// \brief Is \a lhs not equal to \a rhs? /// /// \pre Arguments \a lhs and \a rhs must belong to the same /// mln::p_vertices. - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> bool - operator!=(const graph_psite_base<V, P, S, E>& lhs, const graph_psite_base<V, P, S, E>& rhs); + operator!=(const graph_psite_base<S,E>& lhs, const graph_psite_base<S,E>& rhs); /// \brief Is \a lhs ``less'' than \a rhs? /// @@ -148,9 +144,9 @@ /// /// \pre Arguments \a lhs and \a rhs must belong to the same /// mln::p_vertices. - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> bool - operator< (const graph_psite_base<V, P, S, E>& lhs, const graph_psite_base<V, P, S, E>& rhs); + operator< (const graph_psite_base<S,E>& lhs, const graph_psite_base<S,E>& rhs); /// \} } // end of namespace internal @@ -158,6 +154,7 @@ } // end of namespace mln + # ifndef MLN_INCLUDE_ONLY namespace mln @@ -166,143 +163,137 @@ namespace internal { - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> inline - graph_psite_base<V, P, S, E>::graph_psite_base() - : t_(0) + graph_psite_base<S,E>::graph_psite_base() + : s_(0) { } - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> inline - graph_psite_base<V, P, S, E>::graph_psite_base(const target& t) - : t_(0) + graph_psite_base<S,E>::graph_psite_base(const S& s) { - change_target(t); + change_target(s); } - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> inline - graph_psite_base<V, P, S, E>::graph_psite_base(const target& t, unsigned id) - : t_(0) + graph_psite_base<S,E>::graph_psite_base(const S& s, unsigned id) { - change_target(t); + change_target(s); update_id(id); } - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> inline void - graph_psite_base<V, P, S, E>::change_target(const target& new_target) + graph_psite_base<S,E>::change_target(const S& new_target) { - t_ = &new_target; - v_.change_graph(new_target.graph()); + s_ = & new_target; + elt_.change_graph(new_target.graph()); } - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> inline void - graph_psite_base<V, P, S, E>::update_id(unsigned id) + graph_psite_base<S,E>::update_id(unsigned id) { - v_.update_id(id); + elt_.update_id(id); } - template <typename v, typename p, typename s, typename e> + template <typename S, typename E> inline - const typename graph_psite_base<v, p, s, e>::target* - graph_psite_base<v, p, s, e>::target_() const + const S* + graph_psite_base<S,E>::target_() const { - return t_; + return s_; } - template <typename v, typename p, typename s, typename e> + template <typename S, typename E> inline - const typename graph_psite_base<v, p, s, e>::target& - graph_psite_base<v, p, s, e>::site_set() const + const S& + graph_psite_base<S,E>::site_set() const { - return *t_; + mln_precondition(s_ != 0); + return *s_; } - template <typename v, typename p, typename s, typename e> + template <typename S, typename E> inline - const typename graph_psite_base<v, p, s, e>::graph_t& - graph_psite_base<v, p, s, e>::graph() const + const typename S::graph_t& + graph_psite_base<S,E>::graph() const { - return t_->graph(); + mln_precondition(s_ != 0); + return s_->graph(); } - template <typename v, typename p, typename s, typename e> + template <typename S, typename E> inline unsigned - graph_psite_base<v, p, s, e>::id() const + graph_psite_base<S,E>::id() const { - return v_.id(); + return elt_.id(); } - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> inline bool - graph_psite_base<V, P, S, E>::is_valid() const + graph_psite_base<S,E>::is_valid() const { - return t_ != 0 && t_->is_valid() && v_.is_valid(); + return s_ != 0 && s_->is_valid() && elt_.is_valid(); } - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> inline void - graph_psite_base<V, P, S, E>::invalidate() + graph_psite_base<S,E>::invalidate() { - t_ = 0; - v_.invalidate(); + s_ = 0; + elt_.invalidate(); } - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> inline - const typename graph_psite_base<V, P, S, E>::site& - graph_psite_base<V, P, S, E>::subj_() + const mln_site(S)& + graph_psite_base<S,E>::subj_() { - return to_site(); + mln_precondition(s_ != 0); + return s_->function()(elt_.id()); } - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> inline - const typename graph_psite_base<V, P, S, E>::site& - graph_psite_base<V, P, S, E>::to_site() const + graph_psite_base<S,E>::operator const typename S::graph_element&() const { - return t_->function()(v_.id()); + mln_precondition(is_valid()); + return elt_; } - template <typename V, typename P, typename S, typename E> - std::ostream& - operator<<(std::ostream& ostr, graph_psite_base<V, P, S, E>& p) - { - return ostr << p.unproxy_(); - } - /*--------------. | Comparisons. | `--------------*/ - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> bool - operator==(const graph_psite_base<V, P, S, E>& lhs, const graph_psite_base<V, P, S, E>& rhs) + operator==(const graph_psite_base<S,E>& lhs, const graph_psite_base<S,E>& rhs) { mln_assertion(lhs.target_() == rhs.target_()); return lhs.id() == rhs.id(); } - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> bool - operator!=(const graph_psite_base<V, P, S, E>& lhs, const graph_psite_base<V, P, S, E>& rhs) + operator!=(const graph_psite_base<S,E>& lhs, const graph_psite_base<S,E>& rhs) { mln_assertion(lhs.target_() == rhs.target_()); return lhs.id() != rhs.id(); } - template <typename V, typename P, typename S, typename E> + template <typename S, typename E> bool - operator< (const graph_psite_base<V, P, S, E>& lhs, const graph_psite_base<V, P, S, E>& rhs) + operator< (const graph_psite_base<S,E>& lhs, const graph_psite_base<S,E>& rhs) { mln_assertion(lhs.target_() == rhs.target_()); return lhs.id() < rhs.id(); Index: mln/util/internal/graph_vertex_psite.hh --- mln/util/internal/graph_vertex_psite.hh (revision 2886) +++ mln/util/internal/graph_vertex_psite.hh (working copy) @@ -28,55 +28,51 @@ #ifndef MLN_UTIL_INTERNAL_GRAPH_VERTEX_PSITE_HH # define MLN_UTIL_INTERNAL_GRAPH_VERTEX_PSITE_HH +/// \file mln/util/internal/graph_vertex_psite.hh +/// +/// Implementation of p_vertices psite. + # include <mln/core/concept/pseudo_site.hh> # include <mln/util/internal/graph_psite_base.hh> # include <mln/util/internal/graph_vertex.hh> + namespace mln { + // Forward declaration. template <typename G, typename F> class p_vertices; -} // end of namespace mln - -/// \file mln/util/internal/graph_vertex_psite.hh -/// \brief Implementation of p_vertices psite. - -namespace mln -{ namespace internal { + template <typename G, typename F> class vertex_psite : - public graph_psite_base<util::vertex<G>, typename F::result, - p_vertices<G, F>, + public graph_psite_base< p_vertices<G,F>, vertex_psite<G, F> > { typedef vertex_psite<G, F> self_; - typedef p_vertices<G, F> target_t; - typedef graph_psite_base<util::vertex<G>, typename F::result, target_t, self_> super_; - typedef util::vertex<G> vertex_t; + typedef graph_psite_base<p_vertices<G,F>, self_> super_; public: - typedef typename F::result site; vertex_psite(); - vertex_psite(const target_t& t); - vertex_psite(const target_t& t, unsigned id); + vertex_psite(const p_vertices<G,F>& s); + vertex_psite(const p_vertices<G,F>& s, unsigned id); - const vertex_t& v() const; - - protected: - using super_::v_; + const util::vertex<G>& v() const; }; - } // end of namespace internal + + } // end of namespace mln::internal } // end of namespace mln + + # ifndef MLN_INCLUDE_ONLY namespace mln @@ -93,24 +89,24 @@ template <typename G, typename F> inline - vertex_psite<G, F>::vertex_psite(const target_t& t) - : super_(t) + vertex_psite<G, F>::vertex_psite(const p_vertices<G,F>& s) + : super_(s) { } template <typename G, typename F> inline - vertex_psite<G, F>::vertex_psite(const target_t& t, unsigned i) - : super_(t, i) + vertex_psite<G, F>::vertex_psite(const p_vertices<G,F>& s, unsigned i) + : super_(s, i) { } template <typename G, typename F> inline - const typename vertex_psite<G, F>::vertex_t& + const util::vertex<G>& vertex_psite<G, F>::v() const { - return v_; + return this->v_; } } // end of namespace internal Index: mln/util/internal/graph_iter_base.hh --- mln/util/internal/graph_iter_base.hh (revision 2886) +++ mln/util/internal/graph_iter_base.hh (working copy) @@ -28,12 +28,17 @@ #ifndef MLN_UTIL_INTERNAL_GRAPH_ITER_BASE_HH # define MLN_UTIL_INTERNAL_GRAPH_ITER_BASE_HH +/// \file mln/util/internal/graph_iter_base.hh +/// +/// Base implementation for graph iterators. +/// +/// \todo Have special types for ids (vertex_id) to disambiguate the +/// conversion op. + # include <mln/core/concept/iterator.hh> # include <mln/core/concept/proxy.hh> # include <mln/util/internal/graph_edge.hh> -/// \file mln/util/internal/graph_iter_base.hh -/// \brief Base implementation for graph iterators. namespace mln { @@ -41,10 +46,10 @@ namespace internal { - template <typename G, typename P, typename E> + template <typename G, typename Elt, typename E> class graph_iter_base : public Proxy< E >, - public internal::proxy_impl< const P&, E > + public internal::proxy_impl< const Elt&, E > { public: /// Iterator interface @@ -67,80 +72,80 @@ operator unsigned() const; /// \} - /// Proxy. - /// \{ /// Proxy subject - const P& subj_(); - /// \} + const Elt& subj_(); protected: graph_iter_base(const G& g); - P p_; + Elt p_; }; + # ifndef MLN_INCLUDE_ONLY - template <typename G, typename P, typename E> + template <typename G, typename Elt, typename E> inline - graph_iter_base<G, P, E>::graph_iter_base(const G& g) - : p_(P(g)) + graph_iter_base<G, Elt, E>::graph_iter_base(const G& g) + : p_(Elt(g)) { invalidate(); } - template <typename G, typename P, typename E> + template <typename G, typename Elt, typename E> inline bool - graph_iter_base<G, P, E>::is_valid() const + graph_iter_base<G, Elt, E>::is_valid() const { return p_.is_valid(); } - template <typename G, typename P, typename E> + template <typename G, typename Elt, typename E> inline void - graph_iter_base<G, P, E>::invalidate() + graph_iter_base<G, Elt, E>::invalidate() { p_.invalidate(); + mln_postcondition(! is_valid()); } - template <typename G, typename P, typename E> + template <typename G, typename Elt, typename E> inline void - graph_iter_base<G, P, E>::start() + graph_iter_base<G, Elt, E>::start() { p_.update_id(exact(this)->start_id_()); } - template <typename G, typename P, typename E> + template <typename G, typename Elt, typename E> inline void - graph_iter_base<G, P, E>::next() + graph_iter_base<G, Elt, E>::next() { + mln_precondition(is_valid()); p_.update_id(exact(this)->next_id_()); } - template <typename G, typename P, typename E> + template <typename G, typename Elt, typename E> inline unsigned - graph_iter_base<G, P, E>::index() const + graph_iter_base<G, Elt, E>::index() const { return p_.id(); } - template <typename G, typename P, typename E> + template <typename G, typename Elt, typename E> inline - graph_iter_base<G, P, E>::operator unsigned() const + graph_iter_base<G, Elt, E>::operator unsigned() const { return p_.id(); } - template <typename G, typename P, typename E> + template <typename G, typename Elt, typename E> inline - const P& - graph_iter_base<G, P, E>::subj_() + const Elt& + graph_iter_base<G, Elt, E>::subj_() { return p_; }
16 years, 1 month
1
0
0
0
cleanup-2008 2886: Use unmeta and handle accu object when needed.
by Thierry Geraud
https://svn.lrde.epita.fr/svn/oln/branches/cleanup-2008/milena
Index: ChangeLog from Thierry Geraud <thierry.geraud(a)lrde.epita.fr> Use unmeta and handle accu object when needed. * mln/level/compute.hh, * mln/accu/compute.hh, * mln/morpho/elementary/like_ero_fun.hh, * mln/labeling/compute.hh: Use unmeta. * mln/accu/transform_directional.hh, * mln/accu/transform_diagonal.hh, * mln/accu/transform_snake.hh: Handle the accu object. (FIXME): Remove. * mln/accu/transform_stop.hh: Layout. accu/compute.hh | 7 +++--- accu/transform_diagonal.hh | 44 +++++++++++++++----------------------- accu/transform_directional.hh | 20 ++++++++--------- accu/transform_snake.hh | 26 ++++++++++++---------- labeling/compute.hh | 16 ++++++++----- level/compute.hh | 8 ++++-- morpho/elementary/like_ero_fun.hh | 12 +++++----- 7 files changed, 67 insertions(+), 66 deletions(-) Index: mln/level/compute.hh --- mln/level/compute.hh (revision 2885) +++ mln/level/compute.hh (working copy) @@ -94,10 +94,12 @@ template <typename A, typename I> inline mln_accu_with(A, mln_value(I))::result - compute(const Meta_Accumulator<A>&, const Image<I>& input) + compute(const Meta_Accumulator<A>& a, const Image<I>& input) { - mln_accu_with(A, mln_value(I)) accu; - return level::compute(accu, input); // Call the previous version. + typedef mln_accu_with(A, mln_value(I)) A_; + A_ a_ = accu::unmeta(exact(a), mln_value(I)()); + + return level::compute(a_, input); // Call the previous version. } # endif // ! MLN_INCLUDE_ONLY Index: mln/accu/transform_directional.hh --- mln/accu/transform_directional.hh (revision 2885) +++ mln/accu/transform_directional.hh (working copy) @@ -58,14 +58,14 @@ template <typename A, typename I, typename W> mln_ch_value(I, mln_result(A)) - transform_directional(const Accumulator<A>&, + transform_directional(const Accumulator<A>& a, const Image<I>& input, const Window<W>& win, unsigned dir); template <typename A, typename I, typename W> mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) - transform_directional(const Meta_Accumulator<A>&, + transform_directional(const Meta_Accumulator<A>& a, const Image<I>& input, const Window<W>& win, unsigned dir); @@ -135,10 +135,10 @@ q_l, q_r; - directional_functor(const I& input, const W& win, int dir) + directional_functor(const I& input, const W& win, const A& a, int dir) : input(input), win(win), - accu(), + accu(a), dir(dir), win_left(win::shift(win, -dp_directional<dpsite>(dir)) - win), win_right(win - win::shift(win, -dp_directional<dpsite>(dir))), @@ -202,10 +202,10 @@ mln_qixter(const I, window2d) q_l, q_r; - directional_fastest_functor(const I& input, const W& win, unsigned dir) + directional_fastest_functor(const I& input, const W& win, const A& a, unsigned dir) : input(input), win(win), - accu(), + accu(a), dir(dir), win_left(win::shift(win, -dp_directional<dpsite>(dir)) - win), win_right(win - win::shift(win, -dp_directional<dpsite>(dir))), @@ -254,12 +254,12 @@ inline mln_ch_value(I, mln_result(A)) transform_directional_dispatch(trait::image::speed::any, - const Accumulator<A>& /* FIXME a */, + const Accumulator<A>& a, const Image<I>& input, const Window<W>& win, unsigned dir) { typedef directional_functor<I, W, A> F; - F f(exact(input), exact(win), dir); // FIXME: Pass a to f. + F f(exact(input), exact(win), exact(a), dir); canvas::browsing::directional(f); return f.output; } @@ -268,12 +268,12 @@ inline mln_ch_value(I, mln_result(A)) transform_directional_dispatch(trait::image::speed::fastest, - const Accumulator<A>& /* FIXME a*/, + const Accumulator<A>& a, const Image<I>& input, const Window<W>& win, unsigned dir) { typedef directional_fastest_functor<I, W, A> F; - F f(exact(input), exact(win), dir); // FIXME: Pass a to f. + F f(exact(input), exact(win), exact(a), dir); canvas::browsing::directional(f); return f.output; } Index: mln/accu/transform_diagonal.hh --- mln/accu/transform_diagonal.hh (revision 2885) +++ mln/accu/transform_diagonal.hh (working copy) @@ -62,13 +62,13 @@ template <typename A, typename I, typename W> mln_ch_value(I, mln_result(A)) - transform_diagonal(const Accumulator<A>&, + transform_diagonal(const Accumulator<A>& a, const Image<I>& input, const Window<W>& win); template <typename A, typename I, typename W> mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) - transform_diagonal(const Meta_Accumulator<A>&, + transform_diagonal(const Meta_Accumulator<A>& a, const Image<I>& input, const Window<W>& win); @@ -114,17 +114,15 @@ mln_psite(I) p; enum { dim = I::site::dim }; - unsigned dir; window2d win_left, win_right; mln_qiter(window2d) q_l, q_r; - diagonal_functor(const I& input, const W& win) + diagonal_functor(const I& input, const W& win, const A& a) : input(input), win(win), - accu(), - dir(dir), + accu(a), win_left(win::shift(win, dpsite(1, -1)) - win), win_right(win - win::shift(win, dpsite(1, -1))), q_l(win_left, p), @@ -178,17 +176,15 @@ mln_psite(I) p; enum { dim = I::site::dim }; - unsigned dir; window2d win_left, win_right; mln_qiter(window2d) q_l, q_r; - backdiagonal_functor(const I& input, const W& win) + backdiagonal_functor(const I& input, const W& win, const A& a) : input(input), win(win), - accu(), - dir(dir), + accu(a), win_left(win::shift(win, dpsite(-1, -1)) - win), win_right(win - win::shift(win, dpsite(-1, -1))), q_l(win_left, p), @@ -245,17 +241,15 @@ mln_psite(I) p; enum { dim = I::site::dim }; - unsigned dir; window2d win_left, win_right; mln_qixter(const I, window2d) q_l, q_r; - diagonal_fastest_functor(const I& input, const W& win) + diagonal_fastest_functor(const I& input, const W& win, const A& a) : input(input), win(win), - accu(), - dir(dir), + accu(a), win_left(win::shift(win, dpsite(1, -1)) - win), win_right(win - win::shift(win, dpsite(1, -1))), q_l(input, win_left, p), @@ -308,17 +302,15 @@ mln_psite(I) p; enum { dim = I::site::dim }; - unsigned dir; window2d win_left, win_right; mln_qixter(const I, window2d) q_l, q_r; - backdiagonal_fastest_functor(const I& input, const W& win) + backdiagonal_fastest_functor(const I& input, const W& win, const A& a) : input(input), win(win), - accu(), - dir(dir), + accu(a), win_left(win::shift(win, dpsite(-1, -1)) - win), win_right(win - win::shift(win, dpsite(-1, -1))), q_l(input, win_left, p), @@ -366,11 +358,11 @@ inline mln_ch_value(I, mln_result(A)) transform_diagonal_dispatch(trait::image::speed::any, - const Accumulator<A>& /* FIXME a */, + const Accumulator<A>& a, const Image<I>& input, const win::diag2d& win) { typedef diagonal_functor<I, win::diag2d, A> F; - F f(exact(input), win); // FIXME: Pass a to f. + F f(exact(input), win, exact(a)); canvas::browsing::diagonal2d(f); return f.output; } @@ -379,11 +371,11 @@ inline mln_ch_value(I, mln_result(A)) transform_diagonal_dispatch(trait::image::speed::any, - const Accumulator<A>& /* FIXME a */, + const Accumulator<A>& a, const Image<I>& input, const win::backdiag2d& win) { typedef backdiagonal_functor<I, win::backdiag2d, A> F; - F f(exact(input), win); // FIXME: Pass a to f. + F f(exact(input), win, exact(a)); canvas::browsing::backdiagonal2d(f); return f.output; } @@ -392,11 +384,11 @@ inline mln_ch_value(I, mln_result(A)) transform_diagonal_dispatch(trait::image::speed::fastest, - const Accumulator<A>& /* FIXME a*/, + const Accumulator<A>& a, const Image<I>& input, const win::diag2d& win) { typedef diagonal_fastest_functor<I, win::diag2d, A> F; - F f(exact(input), win); // FIXME: Pass a to f. + F f(exact(input), win, exact(a)); canvas::browsing::diagonal2d(f); return f.output; } @@ -405,11 +397,11 @@ inline mln_ch_value(I, mln_result(A)) transform_diagonal_dispatch(trait::image::speed::fastest, - const Accumulator<A>& /* FIXME a*/, + const Accumulator<A>& a, const Image<I>& input, const win::backdiag2d& win) { typedef backdiagonal_fastest_functor<I, win::backdiag2d, A> F; - F f(exact(input), win); // FIXME: Pass a to f. + F f(exact(input), win, exact(a)); canvas::browsing::backdiagonal2d(f); return f.output; } Index: mln/accu/transform_stop.hh Index: mln/accu/transform_snake.hh --- mln/accu/transform_snake.hh (revision 2885) +++ mln/accu/transform_snake.hh (working copy) @@ -60,12 +60,12 @@ template <typename A, typename I, typename W> mln_ch_value(I, mln_result(A)) - transform_snake(const Accumulator<A>&, const Image<I>& input, const Window<W>& win); + transform_snake(const Accumulator<A>& a, const Image<I>& input, const Window<W>& win); template <typename A, typename I, typename W> mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) - transform_snake(const Meta_Accumulator<A>&, const Image<I>& input, const Window<W>& win); + transform_snake(const Meta_Accumulator<A>& a, const Image<I>& input, const Window<W>& win); @@ -101,9 +101,10 @@ const I& input; const W& win; - mln_ch_value(I, mln_result(A)) output; A accu; + mln_ch_value(I, mln_result(A)) output; + mln_psite(I) p; window2d @@ -129,10 +130,10 @@ std::vector<move_fun> moves; std::vector<dpsite> dps; - transform_snake_functor(const Image<I>& input, const Window<W>& win) + transform_snake_functor(const Image<I>& input, const Window<W>& win, const Accumulator<A>& a) : input(exact(input)), win(exact(win)), - accu(), + accu(exact(a)), win_left_fwd(win::shift(win, mln::left) - win), win_right_fwd(win - win::shift(win, mln::left)), @@ -253,9 +254,10 @@ const I& input; const W& win; - mln_ch_value(I, mln_result(A)) output; A accu; + mln_ch_value(I, mln_result(A)) output; + mln_psite(I) p; window2d @@ -282,10 +284,10 @@ std::vector<move_fun> moves; std::vector<dpsite> dps; - transform_snake_fastest_functor(const I& input, const W& win) + transform_snake_fastest_functor(const I& input, const W& win, const A& a) : input(input), win(win), - accu(), + accu(a), win_left_fwd(win::shift(win, mln::left) - win), win_right_fwd(win - win::shift(win, mln::left)), @@ -394,11 +396,11 @@ inline mln_ch_value(I, mln_result(A)) transform_snake_dispatch(trait::image::speed::any, - const Accumulator<A>& /* FIXME a */, + const Accumulator<A>& a, const Image<I>& input, const Window<W>& win) { typedef transform_snake_functor<I, W, A> F; - F f(exact(input), exact(win)); // FIXME: Pass a to f. + F f(exact(input), exact(win), exact(a)); canvas::browsing::snake_generic(f); return f.output; } @@ -407,11 +409,11 @@ inline mln_ch_value(I, mln_result(A)) transform_snake_dispatch(trait::image::speed::fastest, - const Accumulator<A>& /* FIXME a*/, + const Accumulator<A>& a, const Image<I>& input, const Window<W>& win) { typedef transform_snake_fastest_functor<I, W, A> F; - F f(exact(input), exact(win)); // FIXME: Pass a to f. + F f(exact(input), exact(win), exact(a)); canvas::browsing::snake_generic(f); return f.output; } Index: mln/accu/compute.hh --- mln/accu/compute.hh (revision 2885) +++ mln/accu/compute.hh (working copy) @@ -142,15 +142,16 @@ template <typename A, typename I> inline mln_accu_with(A, util::pix<I>)::result - compute(const Meta_Accumulator<A>&, const Image<I>& input) + compute(const Meta_Accumulator<A>& a, const Image<I>& input) { trace::entering("accu::compute"); mln_precondition(exact(input).has_data()); typedef mln_accu_with(A, util::pix<I>) A_; - A_ a; - mln_result(A_) output = internal::compute_dispatch(a, input); + A_ a_ = accu::unmeta(exact(a), util::pix<I>()); + + mln_result(A_) output = internal::compute_dispatch(a_, input); trace::exiting("accu::compute"); return output; Index: mln/morpho/elementary/like_ero_fun.hh --- mln/morpho/elementary/like_ero_fun.hh (revision 2885) +++ mln/morpho/elementary/like_ero_fun.hh (working copy) @@ -1,4 +1,4 @@ -// Copyright (C) 2008 EPITA Research and Development Laboratory +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -48,7 +48,7 @@ template <typename A, typename F, typename I, typename N> mln_concrete(I) - like_ero_fun(const Meta_Accumulator<A>&, const F& f, + like_ero_fun(const Meta_Accumulator<A>& a, const F& f, const Image<I>& input, const Neighborhood<N>& nbh); @@ -79,7 +79,7 @@ template <typename A, typename F, typename I, typename N> mln_concrete(I) - like_ero_fun(const Meta_Accumulator<A>&, const F& f, + like_ero_fun(const Meta_Accumulator<A>& a_, const F& f, const Image<I>& input_, const Neighborhood<N>& nbh_) { trace::entering("morpho::elementary::impl::generic::like_ero_fun"); @@ -87,7 +87,7 @@ const I& input = exact(input_); const N& nbh = exact(nbh_); - mln_accu_with(A, mln_value(I)) a; + mln_accu_with(A, mln_value(I)) a = accu::unmeta(exact(a_), mln_value(I)()); extension::adjust_fill(input, nbh, a); mln_concrete(I) output; @@ -113,7 +113,7 @@ template <typename A, typename F, typename I, typename N> mln_concrete(I) - like_ero_fun_fastest(const Meta_Accumulator<A>&, const F& f, + like_ero_fun_fastest(const Meta_Accumulator<A>& a_, const F& f, const Image<I>& input_, const Neighborhood<N>& nbh_) { trace::entering("morpho::elementary::impl::like_ero_fun_fastest"); @@ -121,7 +121,7 @@ const I& input = exact(input_); const N& nbh = exact(nbh_); - mln_accu_with(A, mln_value(I)) a; + mln_accu_with(A, mln_value(I)) a = accu::unmeta(exact(a_), mln_value(I)()); extension::adjust_fill(input, nbh, a); mln_concrete(I) output; Index: mln/labeling/compute.hh --- mln/labeling/compute.hh (revision 2885) +++ mln/labeling/compute.hh (working copy) @@ -150,12 +150,14 @@ template <typename A, typename I, typename J> inline util::array<mln_accu_with(A, mln_value(I))::result> - compute(const Meta_Accumulator<A>&, + compute(const Meta_Accumulator<A>& a, const Image<I>& input, const Image<J>& label, mln_value(J) nlabels) { - mln_accu_with(A, mln_value(I)) accu; - return compute(accu, input, label, nlabels); + typedef mln_accu_with(A, mln_value(I)) A_; + A_ a_ = accu::unmeta(exact(a), mln_value(I)()); + + return compute(a_, input, label, nlabels); } @@ -190,11 +192,13 @@ template <typename A, typename J> inline util::array<mln_accu_with(A, mln_psite(J))::result> - compute(const Meta_Accumulator<A>&, + compute(const Meta_Accumulator<A>& a, const Image<J>& label, mln_value(J) nlabels) { - mln_accu_with(A, mln_psite(J)) accu; - return compute(accu, label, nlabels); + typedef mln_accu_with(A, mln_psite(J)) A_; + A_ a_ = accu::unmeta(exact(a), mln_psite(J)()); + + return compute(a_, label, nlabels); }
16 years, 1 month
1
0
0
0
2885: Introduce a dual graph class.
by Guillaume Lazzara
* mln/core/concept/graph.hh: does not force add_* methods. * mln/util/dual_graph.hh: new class. * mln/util/graph.hh: cleanup comments * mln/util/internal/graph_edge.hh: add missing operator<<. * mln/util/internal/graph_nbh_iter_base.hh, * mln/util/internal/graph_iter_base.hh: add operator unsigned(). * tests/util/Makefile.am, * tests/util/dual_graph.cc: Add a new test. --- milena/ChangeLog | 18 ++ milena/mln/core/concept/graph.hh | 2 - milena/mln/util/{graph.hh => dual_graph.hh} | 243 +++++++++++------------ milena/mln/util/graph.hh | 14 +- milena/mln/util/internal/graph_edge.hh | 19 ++- milena/mln/util/internal/graph_iter_base.hh | 11 + milena/mln/util/internal/graph_nbh_iter_base.hh | 10 + milena/tests/util/Makefile.am | 2 + milena/tests/util/dual_graph.cc | 164 +++++++++++++++ 9 files changed, 338 insertions(+), 145 deletions(-) copy milena/mln/util/{graph.hh => dual_graph.hh} (58%) create mode 100644 milena/tests/util/dual_graph.cc diff --git a/milena/ChangeLog b/milena/ChangeLog index c947990..809f727 100644 --- a/milena/ChangeLog +++ b/milena/ChangeLog @@ -1,3 +1,21 @@ +2008-11-17 Guillaume Lazzara <guillaume.lazzara(a)lrde.epita.fr> + + Introduce a dual graph class. + + * mln/core/concept/graph.hh: does not force add_* methods. + + * mln/util/dual_graph.hh: new class. + + * mln/util/graph.hh: cleanup comments + + * mln/util/internal/graph_edge.hh: add missing operator<<. + + * mln/util/internal/graph_nbh_iter_base.hh, + * mln/util/internal/graph_iter_base.hh: add operator unsigned(). + + * tests/util/Makefile.am, + * tests/util/dual_graph.cc: Add a new test. + 2008-11-14 Thierry Geraud <thierry.geraud(a)lrde.epita.fr> Factor code for erosion on lines. diff --git a/milena/mln/core/concept/graph.hh b/milena/mln/core/concept/graph.hh index c98d9e5..e89acc2 100644 --- a/milena/mln/core/concept/graph.hh +++ b/milena/mln/core/concept/graph.hh @@ -113,8 +113,6 @@ namespace mln m1 = 0; unsigned (E::*m2)(unsigned id_e, unsigned id_v) const = & E::v_other; m2 = 0; - unsigned (E::*m3)() = & E::add_vertex; - m3 = 0; size_t (E::*m4)() const = & E::v_nmax; m4 = 0; bool (E::*m5)(unsigned id_v) const = & E::has_v; diff --git a/milena/mln/util/graph.hh b/milena/mln/util/dual_graph.hh similarity index 58% copy from milena/mln/util/graph.hh copy to milena/mln/util/dual_graph.hh index dfcbc23..3533e7c 100644 --- a/milena/mln/util/graph.hh +++ b/milena/mln/util/dual_graph.hh @@ -1,4 +1,4 @@ -// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory +// Copyright (C) 2008 EPITA Research and Development Laboratory // (LRDE) // // This file is part of the Olena Library. This library is free @@ -26,10 +26,10 @@ // reasons why the executable file might be covered by the GNU General // Public License. -#ifndef MLN_UTIL_GRAPH_HH -# define MLN_UTIL_GRAPH_HH +#ifndef MLN_UTIL_DUAL_GRAPH_HH +# define MLN_UTIL_DUAL_GRAPH_HH -/// \file mln/util/graph.hh +/// \file mln/util/dual_graph.hh /// Definitions of undirected graphs. # include <mln/util/internal/graph_base.hh> @@ -43,7 +43,8 @@ namespace mln namespace util { /// Fwd declaration. - class graph; + template <typename G> + class dual_graph; } @@ -51,23 +52,22 @@ namespace mln { /// Data structure for \c mln::image2d<T>. - template <> - struct data<util::graph> + template <typename G> + struct data< util::dual_graph<G> > { - typedef util::graph G; + typedef std::vector<std::vector<unsigned> > vertices_t; typedef std::vector<util::ord_pair<unsigned> > edges_t; - typedef std::set<util::ord_pair<unsigned> > edges_set_t; data(); + data(const G& g); ~data(); + G g_; /// The vertices. vertices_t vertices_; /// The edges. edges_t edges_; - /// An index of the set of edges, for fast-access purpose. - edges_set_t edges_set_; }; } // end of namespace mln::internal @@ -76,14 +76,18 @@ namespace mln namespace util { - /// \brief Undirected graph. - class graph : public internal::graph_base<graph> + /// Undirected dual graph of a graph of type \tparam G. + template <typename G> + class dual_graph : public internal::graph_base< dual_graph<G> > { /// The super class. - typedef internal::graph_base<graph> super; + typedef internal::graph_base< dual_graph<G> > super; - using super::vertex_data_t; - using super::edge_data_t; + typedef typename super::vertex_t vertex_t; + typedef typename super::edge_t edge_t; + + typedef typename super::vertex_data_t vertex_data_t; + typedef typename super::edge_data_t edge_data_t; public: /// The type of the set of vertices. @@ -91,71 +95,46 @@ namespace mln /// The type of the set of edges. typedef std::vector<edge_data_t> edges_t; - /// A set to test the presence of a given edge. - typedef std::set<edge_data_t> edges_set_t; /// Iterator types /// \{ /// Vertex iterators /// \{ - typedef mln::internal::vertex_fwd_iterator<graph> vertex_fwd_iter; - typedef mln::internal::vertex_bkd_iterator<graph> vertex_bkd_iter; + typedef mln::internal::vertex_fwd_iterator< dual_graph<G> > + vertex_fwd_iter; + typedef mln::internal::vertex_bkd_iterator< dual_graph<G> > + vertex_bkd_iter; typedef vertex_fwd_iter vertex_iter; - /// \} - /// Vertex centered edge iterators - /// \{ - typedef mln::internal::vertex_nbh_edge_fwd_iterator<graph> vertex_nbh_edge_fwd_iter; - typedef mln::internal::vertex_nbh_edge_bkd_iterator<graph> vertex_nbh_edge_bkd_iter; - typedef vertex_nbh_edge_fwd_iter vertex_nbh_edge_iter; - /// \} - - /// Vertex centered vertex iterators - /// \{ - typedef mln::internal::vertex_nbh_vertex_fwd_iterator<graph> vertex_nbh_vertex_fwd_iter; - typedef mln::internal::vertex_nbh_vertex_bkd_iterator<graph> vertex_nbh_vertex_bkd_iter; - typedef vertex_nbh_vertex_fwd_iter vertex_nbh_vertex_iter; - /// \} - - /// Edge iterators - /// \{ - typedef mln::internal::edge_fwd_iterator<graph> edge_fwd_iter; - typedef mln::internal::edge_bkd_iterator<graph> edge_bkd_iter; + typedef mln::internal::edge_fwd_iterator< dual_graph<G> > + edge_fwd_iter; + typedef mln::internal::edge_bkd_iterator< dual_graph<G> > + edge_bkd_iter; typedef edge_fwd_iter edge_iter; - /// \} - /// Edge centered edge iterators. - /// \{ - typedef mln::internal::edge_nbh_edge_fwd_iterator<graph> edge_nbh_edge_fwd_iter; - typedef mln::internal::edge_nbh_edge_bkd_iterator<graph> edge_nbh_edge_bkd_iter; - typedef edge_nbh_edge_fwd_iter edge_nbh_edge_iter; /// \} /// \} - graph(); + dual_graph(); + dual_graph(const G& g); /// Vertex oriented. /// \{ /// Shortcuts factoring the insertion of vertices and edges. /// \{ - /// \brief Add a vertex. - /// - /// \return The id of the new vertex. - unsigned add_vertex(); - /// Return the vertex whose id is \a v. /// \{ vertex_t vertex(unsigned id_v) const; /// \} - /// \brief Return the number of vertices in the graph. + /// Return the number of vertices in the graph. size_t v_nmax() const; /// Check whether a vertex id \p id_v exists in the graph. bool has_v(unsigned id_v) const; /// Check whether an edge \p v exists in the graph. - template <typename G> - bool has_v(const util::vertex<G>& v) const; + template <typename G2> + bool has_v(const util::vertex<G2>& v) const; /// Return the number of adjacent edges of vertex \p id_v. @@ -176,23 +155,17 @@ namespace mln /// Edge oriented. /// \{ - /// \brief Add an edge. - /// - /// \return The id of the new edge if it does not exist yet; - /// otherwise, return <tt>mln_max(unsigned)</tt>. - unsigned add_edge(unsigned id_v1, unsigned id_v2); - /// Return the edge whose id is \a e. edge_t edge(unsigned e) const; - /// \brief Return the number of edges in the graph. + /// Return the number of edges in the graph. size_t e_nmax() const; /// Return whether \p id_e is in the graph. bool has_e(unsigned id_e) const; /// Return whether \p e is in the graph. - template <typename G> - bool has_e(const util::edge<G>& e) const; + template <typename G2> + bool has_e(const util::edge<G2>& e) const; /// Return the first vertex associated to the edge \p id_e. @@ -213,6 +186,8 @@ namespace mln bool is_subgraph_of(const G2& g) const; /// \} + protected: + using super::data_; }; } // end of namespace mln::util @@ -227,13 +202,32 @@ namespace mln namespace internal { + template <typename G> inline - data<util::graph>::data() + data< util::dual_graph<G> >::data() { } + template <typename G> inline - data<util::graph>::~data() + data< util::dual_graph<G> >::data(const G& g) + { + g_ = g; + vertices_.resize(g.e_nmax()); + mln_edge_iter(G) e(g); + mln_edge_nbh_edge_iter(G) ne(e); + + for_all(e) + for_all(ne) + { + vertices_[e].push_back(edges_.size()); + edges_.push_back(util::ord_pair<unsigned>(e, ne)); + } + } + + template <typename G> + inline + data< util::dual_graph<G> >::~data() { } @@ -242,69 +236,73 @@ namespace mln namespace util { + template <typename G> inline - graph::graph() + dual_graph<G>::dual_graph() { - this->data_ = new mln::internal::data<util::graph>(); + this->data_ = new mln::internal::data< util::dual_graph<G> >(); } - /*---------------. - | Vertex related | - `---------------*/ - + template <typename G> inline - unsigned - graph::add_vertex() + dual_graph<G>::dual_graph(const G& g) { - /* FIXME: This is not thread-proof (these two lines should - form an atomic section). */ - data_->vertices_.resize(data_->vertices_.size() + 1); - - return v_nmax() - 1; + this->data_ = new mln::internal::data< util::dual_graph<G> >(g); } + /*---------------. + | Vertex related | + `---------------*/ + + template <typename G> inline - graph::vertex_t - graph::vertex(unsigned id_v) const + typename dual_graph<G>::vertex_t + dual_graph<G>::vertex(unsigned id_v) const { mln_assertion(has_v(id_v)); return vertex_t(*this, id_v); } + template <typename G> inline size_t - graph::v_nmax() const + dual_graph<G>::v_nmax() const { - return data_->vertices_.size(); + return data_->g_.e_nmax(); } + template <typename G> inline bool - graph::has_v(unsigned id_v) const + dual_graph<G>::has_v(unsigned id_v) const { - return id_v < data_->vertices_.size(); + return data_->g_.has_e(id_v); } template <typename G> + template <typename G2> inline bool - graph::has_v(const util::vertex<G>& v) const + dual_graph<G>::has_v(const util::vertex<G2>& v) const { + //FIXME: not sure... return v.graph().is_subgraph_of(*this) && has_v(v.id()); } + template <typename G> inline size_t - graph::v_nmax_nbh_edges(unsigned id_v) const + dual_graph<G>::v_nmax_nbh_edges(unsigned id_v) const { mln_precondition(has_v(id_v)); - return data_->vertices_[id_v].size(); + return data_->g_.e_nmax_nbh_edges(id_v); } + template <typename G> inline unsigned - graph::v_ith_nbh_edge(unsigned id_v, unsigned i) const + dual_graph<G>::v_ith_nbh_edge(unsigned id_v, unsigned i) const { mln_precondition(has_v(id_v)); if (i >= v_nmax_nbh_edges(id_v)) @@ -312,22 +310,24 @@ namespace mln return data_->vertices_[id_v][i]; } + template <typename G> inline size_t - graph::v_nmax_nbh_vertices(unsigned id_v) const + dual_graph<G>::v_nmax_nbh_vertices(unsigned id_v) const { mln_precondition(has_v(id_v)); return v_nmax_nbh_edges(id_v); } + template <typename G> inline unsigned - graph::v_ith_nbh_vertex(unsigned id_v, unsigned i) const + dual_graph<G>::v_ith_nbh_vertex(unsigned id_v, unsigned i) const { mln_precondition(has_v(id_v)); - unsigned id_e = v_ith_nbh_edge(id_v, i); - return v_other(id_e, id_v); + unsigned id_e = this->v_ith_nbh_edge(id_v, i); + return this->v_other(id_e, id_v); } @@ -335,91 +335,71 @@ namespace mln | Edges related | `---------------*/ + template <typename G> inline - unsigned - graph::add_edge(unsigned id_v1, unsigned id_v2) - { - // Does this edge already exist in the graph? - edge_data_t edge(id_v1, id_v2); - if (data_->edges_set_.find(edge) != data_->edges_set_.end ()) - { - // Return the erroneous value. - return mln_max(unsigned); - } - else - { - // Otherwise insert it into the graph. - /* FIXME: This is not thread-proof (these two lines should - form an atomic section). */ - data_->edges_.push_back(edge); - unsigned id = data_->edges_.size() - 1; - - // Update the set of edges. - data_->edges_set_.insert(edge); - data_->vertices_[edge.first()].push_back(id); - data_->vertices_[edge.second()].push_back(id); - - return id; - } - } - - inline - graph::edge_t - graph::edge(unsigned e) const + typename dual_graph<G>::edge_t + dual_graph<G>::edge(unsigned e) const { mln_assertion(e < e_nmax()); return edge_t(*this, e); } + template <typename G> inline size_t - graph::e_nmax() const + dual_graph<G>::e_nmax() const { return data_->edges_.size(); } + template <typename G> inline bool - graph::has_e(unsigned id_e) const + dual_graph<G>::has_e(unsigned id_e) const { return id_e < data_->edges_.size(); } template <typename G> + template <typename G2> inline bool - graph::has_e(const util::edge<G>& e) const + dual_graph<G>::has_e(const util::edge<G2>& e) const { return e.graph().is_subgraph_of(*this) && has_e(e.id()); } + template <typename G> inline unsigned - graph::v1(unsigned id_e) const + dual_graph<G>::v1(unsigned id_e) const { mln_precondition(has_e(id_e)); return data_->edges_[id_e].first(); } + template <typename G> inline unsigned - graph::v2(unsigned id_e) const + dual_graph<G>::v2(unsigned id_e) const { mln_precondition(has_e(id_e)); return data_->edges_[id_e].second(); } + template <typename G> inline size_t - graph::e_nmax_nbh_edges(unsigned id_e) const + dual_graph<G>::e_nmax_nbh_edges(unsigned id_e) const { mln_precondition(has_e(id_e)); return v_nmax_nbh_edges(v1(id_e)) + v_nmax_nbh_edges(v2(id_e)); } + template <typename G> inline unsigned - graph::e_ith_nbh_edge(unsigned id_e, unsigned i) const + dual_graph<G>::e_ith_nbh_edge(unsigned id_e, unsigned i) const { mln_precondition(has_e(id_e)); if (i >= e_nmax_nbh_edges(id_e)) @@ -432,10 +412,11 @@ namespace mln } + template <typename G> template <typename G2> inline bool - graph::is_subgraph_of(const G2& g) const + dual_graph<G>::is_subgraph_of(const G2& g) const { return g.graph_id() == this->graph_id(); } @@ -447,4 +428,4 @@ namespace mln # endif // ! MLN_INCLUDE_ONLY -#endif // ! MLN_UTIL_GRAPH_HH +#endif // ! MLN_UTIL_DUAL_GRAPH_HH diff --git a/milena/mln/util/graph.hh b/milena/mln/util/graph.hh index dfcbc23..30b19bd 100644 --- a/milena/mln/util/graph.hh +++ b/milena/mln/util/graph.hh @@ -76,14 +76,14 @@ namespace mln namespace util { - /// \brief Undirected graph. + /// Undirected graph. class graph : public internal::graph_base<graph> { /// The super class. typedef internal::graph_base<graph> super; - using super::vertex_data_t; - using super::edge_data_t; + typedef super::vertex_data_t vertex_data_t; + typedef super::edge_data_t edge_data_t; public: /// The type of the set of vertices. @@ -138,7 +138,7 @@ namespace mln /// \{ /// Shortcuts factoring the insertion of vertices and edges. /// \{ - /// \brief Add a vertex. + /// Add a vertex. /// /// \return The id of the new vertex. unsigned add_vertex(); @@ -148,7 +148,7 @@ namespace mln vertex_t vertex(unsigned id_v) const; /// \} - /// \brief Return the number of vertices in the graph. + /// Return the number of vertices in the graph. size_t v_nmax() const; /// Check whether a vertex id \p id_v exists in the graph. @@ -176,7 +176,7 @@ namespace mln /// Edge oriented. /// \{ - /// \brief Add an edge. + /// Add an edge. /// /// \return The id of the new edge if it does not exist yet; /// otherwise, return <tt>mln_max(unsigned)</tt>. @@ -185,7 +185,7 @@ namespace mln /// Return the edge whose id is \a e. edge_t edge(unsigned e) const; - /// \brief Return the number of edges in the graph. + /// Return the number of edges in the graph. size_t e_nmax() const; /// Return whether \p id_e is in the graph. diff --git a/milena/mln/util/internal/graph_edge.hh b/milena/mln/util/internal/graph_edge.hh index 06e39d4..bab22d8 100644 --- a/milena/mln/util/internal/graph_edge.hh +++ b/milena/mln/util/internal/graph_edge.hh @@ -110,12 +110,16 @@ namespace mln }; template <typename G> + std::ostream& + operator<<(std::ostream& ostr, edge<G>& p); + + template <typename G> bool - operator==(const util::edge<G>& lhs, const util::edge<G>& rhs); + operator==(const edge<G>& lhs, const edge<G>& rhs); template <typename G> bool - operator< (const util::edge<G>& lhs, const util::edge<G>& rhs); + operator< (const edge<G>& lhs, const edge<G>& rhs); } // End of namespace mln::util @@ -283,12 +287,17 @@ namespace mln return g_.e_ith_nbh_edge(id_, i); } - + template <typename G> + std::ostream& + operator<<(std::ostream& ostr, edge<G>& p) + { + return ostr << p.id(); + } template <typename G> inline bool - operator==(const util::edge<G>& lhs, const util::edge<G>& rhs) + operator==(const edge<G>& lhs, const edge<G>& rhs) { return lhs.pair_vertex_ == rhs.pair_vertex_; } @@ -296,7 +305,7 @@ namespace mln template <typename G> inline bool - operator< (const util::edge<G>& lhs, const util::edge<G>& rhs) + operator< (const edge<G>& lhs, const edge<G>& rhs) { return lhs.pair_vertex_ < rhs.pair_vertex_; } diff --git a/milena/mln/util/internal/graph_iter_base.hh b/milena/mln/util/internal/graph_iter_base.hh index a901192..96777af 100644 --- a/milena/mln/util/internal/graph_iter_base.hh +++ b/milena/mln/util/internal/graph_iter_base.hh @@ -62,6 +62,9 @@ namespace mln /// Return current index unsigned index() const; + + /// Conversion operator. Returns the element id. + operator unsigned() const; /// \} /// Proxy. @@ -76,6 +79,7 @@ namespace mln P p_; }; + # ifndef MLN_INCLUDE_ONLY template <typename G, typename P, typename E> @@ -128,6 +132,13 @@ namespace mln template <typename G, typename P, typename E> inline + graph_iter_base<G, P, E>::operator unsigned() const + { + return p_.id(); + } + + template <typename G, typename P, typename E> + inline const P& graph_iter_base<G, P, E>::subj_() { diff --git a/milena/mln/util/internal/graph_nbh_iter_base.hh b/milena/mln/util/internal/graph_nbh_iter_base.hh index 14950a1..f6f02ea 100644 --- a/milena/mln/util/internal/graph_nbh_iter_base.hh +++ b/milena/mln/util/internal/graph_nbh_iter_base.hh @@ -61,6 +61,9 @@ namespace mln /// Return current index unsigned index() const; + + /// Conversion operator. Returns the element ID. + operator unsigned() const; /// \} /// Proxy. @@ -145,6 +148,13 @@ namespace mln template <typename G, typename C, typename P, typename E> inline + nbh_iterator_base<G, C, P, E>::operator unsigned() const + { + return p_.id(); + } + + template <typename G, typename C, typename P, typename E> + inline const P& nbh_iterator_base<G, C, P, E>::subj_() { diff --git a/milena/tests/util/Makefile.am b/milena/tests/util/Makefile.am index d0fe4be..fcfb902 100644 --- a/milena/tests/util/Makefile.am +++ b/milena/tests/util/Makefile.am @@ -6,6 +6,7 @@ include $(top_srcdir)/milena/tests/tests.mk check_PROGRAMS = \ branch_iter \ branch_iter_ind \ + dual_graph \ eat \ graph \ lazy_set \ @@ -19,6 +20,7 @@ check_PROGRAMS = \ branch_iter_SOURCES = branch_iter.cc branch_iter_ind_SOURCES = branch_iter_ind.cc +dual_graph_SOURCES = dual_graph.cc eat_SOURCES = eat.cc graph_SOURCES = graph.cc lazy_set_SOURCES = lazy_set.cc diff --git a/milena/tests/util/dual_graph.cc b/milena/tests/util/dual_graph.cc new file mode 100644 index 0000000..ff8c8ad --- /dev/null +++ b/milena/tests/util/dual_graph.cc @@ -0,0 +1,164 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) +// +// 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/util/dual_graph.cc +/// test of mln::util::dual_graph + +#include <mln/util/graph.hh> +#include <mln/util/dual_graph.hh> +#include <iostream> + +int main () +{ + using namespace mln; + + util::graph g; + + g.add_vertex (); // 0 + g.add_vertex (); // 1 + g.add_vertex (); // 2 + g.add_vertex (); // 3 + g.add_vertex (); // 4 + g.add_vertex (); // 5 + g.add_edge (0, 1); + g.add_edge (1, 0); // Not inserted twice + g.add_edge (0, 2); + g.add_edge (3, 4); + g.add_edge (4, 5); + g.add_edge (5, 4); // Not inserted twice + g.add_edge (5, 3); + g.add_edge (2, 1); + + typedef util::dual_graph<util::graph> DG; + DG dg(g); + + // Vertex iter and edge iter + { + unsigned i = 0; + mln_vertex_fwd_iter_(DG) v(dg); + for_all(v) + std::cout << v.index() << std::endl; +// mln_assertion(i++ == v.index()); + //mln_assertion(i != 0); + + i = 0; + mln_edge_fwd_iter_(util::graph) e(g); + for_all(e) + std::cout << e << std::endl; +// mln_assertion(i++ == e.index()); +// mln_assertion(i != 0);*/ + } +/* { + unsigned i = g.v_nmax() - 1; + mln_vertex_bkd_iter_(util::graph) v(g); + for_all(v) + mln_assertion(i-- == v.index()); + mln_assertion(i != g.v_nmax() - 1); + + i = g.e_nmax() - 1; + mln_edge_bkd_iter_(util::graph) e(g); + for_all(e) + mln_assertion(i-- == e.index()); + mln_assertion(i != g.e_nmax() - 1); + } + + // vertex iter + Edge nbh iter + { + mln_vertex_fwd_iter_(util::graph) v(g); + mln_vertex_nbh_edge_fwd_iter_(util::graph) n(v); + for_all(v) + { + unsigned i = 0; + for_all(n) + mln_assertion(i++ == n.index()); + mln_assertion(i != 0); + } + } + { + mln_vertex_bkd_iter_(util::graph) v(g); + mln_vertex_nbh_edge_bkd_iter_(util::graph) e(v); + for_all(v) + { + unsigned i = v.nmax_nbh_edges(); + for_all(e) + mln_assertion(--i == e.index()); + mln_assertion((v.nmax_nbh_edges() == 0 && i == 0) || i != v.nmax_nbh_edges()); + } + } + + { + mln_edge_fwd_iter_(util::graph) e(g); + mln_edge_nbh_edge_fwd_iter_(util::graph) n(e); + for_all(e) + { + unsigned i = 0; + for_all(n) + ++i; + // we check i == e.nmax_nbh_edges() - 2 since e is it's own neighboor and the + // iterator skip it. + mln_assertion((i == 0 && e.nmax_nbh_edges() < 2) || i == e.nmax_nbh_edges() - 2); + } + } + { + mln_edge_bkd_iter_(util::graph) e(g); + mln_edge_nbh_edge_bkd_iter_(util::graph) n(e); + for_all(e) + { + //std::cout << "== e.id() = " << e.id() << std::endl; + unsigned i = e.nmax_nbh_edges(); + for_all(n) + --i; + // we check i == e.nmax_nbh_edges() - 2 since e is it's own neighboor and the + // iterator skip it. + mln_assertion((i == e.nmax_nbh_edges() && e.nmax_nbh_edges() < 2) || i == 2); + + } + } + + { + mln_vertex_fwd_iter_(util::graph) v(g); + mln_vertex_nbh_vertex_fwd_iter_(util::graph) n(v); + for_all(v) + { + unsigned i = 0; + for_all(n) + ++i; + mln_assertion(i == v.nmax_nbh_vertices()); + } + } + { + mln_vertex_bkd_iter_(util::graph) v(g); + mln_vertex_nbh_vertex_bkd_iter_(util::graph) n(v); + for_all(v) + { + unsigned i = v.nmax_nbh_vertices(); + for_all(n) + --i; + mln_assertion(i == 0); + } + }*/ +} -- 1.5.6.5
16 years, 1 month
1
0
0
0
cleanup-2008 2883: Factor code for erosion on lines.
by Thierry Geraud
https://svn.lrde.epita.fr/svn/oln/branches/cleanup-2008/milena
Index: ChangeLog from Thierry Geraud <thierry.geraud(a)lrde.epita.fr> Factor code for erosion on lines. * mln/accu/transform_directional.hh (include): Layout. (output): Fix typedef. * mln/accu/transform_diagonal.hh: Likewise. Fix declaration signature. * tests/accu/transform_directional.cc: New. * tests/accu/transform_diagonal.cc: New. * mln/accu/all.hh: Update. * mln/morpho/erosion.spe.hh (erosion_dispatch_wrt_win): Handle the case win.size == 1. Remove useless qualif morpho::. (erosion_dispatch_wrt_win): Factor code for hline2d and vline2d into... (erosion_dispatch_line): ...this new overloaded routine. (erosion_dispatch_diagonal): Remove check on kind::logic cause it also works on this case. To be consistent: * mln/accu/snake_2d.hh: Rename as... * mln/accu/transform_snake.hh: ...this. * mln/morpho/erosion.spe.hh (erosion_arbitrary_2d): Update. * mln/morpho/includes.hh: Update. * tests/accu/snake_2d.cc: Rename as... * tests/accu/transform_snake.cc: ...this. * tests/accu/Makefile.am: Update. mln/accu/all.hh | 5 +- mln/accu/transform_diagonal.hh | 15 +++--- mln/accu/transform_directional.hh | 5 +- mln/accu/transform_snake.hh | 64 ++++++++++++++-------------- mln/morpho/erosion.spe.hh | 82 +++++++----------------------------- mln/morpho/includes.hh | 3 - tests/accu/Makefile.am | 8 ++- tests/accu/transform_diagonal.cc | 23 +++++++--- tests/accu/transform_directional.cc | 12 +++-- tests/accu/transform_snake.cc | 8 +-- 10 files changed, 98 insertions(+), 127 deletions(-) Index: tests/accu/transform_snake.cc --- tests/accu/transform_snake.cc (revision 2882) +++ tests/accu/transform_snake.cc (working copy) @@ -25,12 +25,12 @@ // reasons why the executable file might be covered by the GNU General // Public License. -/// \file tests/accu/snake_2d.cc +/// \file tests/accu/transform_snake.cc /// -/// Tests on mln::accu::snake_2d. +/// Tests on mln::accu::transform_snake. #include <mln/core/image/image2d.hh> -#include <mln/accu/snake_2d.hh> +#include <mln/accu/transform_snake.hh> #include <mln/accu/count.hh> #include <mln/win/rectangle2d.hh> #include <mln/pw/all.hh> @@ -45,7 +45,7 @@ win::rectangle2d rec(3, 3); image2d<unsigned> - out = accu::snake_2d(accu::meta::count(), ima, rec), + out = accu::transform_snake(accu::meta::count(), ima, rec), ref(ima.domain()); mln_assertion(out == (pw::cst(rec.size()) | ima.domain())); Property changes on: tests/accu/transform_snake.cc ___________________________________________________________________ Added: svn:mergeinfo Index: tests/accu/transform_diagonal.cc --- tests/accu/transform_diagonal.cc (revision 2882) +++ tests/accu/transform_diagonal.cc (working copy) @@ -25,14 +25,13 @@ // reasons why the executable file might be covered by the GNU General // Public License. -/// \file tests/accu/snake_2d.cc +/// \file tests/accu/transform_diagonal.cc /// -/// Tests on mln::accu::snake_2d. +/// Tests on mln::accu::transform_diagonal. #include <mln/core/image/image2d.hh> -#include <mln/accu/snake_2d.hh> +#include <mln/accu/transform_diagonal.hh> #include <mln/accu/count.hh> -#include <mln/win/rectangle2d.hh> #include <mln/pw/all.hh> #include <mln/level/compare.hh> @@ -42,11 +41,21 @@ using namespace mln; image2d<int> ima(4, 5); - win::rectangle2d rec(3, 3); + { + win::diag2d w(3); image2d<unsigned> - out = accu::snake_2d(accu::meta::count(), ima, rec), + out = accu::transform_diagonal(accu::meta::count(), ima, w), ref(ima.domain()); + mln_assertion(out == (pw::cst(w.size()) | ima.domain())); + } + + { + win::backdiag2d w(3); + image2d<unsigned> + out = accu::transform_diagonal(accu::meta::count(), ima, w), + ref(ima.domain()); + mln_assertion(out == (pw::cst(w.size()) | ima.domain())); + } - mln_assertion(out == (pw::cst(rec.size()) | ima.domain())); } Property changes on: tests/accu/transform_diagonal.cc ___________________________________________________________________ Added: svn:mergeinfo Index: tests/accu/Makefile.am --- tests/accu/Makefile.am (revision 2882) +++ tests/accu/Makefile.am (working copy) @@ -19,8 +19,10 @@ nil \ pair \ rank \ - snake_2d \ transform \ + transform_diagonal \ + transform_directional \ + transform_snake \ tuple all_accus_SOURCES = all_accus.cc @@ -39,8 +41,10 @@ nil_SOURCES = nil.cc pair_SOURCES = pair.cc rank_SOURCES = rank.cc -snake_2d_SOURCES = snake_2d.cc transform_SOURCES = transform.cc +transform_diagonal_SOURCES = transform_diagonal.cc +transform_directional_SOURCES = transform_directional.cc +transform_snake_SOURCES = transform_snake.cc tuple_SOURCES = tuple.cc TESTS = $(check_PROGRAMS) Index: tests/accu/transform_directional.cc --- tests/accu/transform_directional.cc (revision 2882) +++ tests/accu/transform_directional.cc (working copy) @@ -25,12 +25,12 @@ // reasons why the executable file might be covered by the GNU General // Public License. -/// \file tests/accu/snake_2d.cc +/// \file tests/accu/transform_directional.cc /// -/// Tests on mln::accu::snake_2d. +/// Tests on mln::accu::transform_directional. #include <mln/core/image/image2d.hh> -#include <mln/accu/snake_2d.hh> +#include <mln/accu/transform_directional.hh> #include <mln/accu/count.hh> #include <mln/win/rectangle2d.hh> #include <mln/pw/all.hh> @@ -44,9 +44,11 @@ image2d<int> ima(4, 5); win::rectangle2d rec(3, 3); + for (unsigned dir = 0; dir < 2; ++dir) + { image2d<unsigned> - out = accu::snake_2d(accu::meta::count(), ima, rec), + out = accu::transform_directional(accu::meta::count(), ima, rec, dir), ref(ima.domain()); - mln_assertion(out == (pw::cst(rec.size()) | ima.domain())); } +} Property changes on: tests/accu/transform_directional.cc ___________________________________________________________________ Added: svn:mergeinfo Index: mln/accu/transform_directional.hh --- mln/accu/transform_directional.hh (revision 2882) +++ mln/accu/transform_directional.hh (working copy) @@ -40,6 +40,7 @@ #include <mln/core/concept/image.hh> #include <mln/core/concept/meta_accumulator.hh> #include <mln/core/alias/window2d.hh> +# include <mln/win/diff.hh> #include <mln/win/shift.hh> #include <mln/geom/delta.hh> #include <mln/literal/zero.hh> @@ -119,7 +120,7 @@ const I& input; const W& win; - mln_concrete(I) output; + mln_ch_value(I, mln_result(A)) output; A accu; enum { dim = I::site::dim }; @@ -190,7 +191,7 @@ const I& input; const W& win; - mln_concrete(I) output; + mln_ch_value(I, mln_result(A)) output; A accu; mln_psite(I) p; Index: mln/accu/all.hh --- mln/accu/all.hh (revision 2882) +++ mln/accu/all.hh (working copy) @@ -80,9 +80,12 @@ // Routines. # include <mln/accu/convolve.hh> -# include <mln/accu/snake_2d.hh> # include <mln/accu/transform.hh> # include <mln/accu/transform_stop.hh> +# include <mln/accu/transform_directional.hh> +# include <mln/accu/transform_diagonal.hh> +# include <mln/accu/transform_snake.hh> + #endif // ! MLN_ACCU_ALL_HH Index: mln/accu/transform_diagonal.hh --- mln/accu/transform_diagonal.hh (revision 2882) +++ mln/accu/transform_diagonal.hh (working copy) @@ -40,6 +40,7 @@ #include <mln/core/concept/image.hh> #include <mln/core/concept/meta_accumulator.hh> #include <mln/core/alias/window2d.hh> +#include <mln/win/diff.hh> #include <mln/win/shift.hh> #include <mln/geom/delta.hh> #include <mln/extension/adjust.hh> @@ -62,15 +63,13 @@ template <typename A, typename I, typename W> mln_ch_value(I, mln_result(A)) transform_diagonal(const Accumulator<A>&, - const Image<I>& input, const Window<W>& win, - unsigned dir); + const Image<I>& input, const Window<W>& win); template <typename A, typename I, typename W> mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) transform_diagonal(const Meta_Accumulator<A>&, - const Image<I>& input, const Window<W>& win, - unsigned dir); + const Image<I>& input, const Window<W>& win); @@ -110,7 +109,7 @@ const I& input; const W& win; - mln_concrete(I) output; + mln_ch_value(I, mln_result(A)) output; A accu; mln_psite(I) p; @@ -174,7 +173,7 @@ const I& input; const W& win; - mln_concrete(I) output; + mln_ch_value(I, mln_result(A)) output; A accu; mln_psite(I) p; @@ -241,7 +240,7 @@ const I& input; const W& win; - mln_concrete(I) output; + mln_ch_value(I, mln_result(A)) output; A accu; mln_psite(I) p; @@ -304,7 +303,7 @@ const I& input; const W& win; - mln_concrete(I) output; + mln_ch_value(I, mln_result(A)) output; A accu; mln_psite(I) p; Index: mln/accu/transform_snake.hh --- mln/accu/transform_snake.hh (revision 2882) +++ mln/accu/transform_snake.hh (working copy) @@ -25,15 +25,13 @@ // reasons why the executable file might be covered by the GNU General // Public License. -#ifndef MLN_ACCU_SNAKE_2D_HH -# define MLN_ACCU_SNAKE_2D_HH +#ifndef MLN_ACCU_TRANSFORM_SNAKE_HH +# define MLN_ACCU_TRANSFORM_SNAKE_HH -/// \file mln/accu/snake_2d.hh +/// \file mln/accu/transform_snake.hh /// /// Run an accumulator in a snake-like browsing. /// -/// \todo Rename as transform_snake_2d. -/// /// \todo Make it n-D. /// /// \todo Split dispatch and impl. @@ -47,6 +45,8 @@ #include <mln/win/shift.hh> #include <mln/geom/delta.hh> #include <mln/extension/adjust.hh> + +# include <mln/canvas/browsing/snake_fwd.hh> #include <mln/canvas/browsing/snake_generic.hh> @@ -60,12 +60,12 @@ template <typename A, typename I, typename W> mln_ch_value(I, mln_result(A)) - snake_2d(const Accumulator<A>&, const Image<I>& input, const Window<W>& win); + transform_snake(const Accumulator<A>&, const Image<I>& input, const Window<W>& win); template <typename A, typename I, typename W> mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) - snake_2d(const Meta_Accumulator<A>&, const Image<I>& input, const Window<W>& win); + transform_snake(const Meta_Accumulator<A>&, const Image<I>& input, const Window<W>& win); @@ -76,7 +76,7 @@ template <typename I, typename W> - void snake_2d_tests(const Image<I>& input_, const Window<W>& win_) + void transform_snake_tests(const Image<I>& input_, const Window<W>& win_) { const I& input = exact(input_); const W& win = exact(win_); @@ -93,9 +93,9 @@ // Functor. template <typename I, typename W, typename A> - struct snake_2d_functor + struct transform_snake_functor { - typedef snake_2d_functor<I,W, A> self; + typedef transform_snake_functor<I,W, A> self; typedef void (self::*move_fun)(); typedef mln_deduce(I, psite, delta) dpsite; @@ -129,7 +129,7 @@ std::vector<move_fun> moves; std::vector<dpsite> dps; - snake_2d_functor(const Image<I>& input, const Window<W>& win) + transform_snake_functor(const Image<I>& input, const Window<W>& win) : input(exact(input)), win(exact(win)), accu(), @@ -245,15 +245,15 @@ // Functor (fastest version). template <typename I, typename W, typename A> - struct snake_2d_fastest_functor + struct transform_snake_fastest_functor { - typedef snake_2d_fastest_functor<I,W,A> self; + typedef transform_snake_fastest_functor<I,W,A> self; typedef void (self::*move_fun)(); typedef mln_deduce(I, psite, delta) dpsite; const I& input; const W& win; - mln_concrete(I) output; + mln_ch_value(I, mln_result(A)) output; A accu; mln_psite(I) p; @@ -282,7 +282,7 @@ std::vector<move_fun> moves; std::vector<dpsite> dps; - snake_2d_fastest_functor(const I& input, const W& win) + transform_snake_fastest_functor(const I& input, const W& win) : input(input), win(win), accu(), @@ -393,11 +393,11 @@ template <typename A, typename I, typename W> inline mln_ch_value(I, mln_result(A)) - snake_2d_dispatch(trait::image::speed::any, + transform_snake_dispatch(trait::image::speed::any, const Accumulator<A>& /* FIXME a */, const Image<I>& input, const Window<W>& win) { - typedef snake_2d_functor<I, W, A> F; + typedef transform_snake_functor<I, W, A> F; F f(exact(input), exact(win)); // FIXME: Pass a to f. canvas::browsing::snake_generic(f); return f.output; @@ -406,11 +406,11 @@ template <typename A, typename I, typename W> inline mln_ch_value(I, mln_result(A)) - snake_2d_dispatch(trait::image::speed::fastest, + transform_snake_dispatch(trait::image::speed::fastest, const Accumulator<A>& /* FIXME a*/, const Image<I>& input, const Window<W>& win) { - typedef snake_2d_fastest_functor<I, W, A> F; + typedef transform_snake_fastest_functor<I, W, A> F; F f(exact(input), exact(win)); // FIXME: Pass a to f. canvas::browsing::snake_generic(f); return f.output; @@ -419,10 +419,10 @@ template <typename A, typename I, typename W> inline mln_ch_value(I, mln_result(A)) - snake_2d_dispatch(const Accumulator<A>& a, + transform_snake_dispatch(const Accumulator<A>& a, const Image<I>& input, const Window<W>& win) { - return snake_2d_dispatch(mln_trait_image_speed(I)(), + return transform_snake_dispatch(mln_trait_image_speed(I)(), a, input, win); } @@ -434,18 +434,18 @@ template <typename A, typename I, typename W> inline mln_ch_value(I, mln_result(A)) - snake_2d(const Accumulator<A>& a, + transform_snake(const Accumulator<A>& a, const Image<I>& input, const Window<W>& win) { - trace::entering("accu::snake_2d"); + trace::entering("accu::transform_snake"); - internal::snake_2d_tests(input, win); + internal::transform_snake_tests(input, win); extension::adjust(input, geom::delta(win) + 1); mln_ch_value(I, mln_result(A)) output; - output = internal::snake_2d_dispatch(a, input, win); + output = internal::transform_snake_dispatch(a, input, win); - trace::exiting("accu::snake_2d"); + trace::exiting("accu::transform_snake"); return output; } @@ -453,21 +453,21 @@ template <typename A, typename I, typename W> inline mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) - snake_2d(const Meta_Accumulator<A>& a, + transform_snake(const Meta_Accumulator<A>& a, const Image<I>& input, const Window<W>& win) { - trace::entering("accu::snake_2d"); + trace::entering("accu::transform_snake"); - internal::snake_2d_tests(input, win); + internal::transform_snake_tests(input, win); typedef mln_accu_with(A, mln_value(I)) A_; A_ a_ = accu::unmeta(exact(a), mln_value(I)()); extension::adjust(input, geom::delta(win) + 1); mln_ch_value(I, mln_result(A_)) output; - output = internal::snake_2d_dispatch(a_, input, win); + output = internal::transform_snake_dispatch(a_, input, win); - trace::exiting("accu::snake_2d"); + trace::exiting("accu::transform_snake"); return output; } @@ -479,4 +479,4 @@ } // end of namespace mln -#endif // ! MLN_ACCU_SNAKE_2D_HH +#endif // ! MLN_ACCU_TRANSFORM_SNAKE_HH Index: mln/morpho/erosion.spe.hh --- mln/morpho/erosion.spe.hh (revision 2882) +++ mln/morpho/erosion.spe.hh (working copy) @@ -39,18 +39,9 @@ # include <mln/win/octagon2d.hh> # include <mln/win/rectangle2d.hh> -# include <mln/win/shift.hh> -# include <mln/win/diff.hh> - # include <mln/accu/min_h.hh> # include <mln/accu/line.hh> -# include <mln/canvas/browsing/snake_fwd.hh> -# include <mln/canvas/browsing/snake_generic.hh> -# include <mln/canvas/browsing/directional.hh> -# include <mln/canvas/browsing/diagonal2d.hh> -# include <mln/canvas/browsing/backdiagonal2d.hh> - /// \file mln/morpho/erosion.spe.hh /// @@ -269,7 +260,7 @@ A a; extension::adjust_fill(input, geom::delta(win) + 1, a); - mln_concrete(I) output = accu::snake_2d(a, input, win); + mln_concrete(I) output = accu::transform_snake(a, input, win); trace::exiting("morpho::impl:erosion_arbitrary_2d"); return output; @@ -408,9 +399,10 @@ mln_concrete(I) erosion_dispatch_wrt_win(const I& input, const win::rectangle2d& win) { + if (win.size() == 1) + return clone(input); if (win.size() <= 9) // FIXME: Hard-coded! return erosion_dispatch_for_generic(input, win); - else return impl::erosion_rectangle2d(input, win); } @@ -420,74 +412,35 @@ erosion_dispatch_wrt_win(const I& input, const win::octagon2d& win) { if (win.length() < 5) - return morpho::impl::erosion_arbitrary_2d(input, win); + return impl::erosion_arbitrary_2d(input, win); else return impl::erosion_octagon2d(input, win); } - /// Handling win::hline2d. - /// \{ - - template <typename I> - mln_concrete(I) - erosion_dispatch_wrt_win(metal::true_, - const I& input, const win::hline2d& win) - { - return impl::erosion_directional(input, win, 1); - } - - template <typename I> - mln_concrete(I) - erosion_dispatch_wrt_win(metal::false_, - const I& input, const win::hline2d& win) - { - return erosion_dispatch_for_generic(input, win); - } - - template <typename I> - mln_concrete(I) - erosion_dispatch_wrt_win(const I& input, const win::hline2d& win) - { - if (win.size() == 1) - return clone(input); - else if (win.size() == 3) - return erosion_dispatch_for_generic(input, win); - else - { - enum { test = mlc_is_a(mln_pset(I), Box)::value - && mlc_equal(mln_trait_image_quant(I), - mln::trait::image::quant::low)::value }; - return erosion_dispatch_wrt_win(metal::bool_<test>(), - input, win); - } - } - - /// \} - - /// Handling win::vline2d. + /// Handling win::line(s). /// \{ - template <typename I> + template <typename I, typename W> mln_concrete(I) - erosion_dispatch_wrt_win(metal::true_, - const I& input, const win::vline2d& win) + erosion_dispatch_line(metal::true_, + const I& input, const W& win) { - return impl::erosion_directional(input, win, 0); + return impl::erosion_directional(input, win, W::dir); } - template <typename I> + template <typename I, typename W> mln_concrete(I) - erosion_dispatch_wrt_win(metal::false_, - const I& input, const win::vline2d& win) + erosion_dispatch_line(metal::false_, + const I& input, const W& win) { return erosion_dispatch_for_generic(input, win); } - template <typename I> + template <typename I, typename M, unsigned i, typename C> mln_concrete(I) - erosion_dispatch_wrt_win(const I& input, const win::vline2d& win) + erosion_dispatch_wrt_win(const I& input, const win::line<M,i,C>& win) { if (win.size() == 1) return clone(input); @@ -498,7 +451,7 @@ enum { test = mlc_is_a(mln_pset(I), Box)::value && mlc_equal(mln_trait_image_quant(I), mln::trait::image::quant::low)::value }; - return erosion_dispatch_wrt_win(metal::bool_<test>(), + return erosion_dispatch_line(metal::bool_<test>(), input, win); } } @@ -537,9 +490,7 @@ return erosion_dispatch_for_generic(input, win); else { - enum { test = mlc_is_not(mln_trait_image_kind(I), - mln::trait::image::kind::logic)::value - && mlc_is_a(mln_pset(I), Box)::value + enum { test = mlc_is_a(mln_pset(I), Box)::value && mlc_equal(mln_trait_image_quant(I), mln::trait::image::quant::low)::value }; return erosion_dispatch_diagonal(metal::bool_<test>(), @@ -565,6 +516,7 @@ /// \} + // The dispatch entry point. template <typename I, typename W> Index: mln/morpho/includes.hh --- mln/morpho/includes.hh (revision 2882) +++ mln/morpho/includes.hh (working copy) @@ -51,11 +51,12 @@ # include <mln/accu/max_h.hh> # include <mln/accu/rank.hh> -# include <mln/accu/snake_2d.hh> # include <mln/accu/transform.hh> # include <mln/accu/transform_stop.hh> + # include <mln/accu/transform_directional.hh> # include <mln/accu/transform_diagonal.hh> +# include <mln/accu/transform_snake.hh> # include <mln/fun/v2v/saturate.hh>
16 years, 1 month
1
0
0
0
cleanup-2008 2882: Move diagonal-related code out of erosion, then factor.
by Thierry Geraud
https://svn.lrde.epita.fr/svn/oln/branches/cleanup-2008/milena
Index: ChangeLog from Thierry Geraud <thierry.geraud(a)lrde.epita.fr> Move diagonal-related code out of erosion, then factor. * mln/accu/transform_diagonal.hh: New file. * mln/morpho/erosion.spe.hh (erosion_diagonal2d_functor), (erosion_diagonal2d_fastest_functor), (erosion_backdiagonal2d_functor), (erosion_backdiagonal2d_fastest_functor): Move and rename as... * mln/accu/transform_diagonal.hh (diagonal_functor, diagonal_fastest_functor), (backdiagonal_functor, backdiagonal_fastest_functor): ...these. * mln/morpho/erosion.spe.hh (erosion_diagonal2d): Rename as... (erosion_diagonal_2d): ...this; it is the only impl routine. (erosion_backdiagonal2d), (erosion_diagonal2d_fastest), (erosion_backdiagonal2d_fastest): Remove these impl routines. Thanks to factorization in accu::transform_diagonal, those are now useless. (erosion_dispatch_for_diagonal2d), (erosion_dispatch_for_backdiagonal2d): Factor into... (erosion_dispatch_diagonal): ...this new dispatch routine. Now both diagonals are handled by the same code. * mln/morpho/includes.hh: Update. * mln/accu/transform_directional.hh (diff): Remove useless include. * mln/win/line.hh: Upgrade doc style. (dir): New constant. accu/transform_diagonal.hh | 481 ++++++++++++++++++++++++++++++++++++++++++ accu/transform_directional.hh | 1 morpho/erosion.spe.hh | 468 +++------------------------------------- morpho/includes.hh | 1 win/line.hh | 17 - 5 files changed, 526 insertions(+), 442 deletions(-) Index: mln/accu/transform_directional.hh --- mln/accu/transform_directional.hh (revision 2881) +++ mln/accu/transform_directional.hh (working copy) @@ -40,7 +40,6 @@ #include <mln/core/concept/image.hh> #include <mln/core/concept/meta_accumulator.hh> #include <mln/core/alias/window2d.hh> -#include <mln/win/diff.hh> #include <mln/win/shift.hh> #include <mln/geom/delta.hh> #include <mln/literal/zero.hh> Index: mln/accu/transform_diagonal.hh --- mln/accu/transform_diagonal.hh (revision 0) +++ mln/accu/transform_diagonal.hh (revision 0) @@ -0,0 +1,481 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 51 Franklin Street, Fifth Floor, +// Boston, MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + +#ifndef MLN_ACCU_TRANSFORM_DIAGONAL_HH +# define MLN_ACCU_TRANSFORM_DIAGONAL_HH + +/// \file mln/accu/transform_diagonal.hh +/// +/// Run an accumulator over a diagonal. +/// +/// \todo Split dispatch and impl. +/// +/// \todo Pass the accumulator to the function-object. + + +#include <mln/core/concept/image.hh> +#include <mln/core/concept/meta_accumulator.hh> +#include <mln/core/alias/window2d.hh> +#include <mln/win/shift.hh> +#include <mln/geom/delta.hh> +#include <mln/extension/adjust.hh> + +#include <mln/win/diag2d.hh> +#include <mln/canvas/browsing/diagonal2d.hh> + +#include <mln/win/backdiag2d.hh> +#include <mln/canvas/browsing/backdiagonal2d.hh> + + + +namespace mln +{ + + namespace accu + { + + + template <typename A, typename I, typename W> + mln_ch_value(I, mln_result(A)) + transform_diagonal(const Accumulator<A>&, + const Image<I>& input, const Window<W>& win, + unsigned dir); + + + template <typename A, typename I, typename W> + mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) + transform_diagonal(const Meta_Accumulator<A>&, + const Image<I>& input, const Window<W>& win, + unsigned dir); + + + +# ifndef MLN_INCLUDE_ONLY + + namespace internal + { + + + // Tests. + + + template <typename I, typename W> + void transform_diagonal_tests(const Image<I>& input_, const Window<W>& win_) + { + const I& input = exact(input_); + const W& win = exact(win_); + + mln_precondition(input.has_data()); + mln_precondition(! win.is_empty()); + // mln_precondition(! win.is_valid()); + + (void) input; + (void) win; + } + + + + // Functors. + + + template <typename I_, typename W, typename A> + struct diagonal_functor + { + typedef I_ I; + typedef mln_deduce(I, psite, delta) dpsite; + + const I& input; + const W& win; + mln_concrete(I) output; + A accu; + + mln_psite(I) p; + enum { dim = I::site::dim }; + unsigned dir; + + window2d win_left, win_right; + + mln_qiter(window2d) q_l, q_r; + + diagonal_functor(const I& input, const W& win) + : input(input), + win(win), + accu(), + dir(dir), + win_left(win::shift(win, dpsite(1, -1)) - win), + win_right(win - win::shift(win, dpsite(1, -1))), + q_l(win_left, p), + q_r(win_right, p) + { + } + + void init() + { + initialize(output, input); + } + + void next() + { + for_all(q_l) + accu.untake(input(q_l)); + for_all(q_r) + accu.take(input(q_r)); + output(p) = accu; + } + + + void init_diag() + { + accu.init(); + p = p - dpsite(-1, 1); + mln_qiter(W) q(win, p); + for_all(q) + accu.take(input(q)); + p = p + dpsite(-1, 1); + } + + void final() + { + } + + }; + + + + template <typename I_, typename W, typename A> + struct backdiagonal_functor + { + typedef I_ I; + typedef mln_deduce(I, psite, delta) dpsite; + + const I& input; + const W& win; + mln_concrete(I) output; + A accu; + + mln_psite(I) p; + enum { dim = I::site::dim }; + unsigned dir; + + window2d win_left, win_right; + + mln_qiter(window2d) q_l, q_r; + + backdiagonal_functor(const I& input, const W& win) + : input(input), + win(win), + accu(), + dir(dir), + win_left(win::shift(win, dpsite(-1, -1)) - win), + win_right(win - win::shift(win, dpsite(-1, -1))), + q_l(win_left, p), + q_r(win_right, p) + { + } + + void init() + { + initialize(output, input); + } + + void next() + { + for_all(q_l) + accu.untake(input(q_l)); + for_all(q_r) + accu.take(input(q_r)); + output(p) = accu; + } + + + void init_diag() + { + accu.init(); + p = p - dpsite(1, 1); + mln_qiter(W) q(win, p); + for_all(q) + accu.take(input(q)); + p = p + dpsite(1, 1); + } + + void final() + { + } + + }; + + + + // Functors (fastest versions). + + + template <typename I_, typename W, typename A> + struct diagonal_fastest_functor + { + typedef I_ I; + typedef mln_deduce(I, psite, delta) dpsite; + + const I& input; + const W& win; + mln_concrete(I) output; + A accu; + + mln_psite(I) p; + enum { dim = I::site::dim }; + unsigned dir; + + window2d win_left, win_right; + + mln_qixter(const I, window2d) q_l, q_r; + + diagonal_fastest_functor(const I& input, const W& win) + : input(input), + win(win), + accu(), + dir(dir), + win_left(win::shift(win, dpsite(1, -1)) - win), + win_right(win - win::shift(win, dpsite(1, -1))), + q_l(input, win_left, p), + q_r(input, win_right, p) + { + } + + void init() + { + initialize(output, input); + } + + void next() + { + for_all(q_l) + accu.untake(q_l.val()); + for_all(q_r) + accu.take(q_r.val()); + output(p) = accu; + } + + + void init_diag() + { + accu.init(); + p = p - dpsite(-1, 1); + mln_qixter(const I, W) q(input, win, p); + for_all(q) + accu.take(q.val()); + p = p + dpsite(-1, 1); + } + + void final() + { + } + + }; + + + template <typename I_, typename W, typename A> + struct backdiagonal_fastest_functor + { + typedef I_ I; + typedef mln_deduce(I, psite, delta) dpsite; + + const I& input; + const W& win; + mln_concrete(I) output; + A accu; + + mln_psite(I) p; + enum { dim = I::site::dim }; + unsigned dir; + + window2d win_left, win_right; + + mln_qixter(const I, window2d) q_l, q_r; + + backdiagonal_fastest_functor(const I& input, const W& win) + : input(input), + win(win), + accu(), + dir(dir), + win_left(win::shift(win, dpsite(-1, -1)) - win), + win_right(win - win::shift(win, dpsite(-1, -1))), + q_l(input, win_left, p), + q_r(input, win_right, p) + { + } + + void init() + { + initialize(output, input); + } + + void next() + { + for_all(q_l) + accu.untake(q_l.val()); + for_all(q_r) + accu.take(q_r.val()); + output(p) = accu; + } + + + void init_diag() + { + accu.init(); + p = p - dpsite(1, 1); + mln_qixter(const I, W) q(input, win, p); + for_all(q) + accu.take(q.val()); + p = p + dpsite(1, 1); + } + + void final() + { + } + + }; + + + + + // Both dispatch and implementation (hum...) + + template <typename A, typename I> + inline + mln_ch_value(I, mln_result(A)) + transform_diagonal_dispatch(trait::image::speed::any, + const Accumulator<A>& /* FIXME a */, + const Image<I>& input, const win::diag2d& win) + { + typedef diagonal_functor<I, win::diag2d, A> F; + F f(exact(input), win); // FIXME: Pass a to f. + canvas::browsing::diagonal2d(f); + return f.output; + } + + template <typename A, typename I> + inline + mln_ch_value(I, mln_result(A)) + transform_diagonal_dispatch(trait::image::speed::any, + const Accumulator<A>& /* FIXME a */, + const Image<I>& input, const win::backdiag2d& win) + { + typedef backdiagonal_functor<I, win::backdiag2d, A> F; + F f(exact(input), win); // FIXME: Pass a to f. + canvas::browsing::backdiagonal2d(f); + return f.output; + } + + template <typename A, typename I> + inline + mln_ch_value(I, mln_result(A)) + transform_diagonal_dispatch(trait::image::speed::fastest, + const Accumulator<A>& /* FIXME a*/, + const Image<I>& input, const win::diag2d& win) + { + typedef diagonal_fastest_functor<I, win::diag2d, A> F; + F f(exact(input), win); // FIXME: Pass a to f. + canvas::browsing::diagonal2d(f); + return f.output; + } + + template <typename A, typename I> + inline + mln_ch_value(I, mln_result(A)) + transform_diagonal_dispatch(trait::image::speed::fastest, + const Accumulator<A>& /* FIXME a*/, + const Image<I>& input, const win::backdiag2d& win) + { + typedef backdiagonal_fastest_functor<I, win::backdiag2d, A> F; + F f(exact(input), win); // FIXME: Pass a to f. + canvas::browsing::backdiagonal2d(f); + return f.output; + } + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_result(A)) + transform_diagonal_dispatch(const Accumulator<A>& a, + const Image<I>& input, const Window<W>& win) + { + return transform_diagonal_dispatch(mln_trait_image_speed(I)(), + a, input, exact(win)); + } + + } // end of namespace mln::accu::internal + + + + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_result(A)) + transform_diagonal(const Accumulator<A>& a, + const Image<I>& input, const Window<W>& win) + { + trace::entering("accu::transform_diagonal"); + + internal::transform_diagonal_tests(input, win); + + extension::adjust(input, geom::delta(win) + 1); + mln_ch_value(I, mln_result(A)) output; + output = internal::transform_diagonal_dispatch(a, input, win); + + trace::exiting("accu::transform_diagonal"); + return output; + } + + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) + transform_diagonal(const Meta_Accumulator<A>& a, + const Image<I>& input, const Window<W>& win) + { + trace::entering("accu::transform_diagonal"); + + internal::transform_diagonal_tests(input, win); + + typedef mln_accu_with(A, mln_value(I)) A_; + A_ a_ = accu::unmeta(exact(a), mln_value(I)()); + + extension::adjust(input, geom::delta(win) + 1); + mln_ch_value(I, mln_result(A_)) output; + output = internal::transform_diagonal_dispatch(a_, input, win); + + trace::exiting("accu::transform_diagonal"); + return output; + } + + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::accu + +} // end of namespace mln + + +#endif // ! MLN_ACCU_TRANSFORM_DIAGONAL_HH Index: mln/win/line.hh --- mln/win/line.hh (revision 2881) +++ mln/win/line.hh (working copy) @@ -73,12 +73,12 @@ template <typename M, unsigned i, typename C> struct line : public internal::classical_window_base< dpoint<M, C>, line<M,i,C> > { - /*! \brief Constructor. - * - * \param[in] length Length of the line. - * - * \pre \p length is odd. - */ + /// Direction. + enum { dir = i }; + + /// Constructor. + /// \param[in] length Length of the line. + /// \pre \p length is odd. line(unsigned length); /// Give the line length. @@ -87,9 +87,8 @@ /// Give the line size, that is, its length. unsigned size() const; - /*! \brief Give the maximum coordinate gap between the window - * center and a window point. - */ + /// Give the maximum coordinate gap between the window + /// center and a window point. unsigned delta_() const; void print_(std::ostream& ostr) const; Index: mln/morpho/erosion.spe.hh --- mln/morpho/erosion.spe.hh (revision 2881) +++ mln/morpho/erosion.spe.hh (working copy) @@ -161,6 +161,9 @@ + // Line case. + + template <typename I, typename G, unsigned Dir, typename C> inline mln_concrete(I) @@ -210,6 +213,10 @@ } + + // Particular windows. + + template <typename I> inline mln_concrete(I) @@ -250,7 +257,6 @@ } - template <typename I, typename W> inline mln_concrete(I) @@ -270,7 +276,6 @@ } - template <typename I, typename W> inline mln_concrete(I) @@ -290,350 +295,32 @@ } - - // Diagonal2d non fastest. - template <typename I_, typename W, typename A> - struct erosion_diagonal2d_functor - { - typedef I_ I; - typedef mln_deduce(I, psite, delta) dpsite; - - const I& input; - const W& win; - mln_concrete(I) output; - A accu; - - mln_psite(I) p; - enum { dim = I::site::dim }; - unsigned dir; - - window2d win_left, win_right; - - mln_qiter(window2d) q_l, q_r; - - erosion_diagonal2d_functor(const I& input, const W& win) - : input(input), - win(win), - accu(), - dir(dir), - win_left(win::shift(win, dpsite(1, -1)) - win), - win_right(win - win::shift(win, dpsite(1, -1))), - q_l(win_left, p), - q_r(win_right, p) - { - } - - void init() - { - extension::adjust_fill(input, win, accu); - initialize(output, input); - } - - void next() - { - for_all(q_l) - accu.untake(input(q_l)); - for_all(q_r) - accu.take(input(q_r)); - output(p) = accu; - } - - - void init_diag() - { - accu.init(); - p = p - dpsite(-1, 1); - mln_qiter(W) q(win, p); - for_all(q) - accu.take(input(q)); - p = p + dpsite(-1, 1); - } - - void final() - { - } - - }; - - // Backdiagonal2d non fastest. - template <typename I, typename W> - inline - mln_concrete(I) - erosion_diagonal2d(const Image<I>& input, const Window<W>& win) - { - trace::entering("morpho::impl:erosion_diagonal2d"); - - typedef mlc_is(mln_trait_image_kind(I), - trait::image::kind::binary) is_binary; - typedef mlc_if(is_binary, accu::land, accu::min_h<mln_value(I)>) A; - - typedef erosion_diagonal2d_functor<I, W, A> F; - F f(exact(input), exact(win)); - canvas::browsing::diagonal2d(f); - - trace::exiting("morpho::impl:erosion_diagonal2d"); - - return f.output; - } - - - - template <typename I_, typename W, typename A> - struct erosion_backdiagonal2d_functor - { - typedef I_ I; - typedef mln_deduce(I, psite, delta) dpsite; - - const I& input; - const W& win; - mln_concrete(I) output; - A accu; - - mln_psite(I) p; - enum { dim = I::site::dim }; - unsigned dir; - - window2d win_left, win_right; - - mln_qiter(window2d) q_l, q_r; - - erosion_backdiagonal2d_functor(const I& input, const W& win) - : input(input), - win(win), - accu(), - dir(dir), - win_left(win::shift(win, dpsite(-1, -1)) - win), - win_right(win - win::shift(win, dpsite(-1, -1))), - q_l(win_left, p), - q_r(win_right, p) - { - } - - void init() - { - extension::adjust_fill(input, win, accu); - initialize(output, input); - } - - void next() - { - for_all(q_l) - accu.untake(input(q_l)); - for_all(q_r) - accu.take(input(q_r)); - output(p) = accu; - } - - - void init_diag() - { - accu.init(); - p = p - dpsite(1, 1); - mln_qiter(W) q(win, p); - for_all(q) - accu.take(input(q)); - p = p + dpsite(1, 1); - } - - void final() - { - } - - }; - template <typename I, typename W> inline mln_concrete(I) - erosion_backdiagonal2d(const Image<I>& input, const Window<W>& win) - { - trace::entering("morpho::impl:erosion_backdiagonal2d"); - - typedef mlc_is(mln_trait_image_kind(I), - trait::image::kind::binary) is_binary; - typedef mlc_if(is_binary, accu::land, accu::min_h<mln_value(I)>) A; - - typedef erosion_backdiagonal2d_functor<I, W, A> F; - F f(exact(input), exact(win)); - canvas::browsing::backdiagonal2d(f); - - trace::exiting("morpho::impl:erosion_backdiagonal2d"); - - return f.output; - } - - - - // Diagonal2d fastest. - template <typename I_, typename W, typename A> - struct erosion_diagonal2d_fastest_functor + erosion_diagonal_2d(const Image<I>& input, const Window<W>& win) { - typedef I_ I; - typedef mln_deduce(I, psite, delta) dpsite; - - const I& input; - const W& win; - mln_concrete(I) output; - A accu; - - mln_psite(I) p; - enum { dim = I::site::dim }; - unsigned dir; - - window2d win_left, win_right; - - mln_qixter(const I, window2d) q_l, q_r; - - erosion_diagonal2d_fastest_functor(const I& input, const W& win) - : input(input), - win(win), - accu(), - dir(dir), - win_left(win::shift(win, dpsite(1, -1)) - win), - win_right(win - win::shift(win, dpsite(1, -1))), - q_l(input, win_left, p), - q_r(input, win_right, p) - { - } + trace::entering("morpho::impl:erosion_diagonal_2d"); - void init() - { - extension::adjust_fill(input, win, accu); - initialize(output, input); - } - - void next() - { - for_all(q_l) - accu.untake(q_l.val()); - for_all(q_r) - accu.take(q_r.val()); - output(p) = accu; - } - - - void init_diag() - { - accu.init(); - p = p - dpsite(-1, 1); - mln_qixter(const I, W) q(input, win, p); - for_all(q) - accu.take(q.val()); - p = p + dpsite(-1, 1); - } - - void final() - { - } - - }; - - template <typename I, typename W> - inline - mln_concrete(I) - erosion_diagonal2d_fastest(const Image<I>& input, const Window<W>& win) - { - trace::entering("morpho::impl:erosion_diagonal2d_fastest"); - - typedef mlc_is(mln_trait_image_kind(I), - trait::image::kind::binary) is_binary; + typedef mlc_is(mln_trait_image_kind(I), trait::image::kind::binary) is_binary; typedef mlc_if(is_binary, accu::land, accu::min_h<mln_value(I)>) A; + A a; - typedef erosion_diagonal2d_fastest_functor<I, W, A> F; - F f(exact(input), exact(win)); - canvas::browsing::diagonal2d(f); - - trace::exiting("morpho::impl:erosion_diagonal2d_fastest"); - - return f.output; - } - - - - // Backdiagonal2d fastest. - template <typename I_, typename W, typename A> - struct erosion_backdiagonal2d_fastest_functor - { - typedef I_ I; - typedef mln_deduce(I, psite, delta) dpsite; - - const I& input; - const W& win; - mln_concrete(I) output; - A accu; - - mln_psite(I) p; - enum { dim = I::site::dim }; - unsigned dir; - - window2d win_left, win_right; - - mln_qixter(const I, window2d) q_l, q_r; - - erosion_backdiagonal2d_fastest_functor(const I& input, const W& win) - : input(input), - win(win), - accu(), - dir(dir), - win_left(win::shift(win, dpsite(-1, -1)) - win), - win_right(win - win::shift(win, dpsite(-1, -1))), - q_l(input, win_left, p), - q_r(input, win_right, p) - { - } - - void init() - { - extension::adjust_fill(input, win, accu); - initialize(output, input); - } - - void next() - { - for_all(q_l) - accu.untake(q_l.val()); - for_all(q_r) - accu.take(q_r.val()); - output(p) = accu; - } - + extension::adjust_fill(input, geom::delta(win) + 1, a); + mln_concrete(I) output = accu::transform_diagonal(a, input, win); - void init_diag() - { - accu.init(); - p = p - dpsite(1, 1); - mln_qixter(const I, W) q(input, win, p); - for_all(q) - accu.take(q.val()); - p = p + dpsite(1, 1); + trace::exiting("morpho::impl:erosion_diagonal_2d"); + return output; } - void final() - { - } - }; - template <typename I, typename W> - inline - mln_concrete(I) - erosion_backdiagonal2d_fastest(const Image<I>& input, const Window<W>& win) - { - trace::entering("morpho::impl:erosion_backdiagonal2d_fastest"); - - typedef mlc_is(mln_trait_image_kind(I), - trait::image::kind::binary) is_binary; - typedef mlc_if(is_binary, accu::land, accu::min_h<mln_value(I)>) A; + } // end of namespace mln::morpho::impl - typedef erosion_backdiagonal2d_fastest_functor<I, W, A> F; - F f(exact(input), exact(win)); - canvas::browsing::backdiagonal2d(f); - trace::exiting("morpho::impl:erosion_backdiagonal2d_fastest"); - return f.output; - } - } // end of namespace mln::morpho::impl + // Dispatch. namespace internal @@ -675,67 +362,6 @@ - // dispatch for diagonal2d w.r.t. speed - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_diagonal2d(trait::image::speed::fastest, - const I& input, const W& win) - { - return impl::erosion_diagonal2d_fastest(input, win); - } - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_diagonal2d(trait::image::speed::any, - const I& input, const W& win) - { - return impl::erosion_diagonal2d(input, win); - } - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_diagonal2d(const I& input, const W& win) - { - trace::entering("morpho::erosion_dispatch_for_diagonal2d"); - mln_concrete(I) ima = - erosion_dispatch_for_diagonal2d(mln_trait_image_speed(I)(), - input, win); - trace::exiting("morpho::erosion_dispatch_for_diagonal2d"); - return ima; - } - - - // dispatch for backdiagonal2d w.r.t. speed - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_backdiagonal2d(trait::image::speed::fastest, - const I& input, const W& win) - { - return impl::erosion_backdiagonal2d_fastest(input, win); - } - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_backdiagonal2d(trait::image::speed::any, - const I& input, const W& win) - { - return impl::erosion_backdiagonal2d(input, win); - } - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_backdiagonal2d(const I& input, const W& win) - { - trace::entering("morpho::erosion_dispatch_for_backdiagonal2d"); - mln_concrete(I) ima = - erosion_dispatch_for_backdiagonal2d(mln_trait_image_speed(I)(), - input, win); - trace::exiting("morpho::erosion_dispatch_for_backdiagonal2d"); - return ima; - } - // dispatch w.r.t. win @@ -776,6 +402,8 @@ input, win); } + + template <typename I> mln_concrete(I) erosion_dispatch_wrt_win(const I& input, const win::rectangle2d& win) @@ -786,6 +414,7 @@ return impl::erosion_rectangle2d(input, win); } + template <typename I> mln_concrete(I) erosion_dispatch_wrt_win(const I& input, const win::octagon2d& win) @@ -877,28 +506,30 @@ /// \} - /// Handling win::diag2d. + + + /// Handling diagonals. /// \{ - template <typename I> + template <typename I, typename W> mln_concrete(I) - erosion_dispatch_wrt_win(metal::true_, - const I& input, const win::diag2d& win) + erosion_dispatch_diagonal(metal::true_, + const I& input, const W& win) { - return erosion_dispatch_for_diagonal2d(input, win); + return impl::erosion_diagonal_2d(input, win); } - template <typename I> + template <typename I, typename W> mln_concrete(I) - erosion_dispatch_wrt_win(metal::false_, - const I& input, const win::diag2d& win) + erosion_dispatch_diagonal(metal::false_, + const I& input, const W& win) { return erosion_dispatch_for_generic(input, win); } - template <typename I> + template <typename I, typename W> mln_concrete(I) - erosion_dispatch_wrt_win(const I& input, const win::diag2d& win) + erosion_dispatch_diagonal(const I& input, const W& win) { if (win.size() == 1) return clone(input); @@ -911,51 +542,24 @@ && mlc_is_a(mln_pset(I), Box)::value && mlc_equal(mln_trait_image_quant(I), mln::trait::image::quant::low)::value }; - return erosion_dispatch_wrt_win(metal::bool_<test>(), + return erosion_dispatch_diagonal(metal::bool_<test>(), input, win); } } - /// \} - - - /// Handling win::backdiag2d. - /// \{ template <typename I> mln_concrete(I) - erosion_dispatch_wrt_win(metal::true_, - const I& input, const win::backdiag2d& win) - { - return erosion_dispatch_for_backdiagonal2d(input, win); - } - - template <typename I> - mln_concrete(I) - erosion_dispatch_wrt_win(metal::false_, - const I& input, const win::backdiag2d& win) + erosion_dispatch_wrt_win(const I& input, const win::diag2d& win) { - return erosion_dispatch_for_generic(input, win); + return erosion_dispatch_diagonal(input, win); } template <typename I> mln_concrete(I) erosion_dispatch_wrt_win(const I& input, const win::backdiag2d& win) { - if (win.size() == 1) - return clone(input); - else if (win.size() == 3) - return erosion_dispatch_for_generic(input, win); - else - { - enum { test = mlc_is_not(mln_trait_image_kind(I), - mln::trait::image::kind::logic)::value - && mlc_is_a(mln_pset(I), Box)::value - && mlc_equal(mln_trait_image_quant(I), - mln::trait::image::quant::low)::value }; - return erosion_dispatch_wrt_win(metal::bool_<test>(), - input, win); - } + return erosion_dispatch_diagonal(input, win); } /// \} Index: mln/morpho/includes.hh --- mln/morpho/includes.hh (revision 2881) +++ mln/morpho/includes.hh (working copy) @@ -55,6 +55,7 @@ # include <mln/accu/transform.hh> # include <mln/accu/transform_stop.hh> # include <mln/accu/transform_directional.hh> +# include <mln/accu/transform_diagonal.hh> # include <mln/fun/v2v/saturate.hh>
16 years, 1 month
1
0
0
0
2881: Update graph related classes.
by Guillaume Lazzara
* mln/core/internal/graph_neighborhood_base.hh, * mln/core/image/graph_elt_neighborhood.hh, * mln/core/image/line_graph_elt_neighborhood.hh, * mln/core/internal/graph_window_base.hh, * mln/core/image/graph_elt_window.hh, * mln/core/image/line_graph_elt_window.hh: refactor. * mln/make/voronoi.hh, * mln/core/internal/line_graph_vicinity_piter.hh, * mln/core/image/line_graph_window_piter.hh, * mln/core/image/line_graph_neighborhood_piter.hh: update according the new graph structure. * mln/core/site_set/p_graph.hh, * mln/core/site_set/p_line_graph.hh, * mln/core/site_set/p_line_graph_piter.hh, * mln/core/image/line_graph_psite.hh: deprecated and deleted. * tests/core/site_set/p_vertices.cc, * mln/util/graph.hh, * mln/util/internal/graph_vertex_impl.hh, * mln/util/internal/graph_edge_impl.hh: fix comments. * mln/util/internal/graph_edge_psite.hh: fix initialization. * tests/core/site_set/p_edges.cc, * tests/core/image/graph_image.cc, * tests/core/image/line_graph_image.cc: fix tests. * mln/make/all.hh * mln/make/essential.hh: uncomment inclusion of voronoi.hh. --- milena/ChangeLog | 36 ++ milena/mln/core/image/graph_elt_neighborhood.hh | 46 +-- milena/mln/core/image/graph_elt_window.hh | 96 +----- .../mln/core/image/line_graph_elt_neighborhood.hh | 107 ++---- milena/mln/core/image/line_graph_elt_window.hh | 165 +++------ .../core/image/line_graph_neighborhood_piter.hh | 94 +++--- milena/mln/core/image/line_graph_psite.hh | 399 -------------------- milena/mln/core/image/line_graph_window_piter.hh | 96 +++--- .../internal/graph_neighborhood_base.hh} | 89 +++--- milena/mln/core/internal/graph_window_base.hh | 146 +++++++ .../mln/core/internal/line_graph_vicinity_piter.hh | 9 +- milena/mln/core/site_set/p_graph.hh | 396 ------------------- milena/mln/core/site_set/p_line_graph.hh | 360 ------------------ milena/mln/core/site_set/p_line_graph_piter.hh | 272 ------------- milena/mln/make/all.hh | 2 +- milena/mln/make/essential.hh | 4 +- milena/mln/make/voronoi.hh | 27 +- milena/mln/util/graph.hh | 2 +- milena/mln/util/internal/graph_edge_impl.hh | 11 +- milena/mln/util/internal/graph_edge_psite.hh | 3 +- milena/mln/util/internal/graph_vertex_impl.hh | 11 +- milena/tests/core/image/graph_image.cc | 42 ++- milena/tests/core/image/line_graph_image.cc | 159 ++++++--- milena/tests/core/site_set/p_edges.cc | 12 +- milena/tests/core/site_set/p_vertices.cc | 9 +- 25 files changed, 593 insertions(+), 2000 deletions(-) delete mode 100644 milena/mln/core/image/line_graph_psite.hh copy milena/mln/{util/internal/graph_vertex_impl.hh => core/internal/graph_neighborhood_base.hh} (50%) create mode 100644 milena/mln/core/internal/graph_window_base.hh delete mode 100644 milena/mln/core/site_set/p_graph.hh delete mode 100644 milena/mln/core/site_set/p_line_graph.hh delete mode 100644 milena/mln/core/site_set/p_line_graph_piter.hh diff --git a/milena/ChangeLog b/milena/ChangeLog index 560b8ab..20e278b 100644 --- a/milena/ChangeLog +++ b/milena/ChangeLog @@ -1,3 +1,39 @@ +2008-11-14 Guillaume Lazzara <z(a)lrde.epita.fr> + + Update graph related classes. + + * mln/core/internal/graph_neighborhood_base.hh, + * mln/core/image/graph_elt_neighborhood.hh, + * mln/core/image/line_graph_elt_neighborhood.hh, + * mln/core/internal/graph_window_base.hh, + * mln/core/image/graph_elt_window.hh, + * mln/core/image/line_graph_elt_window.hh: refactor. + + * mln/make/voronoi.hh, + * mln/core/internal/line_graph_vicinity_piter.hh, + * mln/core/image/line_graph_window_piter.hh, + * mln/core/image/line_graph_neighborhood_piter.hh: update according + the new graph structure. + + * mln/core/site_set/p_graph.hh, + * mln/core/site_set/p_line_graph.hh, + * mln/core/site_set/p_line_graph_piter.hh, + * mln/core/image/line_graph_psite.hh: deprecated and deleted. + + * tests/core/site_set/p_vertices.cc, + * mln/util/graph.hh + * mln/util/internal/graph_vertex_impl.hh, + * mln/util/internal/graph_edge_impl.hh: fix comments. + + * mln/util/internal/graph_edge_psite.hh: fix initialization. + + * tests/core/site_set/p_edges.cc, + * tests/core/image/graph_image.cc, + * tests/core/image/line_graph_image.cc: fix tests. + + * mln/make/all.hh + * mln/make/essential.hh: uncomment inclusion of voronoi.hh. + 2008-11-14 Thierry Geraud <thierry.geraud(a)lrde.epita.fr> Migrate generic code from morpho erosion to new files in accu. diff --git a/milena/mln/core/image/graph_elt_neighborhood.hh b/milena/mln/core/image/graph_elt_neighborhood.hh index ac48f6d..5b568c0 100644 --- a/milena/mln/core/image/graph_elt_neighborhood.hh +++ b/milena/mln/core/image/graph_elt_neighborhood.hh @@ -30,19 +30,12 @@ # define MLN_CORE_IMAGE_GRAPH_ELT_NEIGHBORHOOD_HH /// \file mln/core/image/graph_elt_neighborhood.hh -/// \brief Definition of the elementary ``neighborhood'' on a graph. - -/* FIXME: Factor those classes: - - mln::graph_elt_window - - mln::graph_elt_neighborhood - - mln::line_graph_elt_window - - mln::line_graph_elt_neighborhood. - - See
https://trac.lrde.org/olena/ticket/139
. */ +/// Definition of the elementary ``neighborhood'' on a graph. # include <set> # include <mln/core/concept/neighborhood.hh> +# include <mln/core/internal/graph_neighborhood_base.hh> # include <mln/util/internal/graph_vertex_psite.hh> # include <mln/core/image/graph_neighborhood_piter.hh> @@ -56,10 +49,13 @@ namespace mln template <typename G, typename F, typename N> class graph_neighborhood_bkd_piter; - /// \brief Elementary neighborhood on graph class. + /// Elementary neighborhood on graph class. template <typename G, typename F> class graph_elt_neighborhood - : public Neighborhood< graph_elt_neighborhood<G, F> > + : public graph_neighborhood_base<G, + F, + internal::vertex_psite<G, F>, + graph_elt_neighborhood<G, F> > { typedef graph_elt_neighborhood<G, F> self_; @@ -68,17 +64,12 @@ namespace mln /// \{ /// The type of psite corresponding to the neighborhood. typedef internal::vertex_psite<G, F> psite; - /// The type of site corresponding to the neighborhood. - typedef mln_site(psite) site; - // The type of the set of neighbors (vertex ids adjacent to the - // reference psite). - typedef std::set<unsigned> sites_t; - /// \brief Site_Iterator type to browse the psites of the + /// Site_Iterator type to browse the psites of the /// neighborhood w.r.t. the ordering of vertices. typedef graph_neighborhood_fwd_piter<G, F, self_> fwd_niter; - /// \brief Site_Iterator type to browse the psites of the + /// Site_Iterator type to browse the psites of the /// neighborhood w.r.t. the reverse ordering of vertices. typedef graph_neighborhood_bkd_piter<G, F, self_> bkd_niter; @@ -86,13 +77,6 @@ namespace mln typedef fwd_niter niter; /// \} - /// Conversions. - /// \{ - /// The window type corresponding to this neighborhood. - typedef graph_elt_window<G, F> window; - /// Create a window corresponding to this neighborhood. - window win() const; - /// \} /// Services for iterators. /// \{ @@ -100,20 +84,16 @@ namespace mln template <typename Piter> void compute_sites_(Site_Iterator<Piter>& piter) const; /// \} + + protected: + typedef graph_neighborhood_base<G, F, psite, self_> super_; + typedef typename super_::sites_t sites_t; }; # ifndef MLN_INCLUDE_ONLY template <typename G, typename F> - inline - graph_elt_window<G, F> - graph_elt_neighborhood<G, F>::win() const - { - return graph_elt_window<G, F>(); - } - - template <typename G, typename F> template <typename Piter> inline void diff --git a/milena/mln/core/image/graph_elt_window.hh b/milena/mln/core/image/graph_elt_window.hh index e09b257..f71c499 100644 --- a/milena/mln/core/image/graph_elt_window.hh +++ b/milena/mln/core/image/graph_elt_window.hh @@ -30,17 +30,10 @@ # define MLN_CORE_IMAGE_GRAPH_ELT_WINDOW_HH /// \file mln/core/image/graph_elt_window.hh -/// \brief Definition of the elementary ``window'' on a graph. - -/* FIXME: Factor those classes: - - mln::graph_elt_window - - mln::graph_elt_neighborhood - - mln::line_graph_elt_window - - mln::line_graph_elt_neighborhood. - - See
https://trac.lrde.org/olena/ticket/139
. */ +/// Definition of the elementary ``window'' on a graph. # include <mln/core/concept/window.hh> +# include <mln/core/internal/graph_window_base.hh> # include <mln/util/internal/graph_vertex_psite.hh> # include <mln/core/image/graph_window_piter.hh> @@ -68,24 +61,20 @@ namespace mln /// \brief Elementary window on graph class. template <typename G, typename F> - class graph_elt_window : public Window< graph_elt_window<G, F> > + class graph_elt_window : public graph_window_base< + G, + F, + internal::vertex_psite<G, F>, + graph_elt_window<G, F> > + { typedef graph_elt_window<G, F> self_; - typedef mln_result(F) P; public: /// Associated types. /// \{ /// The type of psite corresponding to the window. typedef internal::vertex_psite<G, F> psite; - /// The type of site corresponding to the window. - typedef mln_site(psite) site; - // The type of the set of window sites (vertex ids adjacent to the - // reference psite). - typedef std::set<unsigned> sites_t; - - // FIXME: This is a dummy value. - typedef void dpsite; /// \brief Site_Iterator type to browse the psites of the window /// w.r.t. the ordering of vertices. @@ -106,31 +95,9 @@ namespace mln void compute_sites_(Site_Iterator<Piter>& piter) const; /// \} - /// Interface of the concept Window. - /// \{ - /// Is the window is empty? - bool is_empty() const; - /// Is the window centered? - bool is_centered() const; - /// Is the window symmetric? - // FIXME: We should define this more precisely. - bool is_symmetric() const; - /// Return the maximum coordinate gap between the window center - /// and a window point. - /* FIXME: This method returns a dummy value (0), since the delta - of a window on a graph - - 1. is not constant (graph vertices are not necessarily aligned on - a regular grid); - - 2. depends on the underlying graph, too. - - It raises another question: should delta() be part of the - concept ``Window''? */ - unsigned delta() const; - /// Apply a central symmetry to the target window. - self_& sym(); - /// \} + protected: + typedef graph_window_base<G, F, psite, self_> super_; + typedef typename super_::sites_t sites_t; }; @@ -154,47 +121,6 @@ namespace mln sites.insert(g.v_ith_nbh_vertex(central_vertex, i)); } - template <typename G, typename F> - inline - bool - graph_elt_window<G, F>::is_empty() const - { - return false; - } - - template <typename G, typename F> - inline - bool - graph_elt_window<G, F>::is_centered() const - { - return false; - } - - template <typename G, typename F> - inline - bool - graph_elt_window<G, F>::is_symmetric() const - { - return true; - } - - template <typename G, typename F> - inline - unsigned - graph_elt_window<G, F>::delta() const - { - // Dummy value (see the interface of the method above). - return 0; - } - - template <typename G, typename F> - inline - graph_elt_window<G, F>& - graph_elt_window<G, F>::sym() - { - return *this; - } - # endif // ! MLN_INCLUDE_ONLY } // end of namespace mln diff --git a/milena/mln/core/image/line_graph_elt_neighborhood.hh b/milena/mln/core/image/line_graph_elt_neighborhood.hh index 1f79084..55236f3 100644 --- a/milena/mln/core/image/line_graph_elt_neighborhood.hh +++ b/milena/mln/core/image/line_graph_elt_neighborhood.hh @@ -30,27 +30,13 @@ # define MLN_CORE_IMAGE_LINE_GRAPH_ELT_NEIGHBORHOOD_HH /// \file mln/core/image/line_graph_elt_neighborhood.hh -/// \brief Definition of the elementary ``neighborhood'' on a line graph. - -/* FIXME: Have a consistent naming: we have window (without '_') but - point_, neighb_, etc. */ - -/* FIXME: Factor those classes: - - mln::graph_elt_window - - mln::graph_elt_neighborhood - - mln::line_graph_elt_window - - mln::line_graph_elt_neighborhood. - - See
https://trac.lrde.org/olena/ticket/139
. */ - -/* FIXME: Due to the poor interface of mln::p_line_graph and - mln::util::graph, we show to much implementation details here. - Enrich their interfaces to avoid that. */ +/// Definition of the elementary ``neighborhood'' on a line graph. # include <set> # include <mln/core/concept/neighborhood.hh> -# include <mln/core/image/line_graph_psite.hh> +# include <mln/core/internal/graph_neighborhood_base.hh> +# include <mln/util/internal/graph_edge_psite.hh> # include <mln/core/image/line_graph_neighborhood_piter.hh> # include <mln/core/image/line_graph_elt_window.hh> @@ -58,99 +44,70 @@ namespace mln { - // Fwd decls. - template <typename P, typename N> class line_graph_neighborhood_fwd_piter; - template <typename P, typename N> class line_graph_neighborhood_bkd_piter; - - /// \brief Elementary neighborhood on line graph class. - template <typename P> + /// Elementary neighborhood on line graph class. + template <typename G, typename F> class line_graph_elt_neighborhood - : public Neighborhood< line_graph_elt_neighborhood<P> > + : public graph_neighborhood_base<G, + F, + internal::edge_psite<G, F>, + line_graph_elt_neighborhood<G, F> > { - typedef line_graph_elt_neighborhood<P> self_; + typedef line_graph_elt_neighborhood<G, F> self_; public: /// Associated types. /// \{ /// The type of psite corresponding to the neighborhood. - typedef line_graph_psite<P> psite; - /// The type of site corresponding to the neighborhood. - typedef mln_site(psite) site; - // The type of the set of neighbors (edge ids adjacent to the - // reference psite). - typedef std::set<util::edge_id> sites_t; - - /// \brief Site_Iterator type to browse the psites of the + typedef internal::edge_psite<G, F> psite; + + /// Site_Iterator type to browse the psites of the /// neighborhood w.r.t. the ordering of edges. - typedef line_graph_neighborhood_fwd_piter<P, self_> fwd_niter; + typedef line_graph_neighborhood_fwd_piter<G, F, self_> fwd_niter; - /// \brief Site_Iterator type to browse the psites of the + /// Site_Iterator type to browse the psites of the /// neighborhood w.r.t. the reverse ordering of edges. - typedef line_graph_neighborhood_bkd_piter<P, self_> bkd_niter; + typedef line_graph_neighborhood_bkd_piter<G, F, self_> bkd_niter; /// The default niter type. typedef fwd_niter niter; /// \} - /// Conversions. - /// \{ - /// The window type corresponding to this neighborhood. - typedef line_graph_elt_window<P> window; - /// Create a window corresponding to this neighborhood. - window to_window() const; - /// \} - /// Services for iterators. /// \{ /// Compute the set of sites for this neighborhood around \a piter. template <typename Piter> void compute_sites_(Site_Iterator<Piter>& piter) const; /// \} + + protected: + typedef graph_neighborhood_base<G, F, psite, self_> super_; + typedef typename super_::sites_t sites_t; }; # ifndef MLN_INCLUDE_ONLY - template <typename P> - inline - line_graph_elt_window<P> - line_graph_elt_neighborhood<P>::to_window() const - { - return line_graph_elt_window<P>(); - } - - template <typename P> + template <typename G, typename F> template <typename Piter> inline void - line_graph_elt_neighborhood<P>::compute_sites_(Site_Iterator<Piter>& piter_) const + line_graph_elt_neighborhood<G, F>::compute_sites_(Site_Iterator<Piter>& piter_) const { Piter& piter = exact(piter_); - util::edge_id ref_edge_id = piter.center().edge_id(); + unsigned central_edge = piter.center().e().id(); sites_t& sites = piter.sites(); sites.clear(); - /* FIXME: Move this computation out of the neighborhood. In fact, - this should be a service of the graph, also proposed by the - p_line_graph. */ - // Ajacent edges connected through vertex 1. - util::vertex_id id1 = piter.center().first_id(); - const util::vertex<P>& vertex1 = piter.center().site_set().gr_->vertex(id1); - for (std::vector<util::edge_id>::const_iterator e = - vertex1.edges.begin(); e != vertex1.edges.end(); ++e) - // We explicitly enforce that the reference piter edge id is - // *not* inserted into SITES. - if (*e != ref_edge_id) - sites.insert(*e); - // Ajacent edges connected through vertex 2. - util::vertex_id id2 = piter.center().second_id(); - const util::vertex<P>& vertex2 = piter.center().site_set().gr_->vertex(id2); - for (std::vector<util::edge_id>::const_iterator e = - vertex2.edges.begin(); e != vertex2.edges.end(); ++e) - // Same remark as above. - if (*e != ref_edge_id) - sites.insert(*e); + + const G& g = piter.center().site_set().graph(); + + for (unsigned i = 0; i < g.e_nmax_nbh_edges(central_edge); ++i) + { + unsigned n = g.e_ith_nbh_edge(central_edge, i); + if (n != central_edge) + sites.insert(g.e_ith_nbh_edge(central_edge, i)); + } } # endif // ! MLN_INCLUDE_ONLY diff --git a/milena/mln/core/image/line_graph_elt_window.hh b/milena/mln/core/image/line_graph_elt_window.hh index 920ba4e..c727230 100644 --- a/milena/mln/core/image/line_graph_elt_window.hh +++ b/milena/mln/core/image/line_graph_elt_window.hh @@ -30,66 +30,62 @@ # define MLN_CORE_IMAGE_LINE_GRAPH_ELT_WINDOW_HH /// \file mln/core/image/line_graph_elt_window.hh -/// \brief Definition of the elementary ``window'' on a line graph. - -/* FIXME: Have a consistent naming: we have window (without '_') but - point_, neighb_, etc. */ - -/* FIXME: Factor those classes: - - mln::graph_elt_window - - mln::graph_elt_neighborhood - - mln::line_graph_elt_window - - mln::line_graph_elt_neighborhood. - - See
https://trac.lrde.org/olena/ticket/139
. */ - -/* FIXME: Due to the poor interface of mln::p_line_graph and - mln::util::graph, we show to much implementation details here. - Enrich their interfaces to avoid that. */ +/// Definition of the elementary ``window'' on a line graph. # include <mln/core/concept/window.hh> -# include <mln/core/image/line_graph_psite.hh> +# include <mln/core/internal/graph_window_base.hh> +# include <mln/util/internal/graph_edge_psite.hh> # include <mln/core/image/line_graph_window_piter.hh> namespace mln { - // Fwd decls. - template <typename P, typename W> class line_graph_window_fwd_piter; - template <typename P, typename W> class line_graph_window_bkd_piter; + + /// Forward declaration + template <typename G, typename F> class line_graph_elt_window; + + namespace trait + { + + ///FIXME: check that! + template <typename G, typename F> + struct window_< mln::line_graph_elt_window<G, F> > + { + typedef trait::window::size::unknown size; + typedef trait::window::support::irregular support; + typedef trait::window::definition::varying definition; + }; + + } // end of namespace mln::trait /// \brief Elementary window on line graph class. - template <typename P> - class line_graph_elt_window : public Window< line_graph_elt_window<P> > + template <typename G, typename F> + class line_graph_elt_window : public graph_window_base< + G, + F, + internal::edge_psite<G, F>, + line_graph_elt_window<G, F> > { - typedef line_graph_elt_window<P> self_; + typedef line_graph_elt_window<G, F> self_; public: /// Associated types. /// \{ /// The type of psite corresponding to the window. - typedef line_graph_psite<P> psite; - /// The type of site corresponding to the window. - typedef mln_site(psite) site; - // The type of the set of window sites (edge ids adjacent to the - // reference psite). - typedef std::set<util::edge_id> sites_t; - - // FIXME: This is a dummy value. - typedef void dpsite; + typedef internal::edge_psite<G, F> psite; - /// \brief Site_Iterator type to browse the psites of the window + /// Site_Iterator type to browse the psites of the window /// w.r.t. the ordering of edges. - typedef line_graph_window_fwd_piter<P, self_> fwd_qiter; + typedef line_graph_window_fwd_piter<G, F, self_> fwd_qiter; - /// \brief Site_Iterator type to browse the psites of the window + /// Site_Iterator type to browse the psites of the window /// w.r.t. the reverse ordering of edges. - typedef line_graph_window_bkd_piter<P, self_> bkd_qiter; + typedef line_graph_window_bkd_piter<G, F, self_> bkd_qiter; /// The default qiter type. typedef fwd_qiter qiter; - /// \} + /// Services for iterators. /// \{ @@ -98,105 +94,30 @@ namespace mln void compute_sites_(Site_Iterator<Piter>& piter) const; /// \} - /// Interface of the concept Window. - /// \{ - /// Is the window is empty? - bool is_empty() const; - /// Is the window centered? - bool is_centered() const; - /// Is the window symmetric? - // FIXME: We should define this more precisely. - bool is_symmetric() const; - /// Return the maximum coordinate gap between the window center - /// and a window point. - /* FIXME: This method returns a dummy value (0), since the delta - of a window on a line_graph - - 1. is not constant (line graph edges are not necessarily - aligned on a regular grid); - - 2. depends on the underlying line_graph, too. - - It raises another question: should delta() be part of the - concept ``Window''? */ - unsigned delta() const; - /// Apply a central symmetry to the target window. - self_& sym(); - /// \} + protected: + typedef graph_window_base<G, F, psite, self_> super_; + typedef typename super_::sites_t sites_t; }; # ifndef MLN_INCLUDE_ONLY - template <typename P> + template <typename G, typename F> template <typename Piter> inline void - line_graph_elt_window<P>::compute_sites_(Site_Iterator<Piter>& piter_) const + line_graph_elt_window<G, F>::compute_sites_(Site_Iterator<Piter>& piter_) const { Piter& piter = exact(piter_); + unsigned central_edge = piter.center().e().id(); sites_t& sites = piter.sites(); sites.clear(); - /* FIXME: Move this computation out of the window. In fact, - this should be a service of the graph, also proposed by the - p_line_graph. */ - // Ajacent edges connected through vertex 1. - /* We don't need to explicitely insert the reference piter (edge - id) itself into SITES, since it is part of the set of edges - adjacent to VERTEX1 and VERTEX2, and will therefore be - automatically added. */ - util::vertex_id id1 = piter.center().first_id(); - const util::vertex<P>& vertex1 = piter.center().site_set().gr_->vertex(id1); - for (std::vector<util::edge_id>::const_iterator e = - vertex1.edges.begin(); e != vertex1.edges.end(); ++e) - sites.insert(*e); - // Ajacent edges connected through vertex 2. - util::vertex_id id2 = piter.center().second_id(); - const util::vertex<P>& vertex2 = piter.center().site_set().gr_->vertex(id2); - for (std::vector<util::edge_id>::const_iterator e = - vertex2.edges.begin(); e != vertex2.edges.end(); ++e) - sites.insert(*e); - } - - template <typename P> - inline - bool - line_graph_elt_window<P>::is_empty() const - { - return false; - } - - template <typename P> - inline - bool - line_graph_elt_window<P>::is_centered() const - { - return false; - } - - template <typename P> - inline - bool - line_graph_elt_window<P>::is_symmetric() const - { - return true; - } - template <typename P> - inline - unsigned - line_graph_elt_window<P>::delta() const - { - // Dummy value (see the interface of the method above). - return 0; - } + const G& g = piter.center().site_set().graph(); - template <typename P> - inline - line_graph_elt_window<P>& - line_graph_elt_window<P>::sym() - { - return *this; + sites.insert(central_edge); + for (unsigned i = 0; i < g.e_nmax_nbh_edges(central_edge); ++i) + sites.insert(g.e_ith_nbh_edge(central_edge, i)); } # endif // ! MLN_INCLUDE_ONLY diff --git a/milena/mln/core/image/line_graph_neighborhood_piter.hh b/milena/mln/core/image/line_graph_neighborhood_piter.hh index 9a30b74..83594c7 100644 --- a/milena/mln/core/image/line_graph_neighborhood_piter.hh +++ b/milena/mln/core/image/line_graph_neighborhood_piter.hh @@ -34,25 +34,21 @@ # include <mln/core/internal/line_graph_vicinity_piter.hh> -/* FIXME: Due to the poor interface of mln::p_line_graph and - mln::util::graph, we show to much implementation details here. - Enrich their interfaces to avoid that. */ - namespace mln { /*------------------------------------------. - | line_graph_neighborhood_fwd_piter<P, N>. | + | line_graph_neighborhood_fwd_piter<G, F, N>. | `------------------------------------------*/ /// \brief Forward iterator on line graph neighborhood. - template <typename P, typename N> + template <typename G, typename F, typename N> class line_graph_neighborhood_fwd_piter : - public internal::line_graph_vicinity_piter_< P, N, - line_graph_neighborhood_fwd_piter<P, N> > + public internal::line_graph_vicinity_piter_< mln_result(F), N, + line_graph_neighborhood_fwd_piter<G, F, N> > { - typedef line_graph_neighborhood_fwd_piter<P, N> self_; - typedef internal::line_graph_vicinity_piter_<P, N, self_> super_; + typedef line_graph_neighborhood_fwd_piter<G, F, N> self_; + typedef internal::line_graph_vicinity_piter_<mln_result(F), N, self_> super_; public: /// The Point_Site type. @@ -90,17 +86,17 @@ namespace mln /*------------------------------------------. - | line_graph_neighborhood_bkd_piter<P, N>. | + | line_graph_neighborhood_bkd_piter<G, F, N>. | `------------------------------------------*/ /// \brief Backward iterator on line graph neighborhood. - template <typename P, typename N> + template <typename G, typename F, typename N> class line_graph_neighborhood_bkd_piter : - public internal::line_graph_vicinity_piter_< P, N, - line_graph_neighborhood_bkd_piter<P, N> > + public internal::line_graph_vicinity_piter_< mln_result(F), N, + line_graph_neighborhood_bkd_piter<G, F, N> > { - typedef line_graph_neighborhood_bkd_piter<P, N> self_; - typedef internal::line_graph_vicinity_piter_<P, N, self_> super_; + typedef line_graph_neighborhood_bkd_piter<G, F, N> self_; + typedef internal::line_graph_vicinity_piter_<mln_result(F), N, self_> super_; public: /// The Point_Site type. @@ -141,126 +137,126 @@ namespace mln # ifndef MLN_INCLUDE_ONLY /*------------------------------------------. - | line_graph_neighborhood_fwd_piter<P, N>. | + | line_graph_neighborhood_fwd_piter<G, F, N>. | `------------------------------------------*/ - template <typename P, typename N> + template <typename G, typename F, typename N> inline - line_graph_neighborhood_fwd_piter<P, N>::line_graph_neighborhood_fwd_piter() + line_graph_neighborhood_fwd_piter<G, F, N>::line_graph_neighborhood_fwd_piter() { } - template <typename P, typename N> + template <typename G, typename F, typename N> template <typename Pref> inline - line_graph_neighborhood_fwd_piter<P, N>::line_graph_neighborhood_fwd_piter(const Neighborhood<N>& nbh, - const Pref& p_ref) + line_graph_neighborhood_fwd_piter<G, F, N>::line_graph_neighborhood_fwd_piter(const Neighborhood<N>& nbh, + const Pref& p_ref) : super_(p_ref) { this->change_target(exact(nbh)); } - template <typename P, typename N> + template <typename G, typename F, typename N> inline bool - line_graph_neighborhood_fwd_piter<P, N>::is_valid_() const + line_graph_neighborhood_fwd_piter<G, F, N>::is_valid_() const { return i_ != this->sites_.end(); } - template <typename P, typename N> + template <typename G, typename F, typename N> inline void - line_graph_neighborhood_fwd_piter<P, N>::invalidate_() + line_graph_neighborhood_fwd_piter<G, F, N>::invalidate_() { i_ = this->sites_.end(); } - template <typename P, typename N> + template <typename G, typename F, typename N> inline void - line_graph_neighborhood_fwd_piter<P, N>::do_start_() + line_graph_neighborhood_fwd_piter<G, F, N>::do_start_() { this->site_set().compute_sites_(*this); i_ = this->sites_.begin(); } - template <typename P, typename N> + template <typename G, typename F, typename N> inline void - line_graph_neighborhood_fwd_piter<P, N>::do_next_() + line_graph_neighborhood_fwd_piter<G, F, N>::do_next_() { ++i_; } - template <typename P, typename N> + template <typename G, typename F, typename N> inline mln_psite(N) - line_graph_neighborhood_fwd_piter<P, N>::compute_p_() const + line_graph_neighborhood_fwd_piter<G, F, N>::compute_p_() const { - return line_graph_psite<P>(this->center().site_set(), *i_); + return internal::edge_psite<G, F>(this->center().site_set(), *i_); } /*------------------------------------------. - | line_graph_neighborhood_bkd_piter<P, N>. | + | line_graph_neighborhood_bkd_piter<G, F, N>. | `------------------------------------------*/ - template <typename P, typename N> + template <typename G, typename F, typename N> inline - line_graph_neighborhood_bkd_piter<P, N>::line_graph_neighborhood_bkd_piter() + line_graph_neighborhood_bkd_piter<G, F, N>::line_graph_neighborhood_bkd_piter() { } - template <typename P, typename N> + template <typename G, typename F, typename N> template <typename Pref> inline - line_graph_neighborhood_bkd_piter<P, N>::line_graph_neighborhood_bkd_piter(const Neighborhood<N>& nbh, + line_graph_neighborhood_bkd_piter<G, F, N>::line_graph_neighborhood_bkd_piter(const Neighborhood<N>& nbh, const Pref& p_ref) : super_(p_ref) { this->change_target(exact(nbh)); } - template <typename P, typename N> + template <typename G, typename F, typename N> inline bool - line_graph_neighborhood_bkd_piter<P, N>::is_valid_() const + line_graph_neighborhood_bkd_piter<G, F, N>::is_valid_() const { return i_ != this->sites_.rend(); } - template <typename P, typename N> + template <typename G, typename F, typename N> inline void - line_graph_neighborhood_bkd_piter<P, N>::invalidate_() + line_graph_neighborhood_bkd_piter<G, F, N>::invalidate_() { i_ = this->sites_.rend(); } - template <typename P, typename N> + template <typename G, typename F, typename N> inline void - line_graph_neighborhood_bkd_piter<P, N>::do_start_() + line_graph_neighborhood_bkd_piter<G, F, N>::do_start_() { this->site_set().compute_sites_(*this); i_ = this->sites_.rbegin(); } - template <typename P, typename N> + template <typename G, typename F, typename N> inline void - line_graph_neighborhood_bkd_piter<P, N>::do_next_() + line_graph_neighborhood_bkd_piter<G, F, N>::do_next_() { ++i_; } - template <typename P, typename N> + template <typename G, typename F, typename N> inline mln_psite(N) - line_graph_neighborhood_bkd_piter<P, N>::compute_p_() const + line_graph_neighborhood_bkd_piter<G, F, N>::compute_p_() const { - return line_graph_psite<P>(this->center().site_set(), *i_); + return internal::edge_psite<G, F>(this->center().site_set(), *i_); } # endif // ! MLN_INCLUDE_ONLY diff --git a/milena/mln/core/image/line_graph_psite.hh b/milena/mln/core/image/line_graph_psite.hh deleted file mode 100644 index 0898f30..0000000 --- a/milena/mln/core/image/line_graph_psite.hh +++ /dev/null @@ -1,399 +0,0 @@ -// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory -// (LRDE) -// -// 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. -// reasons why the executable file might be covered by the GNU General -// Public License. - -#ifndef MLN_CORE_IMAGE_LINE_GRAPH_PSITE_HH -# define MLN_CORE_IMAGE_LINE_GRAPH_PSITE_HH - -/// \file mln/core/image/line_graph_psite.hh -/// \brief Definition of a line graph-based psite. - -# include <mln/core/internal/pseudo_site_base.hh> - -# include <mln/util/site_pair.hh> -# include <mln/core/site_set/p_line_graph.hh> - -/* FIXME: This class shares a lot with graph_psite. Factor as much as - possible. */ - -// FIXME: Rename line_graph_psite as p_line_graph_psite, and move this -// to core/site_set. - - -namespace mln -{ - - // Forward declaration. - template <typename P> class p_line_graph; - template <typename P> class line_graph_psite; - - - /// \brief Point site associated to a mln::line_graph_image. - /// - /// \arg \p P The type of the site. - template <typename P> - class line_graph_psite - : public internal::pseudo_site_base_< const util::site_pair<P>&, - line_graph_psite<P> > - { - typedef line_graph_psite<P> self_; - - public: - // This associated type is important to know that this particular - // pseudo site knows the site set it refers to. - typedef p_line_graph<P> target; - - /// Construction and assignment. - /// \{ - line_graph_psite(); - line_graph_psite(const p_line_graph<P>& plg, util::edge_id id); - /// \} - - /// Psite manipulators. - /// \{ - /// Is this psite valid? - bool is_valid() const; - /// Invalidate this psite. - void invalidate(); - /// \} - - /// Site set manipulators. - /// \{ - /// \brief Get the site set (shortcut for *target()). - /// \pre Member plg_ is non null. - const target& site_set() const; - - /// Get a pointer to the target site_set. - const target* target_() const; - /// Set the target site_set. - void change_target(const target& new_target); - /// \} - - /// Proxy manipulators. - /// \{ - /// Return the site corresponding to this psite. - const util::site_pair<P>& subj_(); - /// \} - - /// Edge id manipulators. - //// \{ - /// Return the edge id of this point site. - util::edge_id edge_id() const; - /// Set the edge id of this point site. - void change_edge_id(const util::edge_id& id); - /// Increment the edge id of this point site. - void inc_edge_id(); - /// Increment the edge id of this point site. - void dec_edge_id(); - /// \} - - /// Accessors. - /// \{ - /// Return the first associated vertex. - P first() const; - /// Return the second associated vertex. - P second() const; - - /// Return the id of the first associated vertex. - // FIXME: Rename as first_vertex_id. - util::vertex_id first_id() const; - /// Return the id of the second associated vertex. - // FIXME: Rename as second_vertex_id. - util::vertex_id second_id() const; - /// \} - - private: - /// Site-related members. - /// \{ - /// Update the site corresponding to this psite. - void update_(); - // The site corresponding to this psite. - util::site_pair<P> p_; - /// \} - - private: - /// Graph-related members. - /// \{ - /// The p_line_graph this point site belongs to. - const target* plg_; - /// The id of the edge this psite is pointing towards. - util::edge_id id_; - /// \} - }; - - - /// Comparison of two mln::line_graph_psite<P> instances. - /// \{ - /* FIXME: Shouldn't those comparisons be part of a much general - mechanism? */ - - /// \brief Is \a lhs equal to \a rhs? - /// - /// \pre Arguments \a lhs and \a rhs must belong to the same - /// mln::p_line_graph. - template <typename P> - bool - operator==(const line_graph_psite<P>& lhs, const line_graph_psite<P>& rhs); - - /// \brief Is \a lhs not equal to \a rhs? - /// - /// \pre Arguments \a lhs and \a rhs must belong to the same - /// mln::p_line_graph. - template <typename P> - bool - operator!=(const line_graph_psite<P>& lhs, const line_graph_psite<P>& rhs); - - /// \brief Is \a lhs ``less'' than \a rhs? - /// - /// This comparison is required by algorithms sorting psites. - /// - /// \pre Arguments \a lhs and \a rhs must belong to the same - /// mln::p_line_graph. - template <typename P> - bool - operator< (const line_graph_psite<P>& lhs, const line_graph_psite<P>& rhs); - /// \} - - - template <typename P> - inline - std::ostream& - operator<<(std::ostream& ostr, const line_graph_psite<P>& p); - - - -# ifndef MLN_INCLUDE_ONLY - - template <typename P> - inline - line_graph_psite<P>::line_graph_psite() - : plg_(0) - { - } - - template <typename P> - inline - line_graph_psite<P>::line_graph_psite(const p_line_graph<P>& plg, - util::edge_id id) - // FIXME: Use change_target instead. - : plg_(&plg), - id_(id) - { - update_(); - } - - template <typename P> - inline - bool - line_graph_psite<P>::is_valid() const - { - /* FIXME: Instead of `plg_->gr_->nedges()', we should have - something like `run_->has_edge_id(id_)' (see the implementation of - p_run_psite. */ - return plg_ && id_ < plg_->gr_->nedges(); - } - - template <typename P> - inline - void - line_graph_psite<P>::invalidate() - { - /* FIXME: Instead of `plg_->gr_->nedges()', we should have - something like `run_->has_edge_id(id_)' (see the implementation of - p_run_psite. */ - id_ = plg_->gr_->nedges(); - } - - template <typename P> - inline - const p_line_graph<P>& - line_graph_psite<P>::site_set() const - { - mln_precondition(target_()); - return *target_(); - } - - template <typename P> - inline - const p_line_graph<P>* - line_graph_psite<P>::target_() const - { - return plg_; - } - - template <typename P> - inline - void - line_graph_psite<P>::change_target(const target& new_target) - { - plg_ = &new_target; - invalidate(); - } - - // FIXME: Write or extend a test to exercise this method. - template <typename P> - inline - const util::site_pair<P>& - line_graph_psite<P>::subj_() - { - return p_; - } - - template <typename P> - inline - util::edge_id - line_graph_psite<P>::edge_id() const - { - return id_; - } - - template <typename P> - inline - void - line_graph_psite<P>::change_edge_id(const util::edge_id& id) - { - id_ = id; - if (is_valid()) - update_(); - } - - template <typename P> - inline - void - line_graph_psite<P>::inc_edge_id() - { - ++id_.to_equiv(); - if (is_valid()) - update_(); - } - - template <typename P> - inline - void - line_graph_psite<P>::dec_edge_id() - { - --id_.to_equiv(); - if (is_valid()) - update_(); - } - - template <typename P> - inline - P - line_graph_psite<P>::first() const - { - mln_precondition(is_valid()); - // FIXME: Too low-level. - return plg_->gr_->vertex_data(first_id()); - } - - template <typename P> - inline - P - line_graph_psite<P>::second() const - { - mln_precondition(is_valid()); - // FIXME: Too low-level. - return plg_->gr_->vertex_data(second_id()); - } - - template <typename P> - inline - util::vertex_id - line_graph_psite<P>::first_id() const - { - mln_precondition(is_valid()); - // FIXME: Too low-level. - return plg_->gr_->edge(id_).v1(); - } - - template <typename P> - inline - util::vertex_id - line_graph_psite<P>::second_id() const - { - mln_precondition(is_valid()); - // FIXME: Too low-level. - return plg_->gr_->edge(id_).v2(); - } - - template <typename P> - inline - void - line_graph_psite<P>::update_() - { - mln_precondition(is_valid()); - p_.pair_.change_both(first(), second()); - } - - - /*--------------. - | Comparisons. | - `--------------*/ - - template <typename P> - bool - operator==(const line_graph_psite<P>& lhs, const line_graph_psite<P>& rhs) - { - mln_precondition(lhs.target_() == rhs.target_()); - return lhs.edge_id() == rhs.edge_id(); - } - - template <typename P> - bool - operator!=(const line_graph_psite<P>& lhs, const line_graph_psite<P>& rhs) - { - mln_precondition(lhs.target_() == rhs.target_()); - return lhs.edge_id() != rhs.edge_id(); - } - - template <typename P> - bool - operator< (const line_graph_psite<P>& lhs, const line_graph_psite<P>& rhs) - { - mln_precondition(lhs.target_() == rhs.target_()); - return lhs.edge_id() < rhs.edge_id(); - } - - - /*------------------. - | Pretty-printing. | - `------------------*/ - - template <typename P> - inline - std::ostream& - operator<<(std::ostream& ostr, const line_graph_psite<P>& p) - { - return ostr << '(' << p.first() << " -- " << p.second() << ')'; - } - -# endif // ! MLN_INCLUDE_ONLY - -} // end of mln - -#endif // MLN_CORE_IMAGE_LINE_GRAPH_PSITE_HH diff --git a/milena/mln/core/image/line_graph_window_piter.hh b/milena/mln/core/image/line_graph_window_piter.hh index f1f7d09..3b9c00e 100644 --- a/milena/mln/core/image/line_graph_window_piter.hh +++ b/milena/mln/core/image/line_graph_window_piter.hh @@ -34,25 +34,21 @@ # include <mln/core/internal/line_graph_vicinity_piter.hh> -/* FIXME: Due to the poor interface of mln::p_line_graph and - mln::util::graph, we show to much implementation details here. - Enrich their interfaces to avoid that. */ - namespace mln { /*------------------------------------. - | line_graph_window_fwd_piter<P, W>. | + | line_graph_window_fwd_piter<G, F, W>. | `------------------------------------*/ /// \brief Forward iterator on line graph window. - template <typename P, typename W> + template <typename G, typename F, typename W> class line_graph_window_fwd_piter - : public internal::line_graph_vicinity_piter_<P, W, - line_graph_window_fwd_piter<P, W> > + : public internal::line_graph_vicinity_piter_<mln_result(F), W, + line_graph_window_fwd_piter<G, F, W> > { - typedef line_graph_window_fwd_piter<P, W> self_; - typedef internal::line_graph_vicinity_piter_<P, W, self_> super_; + typedef line_graph_window_fwd_piter<G, F, W> self_; + typedef internal::line_graph_vicinity_piter_<mln_result(F), W, self_> super_; public: /// The Point_Site type. @@ -85,21 +81,21 @@ namespace mln private: /// An iterator on the set of adjacent edges. - typename super_::sites_t::const_iterator i_; + typename super_::sites_t::const_iterator i_; }; /*------------------------------------. - | line_graph_window_bkd_piter<P, W>. | + | line_graph_window_bkd_piter<G, F, W>. | `------------------------------------*/ /// \brief Backward iterator on line graph window. - template <typename P, typename W> + template <typename G, typename F, typename W> class line_graph_window_bkd_piter - : public internal::line_graph_vicinity_piter_<P, W, line_graph_window_bkd_piter<P, W> > + : public internal::line_graph_vicinity_piter_<mln_result(F), W, line_graph_window_bkd_piter<G, F, W> > { - typedef line_graph_window_bkd_piter<P, W> self_; - typedef internal::line_graph_vicinity_piter_<P, W, self_> super_; + typedef line_graph_window_bkd_piter<G, F, W> self_; + typedef internal::line_graph_vicinity_piter_<mln_result(F), W, self_> super_; public: /// The Point_Site type. @@ -132,7 +128,7 @@ namespace mln private: /// An iterator on the set of adjacent edges. - typename super_::sites_t::const_reverse_iterator i_; + typename super_::sites_t::const_reverse_iterator i_; }; @@ -140,126 +136,126 @@ namespace mln # ifndef MLN_INCLUDE_ONLY /*------------------------------------. - | line_graph_window_fwd_piter<P, W>. | + | line_graph_window_fwd_piter<G, F, W>. | `------------------------------------*/ - template <typename P, typename W> + template <typename G, typename F, typename W> inline - line_graph_window_fwd_piter<P, W>::line_graph_window_fwd_piter() + line_graph_window_fwd_piter<G, F, W>::line_graph_window_fwd_piter() { } - template <typename P, typename W> + template <typename G, typename F, typename W> template <typename Pref> inline - line_graph_window_fwd_piter<P, W>::line_graph_window_fwd_piter(const Window<W>& win, + line_graph_window_fwd_piter<G, F, W>::line_graph_window_fwd_piter(const Window<W>& win, const Pref& p_ref) : super_(p_ref) { this->change_target(exact(win)); } - template <typename P, typename W> + template <typename G, typename F, typename W> inline bool - line_graph_window_fwd_piter<P, W>::is_valid_() const + line_graph_window_fwd_piter<G, F, W>::is_valid_() const { return i_ != this->sites_.end(); } - template <typename P, typename W> + template <typename G, typename F, typename W> inline void - line_graph_window_fwd_piter<P, W>::invalidate_() + line_graph_window_fwd_piter<G, F, W>::invalidate_() { i_ = this->sites_.end(); } - template <typename P, typename W> + template <typename G, typename F, typename W> inline void - line_graph_window_fwd_piter<P, W>::do_start_() + line_graph_window_fwd_piter<G, F, W>::do_start_() { this->site_set().compute_sites_(*this); i_ = this->sites_.begin(); } - template <typename P, typename W> + template <typename G, typename F, typename W> inline void - line_graph_window_fwd_piter<P, W>::do_next_() + line_graph_window_fwd_piter<G, F, W>::do_next_() { ++i_; } - template <typename P, typename W> + template <typename G, typename F, typename W> inline mln_psite(W) - line_graph_window_fwd_piter<P, W>::compute_p_() const + line_graph_window_fwd_piter<G, F, W>::compute_p_() const { - return line_graph_psite<P>(this->center().site_set(), *i_); + return internal::edge_psite<G, F>(this->center().site_set(), *i_); } /*------------------------------------. - | line_graph_window_bkd_piter<P, W>. | + | line_graph_window_bkd_piter<G, F, W>. | `------------------------------------*/ - template <typename P, typename W> + template <typename G, typename F, typename W> inline - line_graph_window_bkd_piter<P, W>::line_graph_window_bkd_piter() + line_graph_window_bkd_piter<G, F, W>::line_graph_window_bkd_piter() { } - template <typename P, typename W> + template <typename G, typename F, typename W> template <typename Pref> inline - line_graph_window_bkd_piter<P, W>::line_graph_window_bkd_piter(const Window<W>& win, - const Pref& p_ref) + line_graph_window_bkd_piter<G, F, W>::line_graph_window_bkd_piter(const Window<W>& win, + const Pref& p_ref) : super_(p_ref) { this->change_target(exact(win)); } - template <typename P, typename W> + template <typename G, typename F, typename W> inline bool - line_graph_window_bkd_piter<P, W>::is_valid_() const + line_graph_window_bkd_piter<G, F, W>::is_valid_() const { return i_ != this->sites_.rend(); } - template <typename P, typename W> + template <typename G, typename F, typename W> inline void - line_graph_window_bkd_piter<P, W>::invalidate_() + line_graph_window_bkd_piter<G, F, W>::invalidate_() { i_ = this->sites_.rend(); } - template <typename P, typename W> + template <typename G, typename F, typename W> inline void - line_graph_window_bkd_piter<P, W>::do_start_() + line_graph_window_bkd_piter<G, F, W>::do_start_() { this->site_set().compute_sites_(*this); i_ = this->sites_.rbegin(); } - template <typename P, typename W> + template <typename G, typename F, typename W> inline void - line_graph_window_bkd_piter<P, W>::do_next_() + line_graph_window_bkd_piter<G, F, W>::do_next_() { ++i_; } - template <typename P, typename W> + template <typename G, typename F, typename W> inline mln_psite(W) - line_graph_window_bkd_piter<P, W>::compute_p_() const + line_graph_window_bkd_piter<G, F, W>::compute_p_() const { - return line_graph_psite<P>(this->center().site_set(), *i_); + return internal::edge_psite<G, F>(this->center().site_set(), *i_); } # endif // ! MLN_INCLUDE_ONLY diff --git a/milena/mln/util/internal/graph_vertex_impl.hh b/milena/mln/core/internal/graph_neighborhood_base.hh similarity index 50% copy from milena/mln/util/internal/graph_vertex_impl.hh copy to milena/mln/core/internal/graph_neighborhood_base.hh index 3abfaf5..0e39cce 100644 --- a/milena/mln/util/internal/graph_vertex_impl.hh +++ b/milena/mln/core/internal/graph_neighborhood_base.hh @@ -1,4 +1,4 @@ -// Copyright (C) 2008 EPITA Research and Development Laboratory +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -25,65 +25,68 @@ // reasons why the executable file might be covered by the GNU General // Public License. -#ifndef MLN_CORE_INTERNAL_GRAPH_VERTEX_IMPL_HH -# define MLN_CORE_INTERNAL_GRAPH_VERTEX_IMPL_HH - -/*! \file mln/util/internal/graph_vertex_impl.hh - * - * \brief Define a couple of implementation classes to provide methods - * to classes of generalized vertexs. - */ - -# include <mln/core/internal/force_exact.hh> +#ifndef MLN_CORE_INTERNAL_GRAPH_NEIGHBORHOOD_BASE_HH +# define MLN_CORE_INTERNAL_GRAPH_NEIGHBORHOOD_BASE_HH +/// \file mln/internal/graph_neighborhood_base.hh +/// +/// FIXME: doc namespace mln { - namespace util + template <typename G, typename F, typename P, typename E> + class graph_neighborhood_base : public Neighborhood< E > { - - namespace internal - { - - /// Implementation class to equip generalized vertex classes. - template <typename G> - class vertex_impl_ - { - protected: - vertex_impl_(); - }; - - } // end of namespace internal - - } // end of namespace util + typedef graph_neighborhood_base<G, F, P, E> self_; + + public: + /// Associated types. + /// \{ + /// The type of site corresponding to the neighborhood. + typedef mln_site(P) site; + + // The type of the set of neighborhood sites (ids adjacent to the + // reference psite). + typedef std::set<unsigned> sites_t; + /// \} + + /// Conversions. + /// \{ + /// The window type corresponding to this neighborhood. + typedef E window; + /// Create a window corresponding to this neighborhood. + E win() const; + /// \} + + protected: + graph_neighborhood_base(); + }; } // end of namespace mln -#ifndef MLN_INCLUDE_ONLY +# ifndef MLN_INCLUDE_ONLY namespace mln { - namespace util + template <typename G, typename F, typename P, typename E> + inline + graph_neighborhood_base<G, F, P, E>::graph_neighborhood_base() { + } - namespace internal - { - - template <typename G> - inline - vertex_impl_<G>::vertex_impl_() - { - } - - } // end of namespace internal - - } // end of namespace util + template <typename G, typename F, typename P, typename E> + inline + E + graph_neighborhood_base<G, F, P, E>::win() const + { + return E(); + } } // end of namespace mln -#endif // ! MLN_INCLUDE_ONLY +# endif // !MLN_INCLUDE_ONLY +#endif // !MLN_CORE_INTERNAL_GRAPH_NEIGHBORHOOD_BASE_HH -#endif // ! MLN_CORE_INTERNAL_GRAPH_VERTEX_IMPL_HH diff --git a/milena/mln/core/internal/graph_window_base.hh b/milena/mln/core/internal/graph_window_base.hh new file mode 100644 index 0000000..ff4bfc0 --- /dev/null +++ b/milena/mln/core/internal/graph_window_base.hh @@ -0,0 +1,146 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) +// +// 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_INTERNAL_GRAPH_WINDOW_BASE_HH +# define MLN_CORE_INTERNAL_GRAPH_WINDOW_BASE_HH + +/// \file mln/internal/graph_window_base.hh +/// +/// FIXME: doc + +namespace mln +{ + + template <typename G, typename F, typename P, typename E> + class graph_window_base : public Window< E > + { + typedef graph_window_base<G, F, P, E> self_; + + public: + /// Associated types. + /// \{ + /// The type of site corresponding to the window. + typedef mln_site(P) site; + + // The type of the set of window sites (ids adjacent to the + // reference psite). + typedef std::set<unsigned> sites_t; + + // FIXME: This is a dummy value. + typedef void dpsite; + /// \} + + /// Interface of the concept Window. + /// \{ + /// Is the window is empty? + bool is_empty() const; + /// Is the window centered? + bool is_centered() const; + /// Is the window symmetric? + // FIXME: We should define this more precisely. + bool is_symmetric() const; + /// Return the maximum coordinate gap between the window center + /// and a window point. + /* FIXME: This method returns a dummy value (0), since the delta + of a window on a graph/line_graph + + 1. is not constant (line graph edges/graph vertices are not necessarily + aligned on a regular grid); + + 2. depends on the underlying line_graph/graph, too. + + It raises another question: should delta() be part of the + concept ``Window''? */ + unsigned delta() const; + /// Apply a central symmetry to the target window. + self_& sym(); + /// \} + + protected: + graph_window_base(); + }; + +} // end of namespace mln + +# ifndef MLN_INCLUDE_ONLY + +namespace mln +{ + + template <typename G, typename F, typename P, typename E> + inline + graph_window_base<G, F, P, E>::graph_window_base() + { + } + + template <typename G, typename F, typename P, typename E> + inline + bool + graph_window_base<G, F, P, E>::is_empty() const + { + return false; + } + + template <typename G, typename F, typename P, typename E> + inline + bool + graph_window_base<G, F, P, E>::is_centered() const + { + return false; + } + + template <typename G, typename F, typename P, typename E> + inline + bool + graph_window_base<G, F, P, E>::is_symmetric() const + { + return true; + } + + template <typename G, typename F, typename P, typename E> + inline + unsigned + graph_window_base<G, F, P, E>::delta() const + { + // Dummy value (see the interface of the method above). + return 0; + } + + template <typename G, typename F, typename P, typename E> + inline + graph_window_base<G, F, P, E>& + graph_window_base<G, F, P, E>::sym() + { + return *this; + } + +} // end of namespace mln + +# endif // !MLN_INCLUDE_ONLY + +#endif // !MLN_CORE_INTERNAL_GRAPH_WINDOW_BASE_HH + diff --git a/milena/mln/core/internal/line_graph_vicinity_piter.hh b/milena/mln/core/internal/line_graph_vicinity_piter.hh index 395b014..9ef41e6 100644 --- a/milena/mln/core/internal/line_graph_vicinity_piter.hh +++ b/milena/mln/core/internal/line_graph_vicinity_piter.hh @@ -36,8 +36,6 @@ # include <set> # include <mln/core/internal/site_relative_iterator_base.hh> -# include <mln/core/site_set/p_line_graph.hh> -# include <mln/core/image/line_graph_psite.hh> /* FIXME: Factor those classes: @@ -47,9 +45,6 @@ namespace mln { - // Fwd decls. - template <typename P> class p_line_graph; - template <typename P> class line_graph_psite; // FIXME: Consider renaming line_graph_vicinity_piter_ as // line_graph_relative_piter_. @@ -72,7 +67,7 @@ namespace mln typedef void mesh; // The type of the set of vicinity sites (adjacent edge ids). - typedef std::set<util::edge_id> sites_t; + typedef std::set<unsigned> sites_t; public: /// Return the set of sites (adjacent edge ids). @@ -119,7 +114,7 @@ namespace mln template <typename P, typename S, typename E> inline - std::set<util::edge_id>& + std::set<unsigned>& line_graph_vicinity_piter_<P, S, E>::sites() { return sites_; diff --git a/milena/mln/core/site_set/p_graph.hh b/milena/mln/core/site_set/p_graph.hh deleted file mode 100644 index c0711c6..0000000 --- a/milena/mln/core/site_set/p_graph.hh +++ /dev/null @@ -1,396 +0,0 @@ -// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory -// (LRDE) -// -// 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. -// reasons why the executable file might be covered by the GNU General -// Public License. - -#ifndef MLN_CORE_SITE_SET_P_GRAPH_HH -# define MLN_CORE_SITE_SET_P_GRAPH_HH - -/// \file mln/core/site_set/p_graph.hh -/// \brief Definition of a point set based on a graph. - -# include <mln/core/internal/site_set_base.hh> -# include <mln/util/graph.hh> -# include <mln/util/tracked_ptr.hh> - -# include <mln/core/site_set/p_graph_piter.hh> - -/* FIXME: This class shares a lot with p_line_graph. Factor as much - as possible. */ - -/* FIXME: We should move the `adjacent'/`adjacent_or_equal' methods - out of this class (into iterators on *graph*). */ - - -namespace mln -{ - // Forward declaration. - template <typename P> struct p_graph; - - namespace trait - { - template <typename P> - struct site_set_< p_graph<P> > - { - typedef trait::site_set::nsites::known nsites; - // FIXME: Depends on P! - typedef trait::site_set::bbox::unknown bbox; - typedef trait::site_set::contents::fixed contents; - typedef trait::site_set::arity::unique arity; - }; - } // end of namespace mln::trait - - - template <typename P> - struct p_graph - : public internal::site_set_base_< P, p_graph<P> > - { - typedef p_graph<P> self_; - typedef internal::site_set_base_< P, self_ > super_; - - typedef util::graph graph; - - /// \brief Construct a graph psite set from a graph of points. - /// - /// \param gr The graph upon which the graph psite set is built. - /// - /// \a gr is \em copied internally, so that the graph psite set is - /// still valid after the initial graph has been removed. - p_graph(const graph& gr); - - /// Associated types. - /// \{ - /// Element associated type. - typedef mln_site(super_) element; - /// Point_Site associated type. - typedef graph_psite<P> psite; - - /// Forward Site_Iterator associated type. - typedef p_graph_fwd_piter_<P> fwd_piter; - - /// Backward Site_Iterator associated type. - typedef p_graph_bkd_piter_<P> bkd_piter; - - /// Site_Iterator associated type. - typedef fwd_piter piter; - /// \} - - /// \brief Return The number of points (sites) of the set, i.e., - /// the number of \em vertices. - /// - /// Required by the mln::Point_Set concept. - unsigned nsites() const; - - /// Return The number of vertices in the graph. - unsigned nvertices() const; - /// Return The number of edges in the graph. - unsigned nedges() const; - - /// Is this site set valid? - bool is_valid() const; - - /// Does this site set has \a p? - bool has(const psite& p) const; - - // FIXME: Dummy. - std::size_t memory_size() const; - - /// Accessors. - /// \{ - /// Return the graph associated to this site set (const version) - const graph& gr() const; - /// Return the graph associated to this site set (mutable version). - graph& gr(); - /// \} - - /// \brief Graph-related services - /// - /// \todo Move them into iterators on graphs. - /// \{ - /// Return the graph point (FIXME site?) from an index - const P& point_from_id(const util::vertex_id& id) const; - P& point_from_id(const util::vertex_id& id); - - /// Return the point contained in the first vertex adjacent - // to the edge id \a e. - const P& vertex1(const util::edge_id& e) const; - /// Return the point contained in the second vertex adjacent - /// to the edge id \a e. - const P& vertex2(const util::edge_id& e) const; - - // FIXME: These would probably be no longer needed as soon as - // iterators on graphs are available. - - /// Adjacency tests. - /// \{ - /// Return true if the psites \a lhs and \a rhs are adjacent. - /// (If \a lhs and \a rhs are equal, return false). - bool adjacent(const psite& lhs, const psite& rhs) const; - /// Return true if the vertices \a lhs and \a rhs are adjacent. - /// (If \a lhs and \a rhs are equal, return false). - bool adjacent(const util::vertex_id& lhs, const util::vertex_id& rhs) const; - - /// Return true if the psites \a lhs and \a rhs are adjacent, or equal. - bool adjacent_or_equal(const psite& lhs, const psite& rhs) const; - /// Return true if the vertices \a lhs and \a rhs are adjacent, or equal - bool adjacent_or_equal(const util::vertex_id& lhs, - const util::vertex_id& rhs) const; - /// \} - - /// \} - - public: - // FIXME: Should be private. - util::tracked_ptr<graph> gr_; - }; - - - /// \brief Comparison between two mln::p_graph's. - /// - /// Two mln::p_graph's are considered equal if they share the - /// same graph. - template <typename P> - bool - operator==(const p_graph<P>& lhs, const p_graph<P>& rhs); - - - /* FIXME: Extend the `ord' mechanism instead of this ill-defined - pseudo-order. */ - - /// \brief Inclusion of a mln::p_graph in another one. - /// - /// This inclusion relation is very strict for the moment, since our - /// infrastructure for graphs is simple: a mln::p_graph is included - /// in another one if their are equal. - /// - /// \todo Refine this later, when we are able to express subgraph - /// relations. - template <typename P> - bool - operator<=(const p_graph<P>& lhs, const p_graph<P>& rhs); - - - -# ifndef MLN_INCLUDE_ONLY - - template <typename P> - inline - p_graph<P>::p_graph(const graph& gr) - // Create a deep, managed copy of GR. - : gr_ (new util::graph(gr)) - { - } - - template <typename P> - inline - unsigned - p_graph<P>::nsites() const - { - return nvertices(); - } - - template <typename P> - inline - unsigned - p_graph<P>::nvertices() const - { - return this->gr_->nvertices(); - } - - template <typename P> - inline - unsigned - p_graph<P>::nedges() const - { - return this->gr_->nedges(); - } - - template <typename P> - inline - bool - p_graph<P>::is_valid() const - { - // FIXME: Might be too low-level, again. - return gr_.ptr_; - } - - template <typename P> - inline - bool - p_graph<P>::has(const psite& p) const - { - mln_precondition(is_valid()); - return - // Check whether P is compatible with this psite set. - (p.target_() == this) && - // Check that the vertex id of P belongs to the range of valid - // vertex ids. - (p.is_valid()); - } - - template <typename P> - inline - std::size_t - p_graph<P>::memory_size() const - { - // FIXME: Dummy; implement (see other site sets). - abort(); - return 0; - } - - template <typename P> - const typename p_graph<P>::graph& - p_graph<P>::gr() const - { - mln_precondition(is_valid()); - return *gr_.ptr; - } - - template <typename P> - typename p_graph<P>::graph& - p_graph<P>::gr() - { - mln_precondition(is_valid()); - return *gr_.ptr; - } - - template <typename P> - const P& - p_graph<P>::point_from_id(const util::vertex_id& id) const - { - return this->gr_->vertex_data(id); - } - - template <typename P> - P& - p_graph<P>::point_from_id(const util::vertex_id& id) - { - return this->gr_->vertex_data(id); - } - - template <typename P> - const P& - p_graph<P>::vertex1(const util::edge_id& e) const - { - util::vertex_id v1 = this->gr_->edge(e).v1(); - return this->point_from_id(v1); - } - - template <typename P> - const P& - p_graph<P>::vertex2(const util::edge_id& e) const - { - util::vertex_id v2 = this->gr_->edge(e).v2(); - return this->point_from_id(v2); - } - - template <typename P> - inline - bool - p_graph<P>::adjacent(const psite& lhs, const psite& rhs) const - { - mln_assertion(&lhs.pg() == this && rhs.pg() == this); - return adjacent(lhs.id(), rhs.id()); - } - - /* FIXME: This could be more efficient, if the graph structure had a - richer interface. */ - template <typename P> - inline - bool - p_graph<P>::adjacent(const util::vertex_id& lhs, - const util::vertex_id& rhs) const - { - mln_assertion(lhs < this->nsites()); - mln_assertion(rhs < this->nsites()); - - // Ensure LHS and RHS are *not* equal. - if (rhs == lhs) - return false; - - // Check whether LHS and RHS are adjacent (i.e., whether RHS is - // among the neighbors of LHS). - typedef std::vector<util::edge_id> edges_t; - const edges_t& lhs_neighbs = gr_->vertices()[lhs]->edges; - for (edges_t::const_iterator e = lhs_neighbs.begin(); - e != lhs_neighbs.end(); ++e) - if (gr_->edges()[*e]->v1() == rhs || - gr_->edges()[*e]->v2() == rhs) - return true; - - return false; - } - - template <typename P> - inline - bool - p_graph<P>::adjacent_or_equal(const psite& lhs, const psite& rhs) const - { - mln_assertion(&lhs.pg() == this && rhs.pg() == this); - return adjacent_or_equal(lhs.id(), rhs.id()); - } - - template <typename P> - inline - bool - p_graph<P>::adjacent_or_equal(const util::vertex_id& lhs, - const util::vertex_id& rhs) const - { - mln_assertion(lhs < this->nsites()); - mln_assertion(rhs < this->nsites()); - - // Check whether LHS and RHS are equal. - if (lhs == rhs) - return true; - // Check whether LHS and RHS are adjacent. - return adjacent(lhs, rhs); - } - - - template <typename P> - bool - operator==(const p_graph<P>& lhs, const p_graph<P>& rhs) - { - /* FIXME: We should not rely on pointer equality here, as graph - will soon become shells using (shared) tracked pointers to - actual data. So, delegate the equality test to the graphs - themselves. */ - return lhs.gr_.ptr_ == rhs.gr_.ptr_; - } - - template <typename P> - bool - operator<=(const p_graph<P>& lhs, const p_graph<P>& rhs) - { - return lhs == rhs; - } - -# endif // ! MLN_INCLUDE_ONLY - -} // end of mln - - -#endif // MLN_CORE_SITE_SET_P_GRAPH_HH diff --git a/milena/mln/core/site_set/p_line_graph.hh b/milena/mln/core/site_set/p_line_graph.hh deleted file mode 100644 index 28780ea..0000000 --- a/milena/mln/core/site_set/p_line_graph.hh +++ /dev/null @@ -1,360 +0,0 @@ -// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory -// (LRDE) -// -// 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. -// reasons why the executable file might be covered by the GNU General -// Public License. - -#ifndef MLN_CORE_SITE_SET_P_LINE_GRAPH_HH -# define MLN_CORE_SITE_SET_P_LINE_GRAPH_HH - -/// \file mln/core/site_set/p_line_graph.hh -/// \brief Definition of a point set based on a line graph. - -# include <mln/core/internal/site_set_base.hh> -# include <mln/util/graph.hh> -# include <mln/util/tracked_ptr.hh> -# include <mln/util/site_pair.hh> - -# include <mln/core/image/line_graph_psite.hh> -# include <mln/core/site_set/p_line_graph_piter.hh> - -/* FIXME: This class shares a lot with p_graph. Factor as much as - possible. */ - -/* FIXME: We should move the `adjacent'/`adjacent_or_equal' methods - out of this class (into iterators on *graph*). */ - -namespace mln -{ - - // Forward declaration. - template<typename P> struct p_line_graph; - - - namespace trait - { - template <typename P> - struct site_set_< p_line_graph<P> > - { - typedef trait::site_set::nsites::known nsites; - // FIXME: Depends on P! - typedef trait::site_set::bbox::unknown bbox; - typedef trait::site_set::contents::fixed contents; - typedef trait::site_set::arity::unique arity; - }; - } // end of namespace mln::trait - - - template<typename P> - struct p_line_graph - : public internal::site_set_base_< util::site_pair<P>, p_line_graph<P> > - { - typedef p_line_graph<P> self_; - typedef internal::site_set_base_< util::site_pair<P>, self_ > super_; - - typedef util::graph<P> graph; - - /// \brief Construct a line graph psite set from a graph of points. - /// - /// \param gr The graph upon which the line graph psite set is built. - /// - /// \a gr is \em copied internally, so that the line graph psite - /// set is still valid after the initial graph has been removed. - p_line_graph(const graph& gr); - - /// Associated types. - /// \{ - /// Element associated type. - typedef mln_site(super_) element; - - /// Point_Site associated type. - typedef line_graph_psite<P> psite; - - /// Forward Site_Iterator associated type. - typedef p_line_graph_fwd_piter_<P> fwd_piter; - - /// Backward Site_Iterator associated type. - typedef p_line_graph_bkd_piter_<P> bkd_piter; - - /// Site_Iterator associated type. - typedef fwd_piter piter; - /// \} - - /// \brief Return The number of sites of the set, i.e., the number - /// of \em edges. - /// - /// (Required by the mln::Site_Set concept, since the property - /// trait::site_set::nsites::known of this site set is set to - /// `known'.) - /* FIXME: Return type should be std::size_t (see - mln/core/concept/site_set.hh). */ - unsigned nsites() const; - - /// Return The number of vertices in the graph. - unsigned nvertices() const; - /// Return The number of edges in the graph. - unsigned nedges() const; - - /// Is this site set valid? - bool is_valid() const; - - /// Does this site set has \a p? - bool has(const psite& p) const; - - // FIXME: Dummy. - std::size_t memory_size() const; - - /// Accessors. - /// \{ - /// Return the graph associated to this site set (const version) - const graph& gr() const; - /// Return the graph associated to this site set (mutable version). - graph& gr(); - /// \} - - // FIXME: These would probably be no longer needed as soon as - // iterators on graphs are available. - - /// Adjacency tests. - /// \{ - /// Return true if the psites \a lhs and \a rhs are adjacent. - /// (If \a lhs and \a rhs are equal, return false). - bool adjacent(const psite& lhs, const psite& rhs) const; - /// Return true if the edges \a lhs and \a rhs are adjacent. - /// (If \a lhs and \a rhs are equal, return false). - bool adjacent(const util::edge_id& lhs, const util::edge_id& rhs) const; - - /// Return true if the psites \a lhs and \a rhs are adjacent, or equal. - bool adjacent_or_equal(const psite& lhs, const psite& rhs) const; - /// Return true if the edges \a lhs and \a rhs are adjacent, or equal - bool adjacent_or_equal(const util::edge_id& lhs, - const util::edge_id& rhs) const; - /// \} - - // FIXME: Should be private. - /// The graph on which the pset is built. - util::tracked_ptr<graph> gr_; - }; - - - /// \brief Comparison between two mln::p_line_graph's. - /// - /// Two mln::p_line_graph's are considered equal if they share the - /// same graph. - template <typename P> - bool - operator==(const p_line_graph<P>& lhs, const p_line_graph<P>& rhs); - - - /* FIXME: Extend the `ord' mechanism instead of this ill-defined - pseudo-order. */ - - /// \brief Inclusion of a mln::p_line_graph in another one. - /// - /// This inclusion relation is very strict for the moment, since our - /// infrastructure for graphs is simple: a mln::p_line_graph is - /// included in another one if their are equal. - /// - /// \todo Refine this later, when we are able to express subgraph - /// relations. - template <typename P> - bool - operator<=(const p_line_graph<P>& lhs, const p_line_graph<P>& rhs); - - - -# ifndef MLN_INCLUDE_ONLY - - template <typename P> - inline - p_line_graph<P>::p_line_graph(const graph& gr) - // Create a deep, managed copy of GR. - : gr_(new util::graph<P>(gr)) - { - } - - template <typename P> - inline - unsigned - p_line_graph<P>::nsites() const - { - return nedges(); - } - - template <typename P> - inline - unsigned - p_line_graph<P>::nvertices() const - { - return this->gr_->nvertices(); - } - - template <typename P> - inline - unsigned - p_line_graph<P>::nedges() const - { - return this->gr_->nedges(); - } - - template <typename P> - inline - bool - p_line_graph<P>::is_valid() const - { - // FIXME: Might be too low-level, again. - return gr_.ptr_; - } - - template <typename P> - inline - bool - p_line_graph<P>::has(const psite& p) const - { - mln_precondition(is_valid()); - return - // Check whether P is compatible with this psite set. - (p.target_() == this) && - // Check that the edge id of P belongs to the range of valid edge ids. - (p.is_valid()); - } - - template <typename P> - inline - std::size_t - p_line_graph<P>::memory_size() const - { - // FIXME: Dummy; implement (see other site sets). - abort(); - return 0; - } - - template <typename P> - const util::graph<P>& - p_line_graph<P>::gr() const - { - mln_precondition(is_valid()); - return *gr_.ptr_; - } - - template <typename P> - util::graph<P>& - p_line_graph<P>::gr() - { - mln_precondition(is_valid()); - return *gr_.ptr_; - } - - template <typename P> - inline - bool - p_line_graph<P>::adjacent(const psite& lhs, const psite& rhs) const - { - mln_assertion(&lhs.plg() == this && rhs.plg() == this); - return adjacent(lhs.id(), rhs.id()); - } - - /* FIXME: This could be more efficient, if the graph structure had a - richer interface. */ - template <typename P> - inline - bool - p_line_graph<P>::adjacent(const util::edge_id& lhs, - const util::edge_id& rhs) const - { - mln_assertion(lhs < this->nsites()); - mln_assertion(rhs < this->nsites()); - - // Ensure LHS and RHS are *not* equal. - if (lhs == rhs) - return false; - - // Check whether LHS and RHS are adjacent (i.e., whether LHS and - // RHS share a common vertex. - /* FIXME: This is too low-level. Yet another service the graph - should provide. */ - if (gr_->edge(lhs).v1() == gr_->edge(rhs).v1() || - gr_->edge(lhs).v1() == gr_->edge(rhs).v2() || - gr_->edge(lhs).v2() == gr_->edge(rhs).v1() || - gr_->edge(lhs).v2() == gr_->edge(rhs).v2()) - return true; - - return false; - } - - template <typename P> - inline - bool - p_line_graph<P>::adjacent_or_equal(const psite& lhs, const psite& rhs) const - { - mln_assertion(&lhs.pg() == this && rhs.pg() == this); - return adjacent_or_equal(lhs.id(), rhs.id()); - } - - template <typename P> - inline - bool - p_line_graph<P>::adjacent_or_equal(const util::edge_id& lhs, - const util::edge_id& rhs) const - { - mln_assertion(lhs < this->nsites()); - mln_assertion(rhs < this->nsites()); - - // Check whether LHS and RHS are equal. - if (lhs == rhs) - return true; - // Check whether RHS and LHS are adjacent. - return adjacent(lhs, rhs); - } - - - /*--------------. - | Comparisons. | - `--------------*/ - - template <typename P> - bool - operator==(const p_line_graph<P>& lhs, const p_line_graph<P>& rhs) - { - /* FIXME: We should not rely on pointer equality here, as graph - will soon become shells using (shared) tracked pointers to - actual data. So, delegate the equality test to the graphs - themselves. */ - return lhs.gr_.ptr_ == rhs.gr_.ptr_; - } - - template <typename P> - bool - operator<=(const p_line_graph<P>& lhs, const p_line_graph<P>& rhs) - { - return lhs == rhs; - } - -# endif // ! MLN_INCLUDE_ONLY - -} // end of mln - - -#endif // ! MLN_CORE_SITE_SET_P_LINE_GRAPH_HH diff --git a/milena/mln/core/site_set/p_line_graph_piter.hh b/milena/mln/core/site_set/p_line_graph_piter.hh deleted file mode 100644 index 8c73c26..0000000 --- a/milena/mln/core/site_set/p_line_graph_piter.hh +++ /dev/null @@ -1,272 +0,0 @@ -// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory -// (LRDE) -// -// 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. -// reasons why the executable file might be covered by the GNU General -// Public License. - -#ifndef MLN_CORE_SITE_SET_P_LINE_GRAPH_PITER_HH -# define MLN_CORE_SITE_SET_P_LINE_GRAPH_PITER_HH - -/// \file mln/core/site_set/p_line_graph_piter.hh -/// \brief Definition of point iterators on line graph-based site set. - -# include <mln/core/internal/site_set_iterator_base.hh> -# include <mln/core/site_set/p_line_graph.hh> -# include <mln/core/image/line_graph_psite.hh> - -/* FIXME: Iterators on p_graph and p_line_graph share common code. - Factor as much as possible. */ - - -namespace mln -{ - - // Forward declarations. - template <typename P> class p_line_graph; - template <typename P> class line_graph_psite; - - - /*-----------------------------. - | p_line_graph_fwd_piter_<P>. | - `-----------------------------*/ - - /// \brief Forward iterator on point sites of a mln::p_line_graph<P>. - template <typename P> - class p_line_graph_fwd_piter_ - : public internal::site_set_iterator_base< p_line_graph<P>, - p_line_graph_fwd_piter_<P> > - { - typedef p_line_graph_fwd_piter_<P> self_; - typedef internal::site_set_iterator_base< p_line_graph<P>, self_ > super_; - - public: - /// Construction and assignment. - /// \{ - p_line_graph_fwd_piter_(); - p_line_graph_fwd_piter_(const p_line_graph<P>& plg); - /// \} - - /// Manipulation. - /// \{ - /// Test if the iterator is valid. - bool is_valid_() const; - /// Invalidate the iterator. - void invalidate_(); - - /// Start an iteration. - void start_(); - /// Go to the next point. - void next_(); - /// \} - - protected: - /// The psite corresponding to this iterator. - using super_::p_; - }; - - - /// Print an mln::p_line_graph_fwd_piter_<P>. - template <typename P> - inline - std::ostream& - operator<<(std::ostream& ostr, const p_line_graph_fwd_piter_<P>& p); - - - /*-----------------------------. - | p_line_graph_bkd_piter_<P>. | - `-----------------------------*/ - - /// \brief Backward iterator on point sites of a mln::p_line_graph<P>. - template <typename P> - class p_line_graph_bkd_piter_ - : public internal::site_set_iterator_base< p_line_graph<P>, - p_line_graph_bkd_piter_<P> > - { - typedef p_line_graph_bkd_piter_<P> self_; - typedef internal::site_set_iterator_base< p_line_graph<P>, self_ > super_; - - public: - /// Construction and assignment. - /// \{ - p_line_graph_bkd_piter_(); - p_line_graph_bkd_piter_(const p_line_graph<P>& plg); - /// \} - - /// Manipulation. - /// \{ - /// Test if the iterator is valid. - bool is_valid_() const; - /// Invalidate the iterator. - void invalidate_(); - - /// Start an iteration. - void start_(); - /// Go to the next point. - void next_(); - /// \} - - protected: - /// The psite corresponding to this iterator. - using super_::p_; - }; - - - /// Print an mln::p_line_graph_bkd_piter_<P>. - template <typename P> - inline - std::ostream& - operator<<(std::ostream& ostr, const p_line_graph_bkd_piter_<P>& p); - - - -# ifndef MLN_INCLUDE_ONLY - - /*-----------------------------. - | p_line_graph_fwd_piter_<P>. | - `-----------------------------*/ - - template <typename P> - inline - p_line_graph_fwd_piter_<P>::p_line_graph_fwd_piter_() - { - mln_postcondition(!this->is_valid()); - } - - template <typename P> - inline - p_line_graph_fwd_piter_<P>::p_line_graph_fwd_piter_(const p_line_graph<P>& plg) - { - this->change_target(plg); - mln_postcondition(!this->is_valid()); - } - - template <typename P> - inline - bool - p_line_graph_fwd_piter_<P>::is_valid_() const - { - return p_.is_valid(); - } - - template <typename P> - inline - void - p_line_graph_fwd_piter_<P>::invalidate_() - { - p_.invalidate(); - } - - template <typename P> - inline - void - p_line_graph_fwd_piter_<P>::start_() - { - p_.change_edge_id(0); - } - - template <typename P> - inline - void - p_line_graph_fwd_piter_<P>::next_() - { - p_.inc_edge_id(); - } - - - template <typename P> - inline - std::ostream& - operator<<(std::ostream& ostr, const p_line_graph_fwd_piter_<P>& p) - { - return ostr << p.unproxy_(); - } - - - /*-----------------------------. - | p_line_graph_bkd_piter_<P>. | - `-----------------------------*/ - - template <typename P> - inline - p_line_graph_bkd_piter_<P>::p_line_graph_bkd_piter_() - { - mln_postcondition(!this->is_valid()); - } - - template <typename P> - inline - p_line_graph_bkd_piter_<P>::p_line_graph_bkd_piter_(const p_line_graph<P>& plg) - { - this->change_target(plg); - mln_postcondition(!this->is_valid()); - } - - template <typename P> - inline - bool - p_line_graph_bkd_piter_<P>::is_valid_() const - { - return p_.is_valid(); - } - - template <typename P> - inline - void - p_line_graph_bkd_piter_<P>::invalidate_() - { - p_.change_edge_id(this->site_set().nedges()); - } - - template <typename P> - inline - void - p_line_graph_bkd_piter_<P>::start_() - { - p_.change_edge_id(this->site_set().nedges() - 1); - } - - template <typename P> - inline - void - p_line_graph_bkd_piter_<P>::next_() - { - p_.dec_edge_id(); - } - - - template <typename P> - inline - std::ostream& - operator<<(std::ostream& ostr, const p_line_graph_bkd_piter_<P>& p) - { - return ostr << p.unproxy_(); - } - -# endif // ! MLN_INCLUDE_ONLY - -} // end of mln - - -#endif // ! MLN_CORE_SITE_SET_P_LINE_GRAPH_PITER_HH diff --git a/milena/mln/make/all.hh b/milena/mln/make/all.hh index 5d11136..910d943 100644 --- a/milena/mln/make/all.hh +++ b/milena/mln/make/all.hh @@ -55,7 +55,7 @@ namespace mln # include <mln/make/pixel.hh> # include <mln/make/point2d_h.hh> # include <mln/make/vec.hh> -//# include <mln/make/voronoi.hh> +# include <mln/make/voronoi.hh> # include <mln/make/w_window.hh> # include <mln/make/w_window1d.hh> # include <mln/make/w_window1d_int.hh> diff --git a/milena/mln/make/essential.hh b/milena/mln/make/essential.hh index d0e8f85..856e75a 100644 --- a/milena/mln/make/essential.hh +++ b/milena/mln/make/essential.hh @@ -40,9 +40,9 @@ # include <mln/make/pix.hh> # include <mln/make/pixel.hh> # include <mln/make/vec.hh> -//# include <mln/make/voronoi.hh> +# include <mln/make/voronoi.hh> # include <mln/make/w_window.hh> # include <mln/make/w_window_directional.hh> -//# include <mln/make/win_chamfer.hh> +# include <mln/make/win_chamfer.hh> #endif // ! MLN_MAKE_ESSENTIAL_HH diff --git a/milena/mln/make/voronoi.hh b/milena/mln/make/voronoi.hh index 0127c97..30101f2 100644 --- a/milena/mln/make/voronoi.hh +++ b/milena/mln/make/voronoi.hh @@ -29,18 +29,18 @@ #ifndef MLN_MAKE_VORONOI_HH # define MLN_MAKE_VORONOI_HH -/*! \file mln/make/voronoi.hh - * - * \brief Routine to construct a Voronoi mln::p_graph. - */ +/// \file mln/make/voronoi.hh +/// +/// Routine to construct a Voronoi mln::p_graph. # include <vector> # include <map> # include <mln/core/concept/neighborhood.hh> -# include <mln/core/site_set/p_graph.hh> +# include <mln/core/site_set/p_vertices.hh> # include <mln/accu/mean.hh> # include <mln/estim/min_max.hh> +# include <mln/util/graph.hh> namespace mln { @@ -48,10 +48,9 @@ namespace mln namespace make { + /// Apply the Voronoi algorithm on \p ima_ with the original + /// image \p orig_ for node computing with neighborhood \p nbh. /*! - * \brief Apply the Voronoi algorithm on \p ima_ with the original - * image \p orig_ for node computing with neighborhood \p nbh. - * * \param[in] ima_ The labeling image. * \param[in] orig_ The original image. * \param[in] nbh The neighborhood for computing algorithm. @@ -59,7 +58,7 @@ namespace mln * \return The computed graph. */ template <typename I, typename N> - p_graph<mln_psite(I)> + p_vertices<util::graph, fun::i2v::array<mln_site(I)> > voronoi (Image<I>& ima_, Image<I>& orig_, const Neighborhood<N>& nbh); @@ -68,7 +67,7 @@ namespace mln template <typename I, typename N> inline - p_graph<mln_psite(I)> + p_vertices<util::graph, fun::i2v::array<mln_site(I)> > voronoi (Image<I>& ima_, Image<I>& orig_, const Neighborhood<N>& nbh) @@ -79,11 +78,11 @@ namespace mln I& ima = exact(ima_); I& orig = exact(orig_); - util::graph<void> gr; + util::graph gr; V min, max; estim::min_max (ima, min, max); unsigned nb = max - min + 1; - std::vector<P> v(nb); + fun::i2v::array<P> v(nb); std::vector< accu::mean< X > > tab_mean (nb); std::map<std::pair<V, V>, bool> m; @@ -120,7 +119,7 @@ namespace mln gr.add_vertex(); /// FIXME - v[i] = point2d ((unsigned)tab_mean[i].to_result ()[0], + v[i] = point2d ((unsigned)tab_mean[i].to_result ()[0], (unsigned)tab_mean[i].to_result ()[1]); } @@ -128,7 +127,7 @@ namespace mln for (; it != m.end (); ++it) gr.add_edge((*it).first.first, (*it).first.second); - p_graph<P> res(gr, v); + p_vertices<util::graph, fun::i2v::array<P> > res(gr, v); return res; } diff --git a/milena/mln/util/graph.hh b/milena/mln/util/graph.hh index 0f8c1fa..dfcbc23 100644 --- a/milena/mln/util/graph.hh +++ b/milena/mln/util/graph.hh @@ -30,7 +30,7 @@ # define MLN_UTIL_GRAPH_HH /// \file mln/util/graph.hh -/// \brief Definitions of undirected graphs. +/// Definitions of undirected graphs. # include <mln/util/internal/graph_base.hh> # include <mln/util/internal/graph_iter.hh> diff --git a/milena/mln/util/internal/graph_edge_impl.hh b/milena/mln/util/internal/graph_edge_impl.hh index 7f77f2a..3b75086 100644 --- a/milena/mln/util/internal/graph_edge_impl.hh +++ b/milena/mln/util/internal/graph_edge_impl.hh @@ -1,4 +1,4 @@ -// Copyright (C) 2008 EPITA Research and Development Laboratory +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -28,11 +28,10 @@ #ifndef MLN_CORE_INTERNAL_GRAPH_EDGE_IMPL_HH # define MLN_CORE_INTERNAL_GRAPH_EDGE_IMPL_HH -/*! \file mln/util/internal/graph_edge_impl.hh - * - * \brief Define a couple of implementation classes to provide methods - * to classes of generalized edges. - */ +/// \file mln/util/internal/graph_edge_impl.hh +/// +/// Define a couple of implementation classes to provide methods +/// to classes of generalized edges. # include <mln/core/internal/force_exact.hh> diff --git a/milena/mln/util/internal/graph_edge_psite.hh b/milena/mln/util/internal/graph_edge_psite.hh index 05ad74f..c1c7d16 100644 --- a/milena/mln/util/internal/graph_edge_psite.hh +++ b/milena/mln/util/internal/graph_edge_psite.hh @@ -30,6 +30,7 @@ # include <mln/core/concept/pseudo_site.hh> # include <mln/util/internal/graph_psite_base.hh> +# include <mln/util/internal/graph_edge.hh> namespace mln { @@ -112,7 +113,7 @@ namespace mln template <typename G, typename F> inline edge_psite<G, F>::edge_psite(const target_t& t, unsigned id) - : super_(id) + : super_(t, id) { } diff --git a/milena/mln/util/internal/graph_vertex_impl.hh b/milena/mln/util/internal/graph_vertex_impl.hh index 3abfaf5..bfe6360 100644 --- a/milena/mln/util/internal/graph_vertex_impl.hh +++ b/milena/mln/util/internal/graph_vertex_impl.hh @@ -1,4 +1,4 @@ -// Copyright (C) 2008 EPITA Research and Development Laboratory +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -28,11 +28,10 @@ #ifndef MLN_CORE_INTERNAL_GRAPH_VERTEX_IMPL_HH # define MLN_CORE_INTERNAL_GRAPH_VERTEX_IMPL_HH -/*! \file mln/util/internal/graph_vertex_impl.hh - * - * \brief Define a couple of implementation classes to provide methods - * to classes of generalized vertexs. - */ +/// \file mln/util/internal/graph_vertex_impl.hh +/// +/// Define a couple of implementation classes to provide methods +/// to classes of generalized vertexs. # include <mln/core/internal/force_exact.hh> diff --git a/milena/tests/core/image/graph_image.cc b/milena/tests/core/image/graph_image.cc index 4c3f09a..9fc556c 100644 --- a/milena/tests/core/image/graph_image.cc +++ b/milena/tests/core/image/graph_image.cc @@ -46,12 +46,10 @@ #include <mln/core/image/graph_elt_neighborhood.hh> #include <mln/fun/i2v/array.hh> -#include <mln/fun/p2v/iota.hh> #include <mln/util/graph.hh> #include <mln/debug/graph.hh> -//#include <mln/debug/iota.hh> #include <mln/debug/println.hh> #include <mln/core/concept/function.hh> @@ -101,18 +99,18 @@ int main() */ // Points associated to vertices. - typedef fun::i2v::array<point2d> fpoint_t; - fpoint_t points(5); - points(0) = point2d(0,0); // Point associated to vertex 0. - points(1) = point2d(2,2); // Point associated to vertex 1. - points(2) = point2d(0,4); // Point associated to vertex 2. - points(3) = point2d(4,3); // Point associated to vertex 3. - points(4) = point2d(4,4); // Point associated to vertex 4. + typedef fun::i2v::array<point2d> fsite_t; + fsite_t sites(5); + sites(0) = point2d(0,0); // Point associated to vertex 0. + sites(1) = point2d(2,2); // Point associated to vertex 1. + sites(2) = point2d(0,4); // Point associated to vertex 2. + sites(3) = point2d(4,3); // Point associated to vertex 3. + sites(4) = point2d(4,4); // Point associated to vertex 4. // Edges. util::graph g; // Populate the graph with vertices. - for (unsigned i = 0; i < points.size(); ++i) + for (unsigned i = 0; i < sites.size(); ++i) g.add_vertex(); // Populate the graph with edges. g.add_edge(0, 1); @@ -127,8 +125,8 @@ int main() | Graph image support. | `----------------------*/ - typedef p_vertices<util::graph, fpoint_t> S; - S pv(g, points); + typedef p_vertices<util::graph, fsite_t> S; + S pv(g, sites); /*-------------. | Graph image. | @@ -187,7 +185,7 @@ int main() { // Window - Forward iteration - typedef graph_elt_window<util::graph, fpoint_t> win_t; + typedef graph_elt_window<util::graph, fsite_t> win_t; win_t win; mln_qiter_(win_t) q(win, p); for_all (p) @@ -201,7 +199,7 @@ int main() { // Window - Backward iteration - typedef graph_elt_window<util::graph, fpoint_t> win_t; + typedef graph_elt_window<util::graph, fsite_t> win_t; win_t win; mln_bkd_qiter_(win_t) q(win, p); for_all (p) @@ -215,29 +213,33 @@ int main() { // Neighborhood - Forward iteration - typedef graph_elt_neighborhood<util::graph, fpoint_t> neigh_t; + typedef graph_elt_neighborhood<util::graph, fsite_t> neigh_t; neigh_t neigh; mln_niter_(neigh_t) n(neigh, p); for_all (p) { - std::cout << "neighbors of " << p << " (" << ima(p) << "), " - << "including the site itself:" << std::endl; + std::cout << "neighbors of " << p << " (" << ima(p) << "), " << std::endl; for_all (n) + { + mln_assertion(n != p); std::cout << " " << n << " (level = " << ima(n) << ")" << std::endl; + } } } { // Neighborhood - Backward iteration - typedef graph_elt_neighborhood<util::graph, fpoint_t> neigh_t; + typedef graph_elt_neighborhood<util::graph, fsite_t> neigh_t; neigh_t neigh; mln_bkd_niter_(neigh_t) n(neigh, p); for_all (p) { - std::cout << "neighbors of " << p << " (" << ima(p) << "), " - << "including the site itself:" << std::endl; + std::cout << "neighbors of " << p << " (" << ima(p) << "), " << std::endl; for_all (n) + { + mln_assertion(n != p); std::cout << " " << n << " (level = " << ima(n) << ")" << std::endl; + } } } std::cout << std::endl; diff --git a/milena/tests/core/image/line_graph_image.cc b/milena/tests/core/image/line_graph_image.cc index 74d374b..360623c 100644 --- a/milena/tests/core/image/line_graph_image.cc +++ b/milena/tests/core/image/line_graph_image.cc @@ -31,9 +31,41 @@ #include <vector> #include <mln/core/alias/point2d.hh> -#include <mln/core/image/line_graph_image.hh> +#include <mln/pw/all.hh> + +//#include <mln/core/image/line_graph_image.hh> #include <mln/core/image/line_graph_elt_window.hh> -#include <mln/core/image/line_graph_window_piter.hh> +#include <mln/core/image/line_graph_elt_neighborhood.hh> +#include <mln/core/site_set/p_edges.hh> + +#include <mln/fun/i2v/array.hh> + +#include <mln/util/graph.hh> + +#include <mln/core/var.hh> + +template <typename S> +struct viota_t : public mln::Function_p2v< viota_t<S> > +{ + typedef unsigned result; + + viota_t(unsigned size) + { + v_.resize(size); + for (unsigned i = 0; i < size; ++i) + v_[i] = 10 + i; + } + + unsigned + operator()(const mln_psite(S)& p) const + { + return v_[p.e().id()]; + } + + protected: + std::vector<result> v_; +}; + int main() @@ -48,7 +80,7 @@ int main() 0 1 2 3 4 0 1 2 3 4 .----------- .----------- - | | + | | 0 | 0 2 0 | * * 1 | \ / | 1 | 0 1 | 2 | 1 | 2 | * 4 @@ -57,19 +89,19 @@ int main() */ - // Points associated to vertices. - std::vector<point2d> points; - points.push_back(point2d(0,0)); // Point associated to vertex 0. - points.push_back(point2d(2,2)); // Point associated to vertex 1. - points.push_back(point2d(0,4)); // Point associated to vertex 2. - points.push_back(point2d(4,3)); // Point associated to vertex 3. - points.push_back(point2d(4,4)); // Point associated to vertex 4. + // Sites associated to edges. + typedef fun::i2v::array<point2d> fsite_t; + fsite_t sites(5); + sites(0) = point2d(0,0); // Point associated to edge 0. + sites(1) = point2d(2,2); // Point associated to edge 1. + sites(2) = point2d(0,4); // Point associated to edge 2. + sites(3) = point2d(4,3); // Point associated to edge 3. + sites(4) = point2d(4,4); // Point associated to edge 4. - // Edges. - util::graph<point2d> g; + util::graph g; // Populate the graph with vertices. - for (unsigned i = 0; i < points.size(); ++i) - g.add_vertex (points[i]); + for (unsigned i = 0; i < sites.size(); ++i) + g.add_vertex(); // Populate the graph with edges. g.add_edge(0, 1); g.add_edge(1, 2); @@ -81,33 +113,18 @@ int main() | Line graph image support. | `---------------------------*/ - p_line_graph<point2d> plg(g); - - // Check adjacencies of edge 1. - mln_assertion( plg.adjacent(1, 0)); - mln_assertion(!plg.adjacent(1, 1)); - mln_assertion( plg.adjacent(1, 2)); - mln_assertion(!plg.adjacent(1, 3)); - mln_assertion( plg.adjacent(1, 4)); + typedef p_edges<util::graph, fsite_t> S; + S pe(g, sites); /*-------------------. | Line graph image. | `-------------------*/ - // Values ("empty" vectors). - std::vector<int> vertex_values(5); - std::vector<int> edge_values(5); - // FIXME: hand-made iota's. - for (unsigned i = 0; i < vertex_values.size(); ++i) - vertex_values[i] = i; - for (unsigned i = 0; i < edge_values.size(); ++i) - edge_values[i] = i; - - // Line graph image. - /* FIXME: We probably don't want to build line_graph_images by hand; - provide helpers and/or conversion functions. */ - typedef line_graph_image<point2d, int> ima_t; - ima_t ima(plg, vertex_values, edge_values); + // Graph values. + viota_t<S> iota(5); + + // Create line graph image. + mln_const_VAR(ima, (iota | pe)); /*------------. | Iterators. | @@ -115,20 +132,68 @@ int main() // Manual iteration over the domain of IMA. mln_piter_(ima_t) p(ima.domain()); + unsigned i = 10; for_all (p) - std::cout << "ima (" << p << ") = " << ima(p) << std::endl; + mln_assertion(ima(p) == i++); + + { + // Window - Forward iteration + typedef line_graph_elt_window<util::graph, fsite_t> win_t; + win_t win; + mln_qiter_(win_t) q(win, p); + for_all (p) + { + std::cout << "neighbors of " << p << " (" << ima(p) << "), " + << "including the site itself:" << std::endl; + for_all (q) + std::cout << " " << q << " (level = " << ima(q) << ")" << std::endl; + } + } - // Manual iterations over the neighborhoods of each point site of IMA. - typedef line_graph_elt_window<point2d> win_t; - win_t win; - mln_qiter_(win_t) q(win, p); - for_all (p) { - std::cout << "sites adjacent to " << p << " (" << ima(p) << "), " - << "including the site itself:" << std::endl; - for_all (q) - std::cout << " " << q << " (level = " << ima(q) << ")" - << std::endl; + // Window - Backward iteration + typedef line_graph_elt_window<util::graph, fsite_t> win_t; + win_t win; + mln_bkd_qiter_(win_t) q(win, p); + for_all (p) + { + std::cout << "neighbors of " << p << " (" << ima(p) << "), " + << "including the site itself:" << std::endl; + for_all (q) + std::cout << " " << q << " (level = " << ima(q) << ")" << std::endl; + } } + { + // Neighborhood - Forward iteration + typedef line_graph_elt_neighborhood<util::graph, fsite_t> neigh_t; + neigh_t neigh; + mln_niter_(neigh_t) n(neigh, p); + for_all (p) + { + std::cout << "neighbors of " << p << " (" << ima(p) << "), " << std::endl; + for_all (n) + { + mln_assertion(n != p); + std::cout << " " << n << " (level = " << ima(n) << ")" << std::endl; + } + } + } + + { + // Neighborhood - Backward iteration + typedef line_graph_elt_neighborhood<util::graph, fsite_t> neigh_t; + neigh_t neigh; + mln_bkd_niter_(neigh_t) n(neigh, p); + for_all (p) + { + std::cout << "neighbors of " << p << " (" << ima(p) << "), " << std::endl; + for_all (n) + { + mln_assertion(n != p); + std::cout << " " << n << " (level = " << ima(n) << ")" << std::endl; + } + } + } + std::cout << std::endl; } diff --git a/milena/tests/core/site_set/p_edges.cc b/milena/tests/core/site_set/p_edges.cc index 9ab01a1..1210bce 100644 --- a/milena/tests/core/site_set/p_edges.cc +++ b/milena/tests/core/site_set/p_edges.cc @@ -1,4 +1,5 @@ // Copyright (C) 2008 EPITA Research and Development Laboratory +// (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -25,10 +26,9 @@ // reasons why the executable file might be covered by the GNU General // Public License. -/*! \file tests/core/site_set/p_edges.cc - * - * \brief Tests on mln::p_edges. - */ +/// \file tests/core/site_set/p_edges.cc +/// +/// Tests on mln::p_edges. #include <mln/util/graph.hh> #include <mln/core/alias/point2d.hh> @@ -40,10 +40,10 @@ struct my_fun { typedef mln::point2d result; - const result& operator()(const mln::util::edge<G>& v) const + const result& operator()(unsigned v) const { static mln::point2d res(0, 0); - res.row() = v.id(); + res.row() = v; return res; } }; diff --git a/milena/tests/core/site_set/p_vertices.cc b/milena/tests/core/site_set/p_vertices.cc index b2c600d..f94ad3b 100644 --- a/milena/tests/core/site_set/p_vertices.cc +++ b/milena/tests/core/site_set/p_vertices.cc @@ -1,4 +1,4 @@ -// Copyright (C) 2008 EPITA Research and Development Laboratory +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -25,10 +25,9 @@ // reasons why the executable file might be covered by the GNU General // Public License. -/*! \file tests/core/site_set/p_vertices.cc - * - * \brief Tests on mln::p_vertices. - */ +/// \file tests/core/site_set/p_vertices.cc +/// +/// Tests on mln::p_vertices. #include <mln/util/graph.hh> #include <mln/core/alias/point2d.hh> -- 1.5.6.5
16 years, 1 month
1
0
0
0
cleanup-2008 2880: Migrate generic code from morpho erosion to new files in accu.
by Thierry Geraud
https://svn.lrde.epita.fr/svn/oln/branches/cleanup-2008/milena
Index: ChangeLog from Thierry Geraud <thierry.geraud(a)lrde.epita.fr> Migrate generic code from morpho erosion to new files in accu. * mln/morpho/erosion.spe.hh (erosion_arbitrary_2d_fastest_functor): Move and rename as... * mln/accu/snake_2d.hh (snake_2d_fastest_functor): ...this. (todo): New. (snake_2d): Move code into (and call it)... (snake_2d_dispatch): ...these new routines. * mln/morpho/erosion.spe.hh (dp_directional): Move into... * mln/accu/transform_directional.hh: ...this new file. * mln/morpho/erosion.spe.hh: . (dp_directional, erosion_directional_nd_functor), (erosion_directional_nd_fastest_functor): Move and rename as... * mln/accu/transform_directional.hh (directional_functor, directional_fastest_functor): ...these. (transform_directional, transform_directional_dispatch): New. * mln/morpho/erosion.spe.hh (erosion_on_set_fastest): Remove. It is obsolete since handled by accu::transform, called by... (generic::erosion_on_set): ...this. * mln/morpho/includes.hh (include): Update. * tests/morpho/erosion.cc: Update. mln/accu/snake_2d.hh | 218 +++++++++++++ mln/accu/transform_directional.hh | 347 +++++++++++++++++++++ mln/morpho/erosion.spe.hh | 602 +------------------------------------- mln/morpho/includes.hh | 2 tests/morpho/erosion.cc | 45 -- 5 files changed, 586 insertions(+), 628 deletions(-) Index: tests/morpho/erosion.cc --- tests/morpho/erosion.cc (revision 2879) +++ tests/morpho/erosion.cc (working copy) @@ -65,7 +65,9 @@ // trace::quiet = false; + // Rectangle + { ref = morpho::impl::generic::erosion_on_function(lena, rec); } @@ -77,18 +79,14 @@ } { - out = morpho::impl::erosion_arbitrary_2d_fastest(lena, rec); - bool test = out == ref; - mln_assertion(test); - } - - { out = morpho::impl::erosion_arbitrary_2d(lena, rec); bool test = out == ref; mln_assertion(test); } + //Hline + { ref = morpho::impl::generic::erosion_on_function(lena, hline); } @@ -100,19 +98,14 @@ } { - out = morpho::impl::erosion_arbitrary_2d_fastest(lena, hline); - bool test = out == ref; - mln_assertion(test); - } - - - { out = morpho::impl::erosion_arbitrary_2d(lena, hline); bool test = out == ref; mln_assertion(test); } + //Vline + { ref = morpho::impl::generic::erosion_on_function(lena, vline); } @@ -123,14 +116,6 @@ mln_assertion(test); } - - { - out = morpho::impl::erosion_arbitrary_2d_fastest(lena, vline); - bool test = out == ref; - mln_assertion(test); - } - - { out = morpho::impl::erosion_arbitrary_2d(lena, vline); bool test = out == ref; @@ -150,20 +135,13 @@ mln_assertion(test); } - - { - out = morpho::impl::erosion_arbitrary_2d_fastest(lena, diag2d); - bool test = out == ref; - mln_assertion(test); - } - - { out = morpho::impl::erosion_arbitrary_2d(lena, diag2d); bool test = out == ref; mln_assertion(test); } + //Backdiag2d { @@ -176,14 +154,6 @@ mln_assertion(test); } - - { - out = morpho::impl::erosion_arbitrary_2d_fastest(lena, backdiag2d); - bool test = out == ref; - mln_assertion(test); - } - - { out = morpho::impl::erosion_arbitrary_2d(lena, backdiag2d); bool test = out == ref; @@ -193,6 +163,7 @@ // Octagon + { ref = morpho::impl::generic::erosion_on_function(lena, oct); io::pgm::save(ref, "out_oct_ref.pgm"); Index: mln/accu/snake_2d.hh --- mln/accu/snake_2d.hh (revision 2879) +++ mln/accu/snake_2d.hh (working copy) @@ -32,13 +32,20 @@ /// /// Run an accumulator in a snake-like browsing. /// +/// \todo Rename as transform_snake_2d. +/// /// \todo Make it n-D. +/// +/// \todo Split dispatch and impl. +/// +/// \todo Pass the accumulator to the function-object. #include <mln/core/concept/image.hh> #include <mln/core/concept/meta_accumulator.hh> #include <mln/core/alias/window2d.hh> #include <mln/win/diff.hh> #include <mln/win/shift.hh> +#include <mln/geom/delta.hh> #include <mln/extension/adjust.hh> #include <mln/canvas/browsing/snake_generic.hh> @@ -83,6 +90,8 @@ } + // Functor. + template <typename I, typename W, typename A> struct snake_2d_functor { @@ -232,45 +241,234 @@ }; + + // Functor (fastest version). + + template <typename I, typename W, typename A> + struct snake_2d_fastest_functor + { + typedef snake_2d_fastest_functor<I,W,A> self; + typedef void (self::*move_fun)(); + typedef mln_deduce(I, psite, delta) dpsite; + + const I& input; + const W& win; + mln_concrete(I) output; + A accu; + + mln_psite(I) p; + + window2d + win_left_fwd, + win_right_fwd, + win_left_bkd, + win_right_bkd, + win_bot_up, + win_top_up, + win_bot_down, + win_top_down; + + mln_qixter(const I, window2d) + q_l_fwd, + q_r_fwd, + q_l_bkd, + q_r_bkd, + q_top_up, + q_bot_up, + q_top_down, + q_bot_down; + + + std::vector<move_fun> moves; + std::vector<dpsite> dps; + + snake_2d_fastest_functor(const I& input, const W& win) + : input(input), + win(win), + accu(), + + win_left_fwd(win::shift(win, mln::left) - win), + win_right_fwd(win - win::shift(win, mln::left)), + win_left_bkd(win::shift(win_left_fwd, mln::right)), + win_right_bkd(win::shift(win_right_fwd, mln::right)), + + win_bot_up(win::shift(win, mln::down) - win), + win_top_up(win - win::shift(win, mln::down)), + win_bot_down(win::shift(win_bot_up, mln::up)), + win_top_down(win::shift(win_top_up, mln::up)), + + q_l_fwd(input, win_left_fwd, p), + q_r_fwd(input, win_right_fwd, p), + q_l_bkd(input, win_left_bkd, p), + q_r_bkd(input, win_right_bkd, p), + + q_top_up(input, win_top_up, p), + q_bot_up(input, win_bot_up, p), + q_top_down(input, win_top_down, p), + q_bot_down(input, win_bot_down, p), + + moves(3), + dps(3) + { + if (win_bot_up.size() + win_top_up.size() + + win_bot_down.size() + win_top_down.size() < + win_left_fwd.size() + win_right_fwd.size() + + win_left_bkd.size() + win_right_bkd.size()) + { + // Vertical snake + dps[0] = mln::right; + dps[1] = mln::down; + dps[2] = mln::up; + moves[0] = &self::right; + moves[1] = &self::down; + moves[2] = &self::up; + } + else + { + // Horizontal snake + dps[0] = mln::down; + dps[1] = mln::right; + dps[2] = mln::left; + moves[0] = &self::down; + moves[1] = &self::right; + moves[2] = &self::left; + } + } + + void init() + { + // extension::adjust_fill is performed in the routine + // because it has to be done before the initialization of + // the fast iterators (q_*). + initialize(output, input); + accu.init(); + p = input.domain().pmin() - dps[0]; + mln_qixter(const I, W) q(input, win, p); + for_all(q) + accu.take(q.val()); + p = input.domain().pmin(); + } + + void right() + { + for_all(q_l_fwd) + accu.untake(q_l_fwd.val()); + for_all(q_r_fwd) + accu.take(q_r_fwd.val()); + output(p) = accu; + } + + void left() + { + for_all(q_r_bkd) + accu.untake(q_r_bkd.val()); + for_all(q_l_bkd) + accu.take(q_l_bkd.val()); + output(p) = accu; + } + + void down() + { + for_all(q_top_down) + accu.untake(q_top_down.val()); + for_all(q_bot_down) + accu.take(q_bot_down.val()); + output(p) = accu; + } + + void up() + { + for_all(q_bot_up) + accu.untake(q_bot_up.val()); + for_all(q_top_up) + accu.take(q_top_up.val()); + output(p) = accu; + } + + }; + + + // Both dispatch and implementation (hum...) + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_result(A)) + snake_2d_dispatch(trait::image::speed::any, + const Accumulator<A>& /* FIXME a */, + const Image<I>& input, const Window<W>& win) + { + typedef snake_2d_functor<I, W, A> F; + F f(exact(input), exact(win)); // FIXME: Pass a to f. + canvas::browsing::snake_generic(f); + return f.output; + } + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_result(A)) + snake_2d_dispatch(trait::image::speed::fastest, + const Accumulator<A>& /* FIXME a*/, + const Image<I>& input, const Window<W>& win) + { + typedef snake_2d_fastest_functor<I, W, A> F; + F f(exact(input), exact(win)); // FIXME: Pass a to f. + canvas::browsing::snake_generic(f); + return f.output; + } + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_result(A)) + snake_2d_dispatch(const Accumulator<A>& a, + const Image<I>& input, const Window<W>& win) + { + return snake_2d_dispatch(mln_trait_image_speed(I)(), + a, input, win); + } + } // end of namespace mln::accu::internal + template <typename A, typename I, typename W> inline mln_ch_value(I, mln_result(A)) - snake_2d(const Accumulator<A>&, const Image<I>& input, const Window<W>& win) + snake_2d(const Accumulator<A>& a, + const Image<I>& input, const Window<W>& win) { trace::entering("accu::snake_2d"); internal::snake_2d_tests(input, win); - extension::adjust(input, win); - internal::snake_2d_functor<I, W, A> f(input, win); - canvas::browsing::snake_generic(f); + extension::adjust(input, geom::delta(win) + 1); + mln_ch_value(I, mln_result(A)) output; + output = internal::snake_2d_dispatch(a, input, win); trace::exiting("accu::snake_2d"); - return f.output; + return output; } template <typename A, typename I, typename W> inline mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) - snake_2d(const Meta_Accumulator<A>&, const Image<I>& input, const Window<W>& win) + snake_2d(const Meta_Accumulator<A>& a, + const Image<I>& input, const Window<W>& win) { trace::entering("accu::snake_2d"); internal::snake_2d_tests(input, win); typedef mln_accu_with(A, mln_value(I)) A_; + A_ a_ = accu::unmeta(exact(a), mln_value(I)()); - extension::adjust(input, win); - internal::snake_2d_functor<I, W, A_> f(input, win); - canvas::browsing::snake_generic(f); + extension::adjust(input, geom::delta(win) + 1); + mln_ch_value(I, mln_result(A_)) output; + output = internal::snake_2d_dispatch(a_, input, win); trace::exiting("accu::snake_2d"); - return f.output; + return output; } Index: mln/accu/transform_directional.hh --- mln/accu/transform_directional.hh (revision 0) +++ mln/accu/transform_directional.hh (revision 0) @@ -0,0 +1,347 @@ +// Copyright (C) 2008 EPITA Research and Development Laboratory (LRDE) +// +// This file is part of the Olena Library. This library is free +// software; you can redistribute it and/or modify it under the terms +// of the GNU General Public License version 2 as published by the +// Free Software Foundation. +// +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this library; see the file COPYING. If not, write to +// the Free Software Foundation, 51 Franklin Street, Fifth Floor, +// Boston, MA 02111-1307, USA. +// +// As a special exception, you may use this file as part of a free +// software library without restriction. Specifically, if other files +// instantiate templates or use macros or inline functions from this +// file, or you compile this file and link it with other files to +// produce an executable, this file does not by itself cause the +// resulting executable to be covered by the GNU General Public +// License. This exception does not however invalidate any other +// reasons why the executable file might be covered by the GNU General +// Public License. + +#ifndef MLN_ACCU_TRANSFORM_DIRECTIONAL_HH +# define MLN_ACCU_TRANSFORM_DIRECTIONAL_HH + +/// \file mln/accu/transform_directional.hh +/// +/// Run an accumulator over a particular direction. +/// +/// \todo Split dispatch and impl. +/// +/// \todo Pass the accumulator to the function-object. + + +#include <mln/core/concept/image.hh> +#include <mln/core/concept/meta_accumulator.hh> +#include <mln/core/alias/window2d.hh> +#include <mln/win/diff.hh> +#include <mln/win/shift.hh> +#include <mln/geom/delta.hh> +#include <mln/literal/zero.hh> +#include <mln/extension/adjust.hh> +#include <mln/canvas/browsing/directional.hh> + + + +namespace mln +{ + + namespace accu + { + + + template <typename A, typename I, typename W> + mln_ch_value(I, mln_result(A)) + transform_directional(const Accumulator<A>&, + const Image<I>& input, const Window<W>& win, + unsigned dir); + + + template <typename A, typename I, typename W> + mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) + transform_directional(const Meta_Accumulator<A>&, + const Image<I>& input, const Window<W>& win, + unsigned dir); + + + +# ifndef MLN_INCLUDE_ONLY + + namespace internal + { + + + // Tests. + + + template <typename I, typename W> + void transform_directional_tests(const Image<I>& input_, const Window<W>& win_) + { + const I& input = exact(input_); + const W& win = exact(win_); + + mln_precondition(input.has_data()); + mln_precondition(! win.is_empty()); + // mln_precondition(! win.is_valid()); + + (void) input; + (void) win; + } + + + + // Utility. + + + template <typename Dp> + Dp dp_directional(int dir) + { + Dp dp = literal::zero; + dp[dir] = 1; + return dp; + } + + + + // Functor. + + + template <typename I_, typename W, typename A> + struct directional_functor + { + typedef I_ I; + typedef mln_deduce(I, psite, delta) dpsite; + + const I& input; + const W& win; + mln_concrete(I) output; + A accu; + enum { dim = I::site::dim }; + + mln_psite(I) p; + unsigned dir; + + window2d + win_left, + win_right; + + mln_qiter(window2d) + q_l, + q_r; + + directional_functor(const I& input, const W& win, int dir) + : input(input), + win(win), + accu(), + dir(dir), + win_left(win::shift(win, -dp_directional<dpsite>(dir)) - win), + win_right(win - win::shift(win, -dp_directional<dpsite>(dir))), + q_l(win_left, p), + q_r(win_right, p) + { + + } + + void init() + { + initialize(output, input); + } + + void init_run() + { + accu.init(); + p[dir]--; + mln_qiter(W) q(win, p); + for_all(q) if (input.has(q)) + accu.take(input(q)); + p[dir]++; + } + + void next() + { + for_all(q_l) if (input.has(q_l)) + accu.untake(input(q_l)); + for_all(q_r) if (input.has(q_r)) + accu.take(input(q_r)); + output(p) = accu; + } + + void final() + { + } + + }; + + + + // Functor (fastest version). + + + template <typename I_, typename W, typename A> + struct directional_fastest_functor + { + typedef I_ I; + typedef mln_deduce(I, psite, delta) dpsite; + + const I& input; + const W& win; + mln_concrete(I) output; + A accu; + + mln_psite(I) p; + enum { dim = I::site::dim }; + unsigned dir; + + window2d win_left, win_right; + + mln_qixter(const I, window2d) q_l, q_r; + + directional_fastest_functor(const I& input, const W& win, unsigned dir) + : input(input), + win(win), + accu(), + dir(dir), + win_left(win::shift(win, -dp_directional<dpsite>(dir)) - win), + win_right(win - win::shift(win, -dp_directional<dpsite>(dir))), + q_l(input, win_left, p), + q_r(input, win_right, p) + { + } + + void init() + { + initialize(output, input); + } + + void next() + { + for_all(q_l) + accu.untake(q_l.val()); + for_all(q_r) + accu.take(q_r.val()); + output(p) = accu; + } + + + void init_run() + { + accu.init(); + p[dir]--; + mln_qixter(const I, W) q(input, win, p); + for_all(q) + accu.take(q.val()); + p[dir]++; + } + + void final() + { + } + + }; + + + + + // Both dispatch and implementation (hum...) + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_result(A)) + transform_directional_dispatch(trait::image::speed::any, + const Accumulator<A>& /* FIXME a */, + const Image<I>& input, const Window<W>& win, + unsigned dir) + { + typedef directional_functor<I, W, A> F; + F f(exact(input), exact(win), dir); // FIXME: Pass a to f. + canvas::browsing::directional(f); + return f.output; + } + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_result(A)) + transform_directional_dispatch(trait::image::speed::fastest, + const Accumulator<A>& /* FIXME a*/, + const Image<I>& input, const Window<W>& win, + unsigned dir) + { + typedef directional_fastest_functor<I, W, A> F; + F f(exact(input), exact(win), dir); // FIXME: Pass a to f. + canvas::browsing::directional(f); + return f.output; + } + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_result(A)) + transform_directional_dispatch(const Accumulator<A>& a, + const Image<I>& input, const Window<W>& win, + unsigned dir) + { + return transform_directional_dispatch(mln_trait_image_speed(I)(), + a, input, win, dir); + } + + } // end of namespace mln::accu::internal + + + + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_result(A)) + transform_directional(const Accumulator<A>& a, + const Image<I>& input, const Window<W>& win, + unsigned dir) + { + trace::entering("accu::transform_directional"); + + internal::transform_directional_tests(input, win); + + extension::adjust(input, geom::delta(win) + 1); + mln_ch_value(I, mln_result(A)) output; + output = internal::transform_directional_dispatch(a, input, win, dir); + + trace::exiting("accu::transform_directional"); + return output; + } + + + template <typename A, typename I, typename W> + inline + mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) + transform_directional(const Meta_Accumulator<A>& a, + const Image<I>& input, const Window<W>& win, + unsigned dir) + { + trace::entering("accu::transform_directional"); + + internal::transform_directional_tests(input, win); + + typedef mln_accu_with(A, mln_value(I)) A_; + A_ a_ = accu::unmeta(exact(a), mln_value(I)()); + + extension::adjust(input, geom::delta(win) + 1); + mln_ch_value(I, mln_result(A_)) output; + output = internal::transform_directional_dispatch(a_, input, win, dir); + + trace::exiting("accu::transform_directional"); + return output; + } + + +# endif // ! MLN_INCLUDE_ONLY + + } // end of namespace mln::accu + +} // end of namespace mln + + +#endif // ! MLN_ACCU_TRANSFORM_DIRECTIONAL_HH Index: mln/morpho/erosion.spe.hh --- mln/morpho/erosion.spe.hh (revision 2879) +++ mln/morpho/erosion.spe.hh (working copy) @@ -95,37 +95,8 @@ erosion_on_set(const Image<I>& input_, const Window<W>& win_); } - template <typename I, typename W> - mln_concrete(I) - erosion_on_set_fastest(const Image<I>& input_, const Window<W>& win_) - { - trace::entering("morpho::impl::erosion_on_set_fastest"); - - typedef mln_concrete(I) O; - const I& input = exact(input_); - const W& win = exact(win_); - - extension::adjust_fill(input, win, true); - - O output; - initialize(output, input); - - mln_pixter(const I) p(input); - mln_pixter(O) p_out(output); - mln_qixter(const I, W) q(p, win); - for_all_2(p, p_out) - { - for_all(q) - if (q.val() == false) - break; - p_out.val() = ! q.is_valid(); - } - - trace::exiting("morpho::impl::erosion_on_set_fastest"); - - return output; - } + // On set with centered window. template <typename I, typename W> mln_concrete(I) @@ -189,6 +160,7 @@ } + template <typename I, typename G, unsigned Dir, typename C> inline mln_concrete(I) @@ -277,313 +249,7 @@ return output; } - template <typename I, typename W, typename A> - struct erosion_arbitrary_2d_fastest_functor - { - typedef erosion_arbitrary_2d_fastest_functor<I,W,A> self; - typedef void (self::*move_fun)(); - typedef mln_deduce(I, psite, delta) dpsite; - - const I& input; - const W& win; - mln_concrete(I) output; - A accu; - - mln_psite(I) p; - - window2d - win_left_fwd, - win_right_fwd, - win_left_bkd, - win_right_bkd, - win_bot_up, - win_top_up, - win_bot_down, - win_top_down; - - mln_qixter(const I, window2d) - q_l_fwd, - q_r_fwd, - q_l_bkd, - q_r_bkd, - q_top_up, - q_bot_up, - q_top_down, - q_bot_down; - - - std::vector<move_fun> moves; - std::vector<dpsite> dps; - - erosion_arbitrary_2d_fastest_functor(const I& input, const W& win) - : input(input), - win(win), - accu(), - - win_left_fwd(win::shift(win, mln::left) - win), - win_right_fwd(win - win::shift(win, mln::left)), - win_left_bkd(win::shift(win_left_fwd, mln::right)), - win_right_bkd(win::shift(win_right_fwd, mln::right)), - - win_bot_up(win::shift(win, mln::down) - win), - win_top_up(win - win::shift(win, mln::down)), - win_bot_down(win::shift(win_bot_up, mln::up)), - win_top_down(win::shift(win_top_up, mln::up)), - - q_l_fwd(input, win_left_fwd, p), - q_r_fwd(input, win_right_fwd, p), - q_l_bkd(input, win_left_bkd, p), - q_r_bkd(input, win_right_bkd, p), - - q_top_up(input, win_top_up, p), - q_bot_up(input, win_bot_up, p), - q_top_down(input, win_top_down, p), - q_bot_down(input, win_bot_down, p), - - moves(3), - dps(3) - { - if (win_bot_up.size() + win_top_up.size() + - win_bot_down.size() + win_top_down.size() < - win_left_fwd.size() + win_right_fwd.size() + - win_left_bkd.size() + win_right_bkd.size()) - { - // Vertical snake - dps[0] = mln::right; - dps[1] = mln::down; - dps[2] = mln::up; - moves[0] = &self::right; - moves[1] = &self::down; - moves[2] = &self::up; - } - else - { - // Horizontal snake - dps[0] = mln::down; - dps[1] = mln::right; - dps[2] = mln::left; - moves[0] = &self::down; - moves[1] = &self::right; - moves[2] = &self::left; - } - } - - void init() - { - // extension::adjust_fill is performed in the routine - // because it has to be done before the initialization of - // the fast iterators (q_*). - initialize(output, input); - accu.init(); - p = input.domain().pmin() - dps[0]; - mln_qixter(const I, W) q(input, win, p); - for_all(q) - accu.take(q.val()); - p = input.domain().pmin(); - } - - void right() - { - for_all(q_l_fwd) - accu.untake(q_l_fwd.val()); - for_all(q_r_fwd) - accu.take(q_r_fwd.val()); - output(p) = accu; - } - - void left() - { - for_all(q_r_bkd) - accu.untake(q_r_bkd.val()); - for_all(q_l_bkd) - accu.take(q_l_bkd.val()); - output(p) = accu; - } - - void down() - { - for_all(q_top_down) - accu.untake(q_top_down.val()); - for_all(q_bot_down) - accu.take(q_bot_down.val()); - output(p) = accu; - } - - void up() - { - for_all(q_bot_up) - accu.untake(q_bot_up.val()); - for_all(q_top_up) - accu.take(q_top_up.val()); - output(p) = accu; - } - }; - - template <typename I, typename W> - inline - mln_concrete(I) - erosion_arbitrary_2d_fastest(const Image<I>& input, const Window<W>& win) - { - trace::entering("morpho::impl:erosion_arbitrary_2d_fastest"); - - typedef mlc_is(mln_trait_image_kind(I), - trait::image::kind::binary) is_binary; - typedef mlc_if(is_binary, accu::land, accu::min_h<mln_value(I)>) A; - - extension::adjust_fill(input, - geom::delta(win) + 1, - A()); - - typedef erosion_arbitrary_2d_fastest_functor<I, W, A> F; - F f(exact(input), exact(win)); - canvas::browsing::snake_generic(f); - - trace::exiting("morpho::impl:erosion_arbitrary_2d_fastest"); - - return f.output; - } - - - template <typename I, typename W, typename A> - struct erosion_arbitrary_2d_functor - { - typedef erosion_arbitrary_2d_functor<I,W, A> self; - typedef void (self::*move_fun)(); - typedef mln_deduce(I, psite, delta) dpsite; - - const I& input; - const W& win; - mln_concrete(I) output; - A accu; - - mln_psite(I) p; - - window2d - win_left_fwd, - win_right_fwd, - win_left_bkd, - win_right_bkd, - win_bot_up, - win_top_up, - win_bot_down, - win_top_down; - - mln_qiter(window2d) - q_l_fwd, - q_r_fwd, - q_l_bkd, - q_r_bkd, - q_top_up, - q_bot_up, - q_top_down, - q_bot_down; - - std::vector<move_fun> moves; - std::vector<dpsite> dps; - - erosion_arbitrary_2d_functor(const I& input, const W& win) - : input(input), - win(win), - accu(), - - win_left_fwd(win::shift(win, mln::left) - win), - win_right_fwd(win - win::shift(win, mln::left)), - win_left_bkd(win::shift(win_left_fwd, mln::right)), - win_right_bkd(win::shift(win_right_fwd, mln::right)), - - win_bot_up(win::shift(win, mln::down) - win), - win_top_up(win - win::shift(win, mln::down)), - win_bot_down(win::shift(win_bot_up, mln::up)), - win_top_down(win::shift(win_top_up, mln::up)), - - q_l_fwd(win_left_fwd, p), - q_r_fwd(win_right_fwd, p), - q_l_bkd(win_left_bkd, p), - q_r_bkd(win_right_bkd, p), - - q_top_up(win_top_up, p), - q_bot_up(win_bot_up, p), - q_top_down(win_top_down, p), - q_bot_down(win_bot_down, p), - - moves(3), - dps(3) - { - if (win_bot_up.size() + win_top_up.size() + - win_bot_down.size() + win_top_down.size() < - win_left_fwd.size() + win_right_fwd.size() + - win_left_bkd.size() + win_right_bkd.size()) - { - // Vertical snake - dps[0] = mln::right; - dps[1] = mln::down; - dps[2] = mln::up; - moves[0] = &self::right; - moves[1] = &self::down; - moves[2] = &self::up; - } - else - { - // Horizontal snake - dps[0] = mln::down; - dps[1] = mln::right; - dps[2] = mln::left; - moves[0] = &self::down; - moves[1] = &self::right; - moves[2] = &self::left; - } - } - - void init() - { - extension::adjust_fill(input, win, accu); - initialize(output, input); - accu.init(); - p = input.domain().pmin() - dps[0]; - mln_qiter(W) q(win, p); - for_all(q) - accu.take(input(q)); - p = input.domain().pmin(); - } - - void right() - { - for_all(q_l_fwd) - accu.untake(input(q_l_fwd)); - for_all(q_r_fwd) - accu.take(input(q_r_fwd)); - output(p) = accu; - } - - void left() - { - for_all(q_r_bkd) - accu.untake(input(q_r_bkd)); - for_all(q_l_bkd) - accu.take(input(q_l_bkd)); - output(p) = accu; - } - - void down() - { - for_all(q_top_down) - accu.untake(input(q_top_down)); - for_all(q_bot_down) - accu.take(input(q_bot_down)); - output(p) = accu; - } - - void up() - { - for_all(q_bot_up) - accu.untake(input(q_bot_up)); - for_all(q_top_up) - accu.take(input(q_top_up)); - output(p) = accu; - } - - }; template <typename I, typename W> inline @@ -592,203 +258,39 @@ { trace::entering("morpho::impl:erosion_arbitrary_2d"); - typedef erosion_arbitrary_2d_functor<I, W, accu::min_h<mln_value(I)> > F; - F f(exact(input), exact(win)); - canvas::browsing::snake_generic(f); - - trace::exiting("morpho::impl:erosion_arbitrary_2d"); - - return f.output; - } - - - template <typename Dp> - Dp dp_directional(int dir) - { - Dp dp = literal::zero; - dp[dir] = 1; - return dp; - } - - template <typename I_, typename W, typename A> - struct erosion_directional_nd_functor - { - typedef I_ I; - typedef mln_deduce(I, psite, delta) dpsite; - - const I& input; - const W& win; - mln_concrete(I) output; - A accu; - enum { dim = I::site::dim }; - - mln_psite(I) p; - unsigned dir; - - window2d - win_left, - win_right; - - mln_qiter(window2d) - q_l, - q_r; - - erosion_directional_nd_functor(const I& input, const W& win, int dir) - : input(input), - win(win), - accu(), - dir(dir), - win_left(win::shift(win, -dp_directional<dpsite>(dir)) - win), - win_right(win - win::shift(win, -dp_directional<dpsite>(dir))), - q_l(win_left, p), - q_r(win_right, p) - { - - } - - void init() - { - extension::adjust_fill(input, win, accu); - initialize(output, input); - } - - void init_run() - { - accu.init(); - p[dir]--; - mln_qiter(W) q(win, p); - for_all(q) if (input.has(q)) - accu.take(input(q)); - p[dir]++; - } - - void next() - { - for_all(q_l) if (input.has(q_l)) - accu.untake(input(q_l)); - for_all(q_r) if (input.has(q_r)) - accu.take(input(q_r)); - output(p) = accu; - } - - void final() - { - } - - }; - - template <typename I, typename W> - inline - mln_concrete(I) - erosion_directional_nd(const Image<I>& input, const Window<W>& win, unsigned dir) - { - trace::entering("morpho::impl:erosion_directional_nd"); - - typedef mlc_is(mln_trait_image_kind(I), - trait::image::kind::binary) is_binary; + typedef mlc_is(mln_trait_image_kind(I), trait::image::kind::binary) is_binary; typedef mlc_if(is_binary, accu::land, accu::min_h<mln_value(I)>) A; + A a; - typedef erosion_directional_nd_functor<I, W, A> F; - F f(exact(input), exact(win), dir); - canvas::browsing::directional(f); - - trace::exiting("morpho::impl:erosion_directional_nd"); - - return f.output; - } - - - template <typename I_, typename W, typename A> - struct erosion_directional_nd_fastest_functor - { - typedef I_ I; - typedef mln_deduce(I, psite, delta) dpsite; - - const I& input; - const W& win; - mln_concrete(I) output; - A accu; - - mln_psite(I) p; - enum { dim = I::site::dim }; - unsigned dir; - - window2d win_left, win_right; - - mln_qixter(const I, window2d) q_l, q_r; - - erosion_directional_nd_fastest_functor(const I& input, const W& win, unsigned dir) - : input(input), - win(win), - accu(), - dir(dir), - win_left(win::shift(win, -dp_directional<dpsite>(dir)) - win), - win_right(win - win::shift(win, -dp_directional<dpsite>(dir))), - q_l(input, win_left, p), - q_r(input, win_right, p) - { - } - - void init() - { - // extension::adjust_fill is performed in the routine - // because it has to be done before the initialization of - // the fast iterators (q_l and q_r). - initialize(output, input); - } - - void next() - { - for_all(q_l) - accu.untake(q_l.val()); - for_all(q_r) - accu.take(q_r.val()); - output(p) = accu; - } - + extension::adjust_fill(input, geom::delta(win) + 1, a); + mln_concrete(I) output = accu::snake_2d(a, input, win); - void init_run() - { - accu.init(); - p[dir]--; - mln_qixter(const I, W) q(input, win, p); - for_all(q) - accu.take(q.val()); - p[dir]++; - } - - void final() - { + trace::exiting("morpho::impl:erosion_arbitrary_2d"); + return output; } - }; template <typename I, typename W> inline mln_concrete(I) - erosion_directional_nd_fastest(const Image<I>& input, const Window<W>& win, unsigned dir) + erosion_directional(const Image<I>& input, const Window<W>& win, unsigned dir) { - trace::entering("morpho::impl:erosion_directional_nd_fastest"); + trace::entering("morpho::impl:erosion_directional"); - typedef mlc_is(mln_trait_image_kind(I), - trait::image::kind::binary) is_binary; + typedef mlc_is(mln_trait_image_kind(I), trait::image::kind::binary) is_binary; typedef mlc_if(is_binary, accu::land, accu::min_h<mln_value(I)>) A; + A a; - extension::adjust_fill(input, - geom::delta(win) + 1, - A()); - - typedef erosion_directional_nd_fastest_functor<I, W, A> F; - F f(exact(input), exact(win), dir); - canvas::browsing::directional(f); - - trace::exiting("morpho::impl:erosion_directional_nd_fastest"); + extension::adjust_fill(input, geom::delta(win) + 1, a); + mln_concrete(I) output = accu::transform_directional(a, input, win, dir); - return f.output; + trace::exiting("morpho::impl:erosion_directional"); + return output; } + // Diagonal2d non fastest. template <typename I_, typename W, typename A> struct erosion_diagonal2d_functor @@ -1172,68 +674,6 @@ } - // dispatch for arbitrary elements - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_arbitrary(trait::image::speed::fastest, - const I& input, const W& win) - { - return impl::erosion_arbitrary_2d_fastest(input, win); - } - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_arbitrary(trait::image::speed::any, - const I& input, const W& win) - { - return impl::erosion_arbitrary_2d(input, win); - } - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_arbitrary(const I& input, const W& win) - { - trace::entering("morpho::erosion_dispatch_for_arbitrary"); - mln_concrete(I) ima = - erosion_dispatch_for_arbitrary(mln_trait_image_speed(I)(), - input, win); - trace::exiting("morpho::erosion_dispatch_for_arbitrary"); - return ima; - } - - - - // dispatch for directional_nd w.r.t. speed - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_directional(trait::image::speed::fastest, - const I& input, const W& win, unsigned dir) - { - return impl::erosion_directional_nd_fastest(input, win, dir); - } - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_directional(trait::image::speed::any, - const I& input, const W& win, unsigned dir) - { - return impl::erosion_directional_nd(input, win, dir); - } - - template <typename I, typename W> - mln_concrete(I) - erosion_dispatch_for_directional(const I& input, const W& win, unsigned dir) - { - trace::entering("morpho::erosion_dispatch_for_directional"); - mln_concrete(I) ima = - erosion_dispatch_for_directional(mln_trait_image_speed(I)(), - input, win, dir); - trace::exiting("morpho::erosion_dispatch_for_directional"); - return ima; - } - // dispatch for diagonal2d w.r.t. speed @@ -1305,7 +745,7 @@ erosion_dispatch_wrt_arbitrary_win(metal::true_, const I& input, const W& win) { - return erosion_dispatch_for_arbitrary(input, win); + return morpho::impl::erosion_arbitrary_2d(input, win); } template <typename I, typename W> @@ -1351,7 +791,7 @@ erosion_dispatch_wrt_win(const I& input, const win::octagon2d& win) { if (win.length() < 5) - return erosion_dispatch_for_arbitrary(input, win); + return morpho::impl::erosion_arbitrary_2d(input, win); else return impl::erosion_octagon2d(input, win); } @@ -1365,7 +805,7 @@ erosion_dispatch_wrt_win(metal::true_, const I& input, const win::hline2d& win) { - return erosion_dispatch_for_directional(input, win, 1); + return impl::erosion_directional(input, win, 1); } template <typename I> @@ -1405,7 +845,7 @@ erosion_dispatch_wrt_win(metal::true_, const I& input, const win::vline2d& win) { - return erosion_dispatch_for_directional(input, win, 0); + return impl::erosion_directional(input, win, 0); } template <typename I> Index: mln/morpho/includes.hh --- mln/morpho/includes.hh (revision 2879) +++ mln/morpho/includes.hh (working copy) @@ -51,8 +51,10 @@ # include <mln/accu/max_h.hh> # include <mln/accu/rank.hh> +# include <mln/accu/snake_2d.hh> # include <mln/accu/transform.hh> # include <mln/accu/transform_stop.hh> +# include <mln/accu/transform_directional.hh> # include <mln/fun/v2v/saturate.hh>
16 years, 1 month
1
0
0
0
scool r130: Fix verbatim C++
by Maxime van Noppen
From: Maxime van Noppen <yabo(a)lrde.epita.fr> To: transformers-patches(a)lrde.epita.fr, olena-patches(a)lrde.epita.fr Subject: scool r130: Fix verbatim C++ URL:
https://svn.lrde.epita.fr/svn/scool/branches/scool-ng
ChangeLog: 2008-11-14 Maxime van Noppen <yabo(a)lrde.epita.fr> Fix verbatim C++. * pp-cxx/CxxStm.str: Add a semicolon when verbatim C++ is used as an * expression. * scl-syn/Expression.sdf: Verbatim C++ may be an expression. * scl-syn/Lexical.sdf: Fix regexp. * scl-syn/Statement.sdf: Add a semicolon after verbatim C++ blocks * to be coherent with the other statements syntax. * scoolt/Expression.str: Handle verbatim C++ when used as an expression. * scoolt/Statement.str: F. --- pp-cxx/CxxStm.str | 2 +- scl-syn/Expression.sdf | 2 ++ scl-syn/Lexical.sdf | 2 +- scl-syn/Statement.sdf | 4 ++-- scoolt/Expression.str | 3 +++ scoolt/Statement.str | 2 +- 6 files changed, 10 insertions(+), 5 deletions(-) Index: branches/scool-ng/src/pp-cxx/CxxStm.str =================================================================== --- branches/scool-ng/src/pp-cxx/CxxStm.str (revision 129) +++ branches/scool-ng/src/pp-cxx/CxxStm.str (revision 130) @@ -5,7 +5,7 @@ rules CxxStmToAbox: - CxxExpStm(e) -> H hs=0 [ ~<CxxExpToAbox> e ~<Semicolon> e] + CxxExpStm(e) -> H hs=0 [ ~<CxxExpToAbox> e ";"] // Don't add an extra ';' to verbatim C++ that we insert. // As said on
https://trac.lrde.org/scool/wiki/SCOOL/Specs/Misc
the C++ inserted Index: branches/scool-ng/src/scoolt/Expression.str =================================================================== --- branches/scool-ng/src/scoolt/Expression.str (revision 129) +++ branches/scool-ng/src/scoolt/Expression.str (revision 130) @@ -17,6 +17,9 @@ BaseExpressionToCxx: Integer(int) -> CxxInt(int) + BaseExpressionToCxx: + Cxx(cxx_code) -> CxxProgram(cxx_code) + ExpressionToCxx: Index: branches/scool-ng/src/scoolt/Statement.str =================================================================== --- branches/scool-ng/src/scoolt/Statement.str (revision 129) +++ branches/scool-ng/src/scoolt/Statement.str (revision 130) @@ -5,7 +5,7 @@ rules RawCxx: - Cxx(cxx_code) -> CxxProgram(cxx_code) + CxxStatement(Cxx(cxx_code)) -> CxxProgram(cxx_code) strategies Index: branches/scool-ng/src/scl-syn/Statement.sdf =================================================================== --- branches/scool-ng/src/scl-syn/Statement.sdf (revision 129) +++ branches/scool-ng/src/scl-syn/Statement.sdf (revision 130) @@ -4,15 +4,15 @@ Lexical Declaration Expression exports - sorts Statement FunctionStatement + sorts Statement FunctionStatement CxxStatement context-free syntax Declaration -> Statement - Cxx -> CxxStatement CxxStatement -> Statement CxxStatement -> FunctionStatement + Cxx ";" -> CxxStatement {cons("CxxStatement")} Expression ";" -> FunctionStatement {cons("ExpressionStatement")} SimpleDeclaration -> FunctionStatement "->" Expression ";" -> FunctionStatement {cons("ReturnStatement")} Index: branches/scool-ng/src/scl-syn/Expression.sdf =================================================================== --- branches/scool-ng/src/scl-syn/Expression.sdf (revision 129) +++ branches/scool-ng/src/scl-syn/Expression.sdf (revision 130) @@ -7,6 +7,8 @@ sorts Expression StaticExpression StaticFunctionCall context-free syntax + Cxx -> Expression + Cxx -> StaticExpression Id -> Expression {cons("Identifier")} Integer -> Expression {cons("Integer")} Index: branches/scool-ng/src/scl-syn/Lexical.sdf =================================================================== --- branches/scool-ng/src/scl-syn/Lexical.sdf (revision 129) +++ branches/scool-ng/src/scl-syn/Lexical.sdf (revision 130) @@ -12,7 +12,7 @@ [A-Za-z][A-Za-z0-9\_]* -> Id [0-9]+ -> Integer {cons("Integer")} "\"" [A-Za-z0-9]* "\"" -> String {cons("String")} - ~[\ ]~[\]\|]*~[\ ] -> RawCxx + ~[\]\|]* -> RawCxx "//" ~[\n]* [\n] -> LAYOUT [\ \t\n] -> LAYOUT
16 years, 1 month
1
0
0
0
scool r129: Fix tests
by Maxime van Noppen
From: Maxime van Noppen <yabo(a)lrde.epita.fr> To: transformers-patches(a)lrde.epita.fr, olena-patches(a)lrde.epita.fr Subject: scool r129: Fix tests URL:
https://svn.lrde.epita.fr/svn/scool/branches/scool-ng
ChangeLog: 2008-11-14 Maxime van Noppen <yabo(a)lrde.epita.fr> Fix tests. * examples/c++_ast/point1d_simple.aterm: New. * examples/c++_ast/sample_1.aterm: New. * examples/c++_ast/sample_3.aterm: New. * examples/c++_ast/sample_4.aterm: New. * examples/c++_build/point1d_simple.g++: New. * examples/c++_build/sample_3.g++: New. * examples/c++_build/sample_4.g++: New. * examples/c++_src/point1d_simple.cc: New. * examples/c++_src/sample_1.cc: New. * examples/c++_src/sample_3.cc: New. * examples/c++_src/sample_4.cc: New. * examples/scool_ast/point1d_simple.aterm: New. * examples/scool_ast/sample_1.aterm: New. * examples/scool_ast/sample_3.aterm: New. * examples/scool_ast/sample_4.aterm: New. * examples/scool_ast/sample_animal_hierarchy.aterm: New. * examples/scool_src/point1d_simple.scl: . * examples/scool_src/sample_4.scl: . * examples/scool_src/sample_5.scl: Remove. * examples/scool_src/sample_animal_hierarchy.scl: . * function/scool_ast/call_003.aterm: . * function/scool_src/call_003.scl: . * type/c++_ast/typedef_001.aterm: New. * type/c++_build/typedef_001.g++: New. * type/c++_src/typedef_001.cc: New. * type/scool_ast/typedef_001.aterm: New. * variable/scool_ast/declaration_005.aterm: . * variable/scool_src/declaration_005.scl: . --- examples/c++_ast/point1d_simple.aterm | 1 + examples/c++_ast/sample_1.aterm | 1 + examples/c++_ast/sample_3.aterm | 1 + examples/c++_ast/sample_4.aterm | 1 + examples/c++_src/point1d_simple.cc | 16 ++++++++++++++++ examples/c++_src/sample_1.cc | 7 +++++++ examples/c++_src/sample_3.cc | 8 ++++++++ examples/c++_src/sample_4.cc | 5 +++++ examples/scool_ast/point1d_simple.aterm | 1 + examples/scool_ast/sample_1.aterm | 1 + examples/scool_ast/sample_3.aterm | 1 + examples/scool_ast/sample_4.aterm | 1 + examples/scool_ast/sample_animal_hierarchy.aterm | 1 + examples/scool_src/point1d_simple.scl | 6 +++--- examples/scool_src/sample_4.scl | 2 ++ examples/scool_src/sample_animal_hierarchy.scl | 2 +- function/scool_ast/call_003.aterm | 2 +- function/scool_src/call_003.scl | 2 +- type/c++_ast/typedef_001.aterm | 1 + type/c++_src/typedef_001.cc | 1 + type/scool_ast/typedef_001.aterm | 1 + variable/scool_ast/declaration_005.aterm | 2 +- variable/scool_src/declaration_005.scl | 2 +- 23 files changed, 58 insertions(+), 8 deletions(-) Index: branches/scool-ng/tests/type/c++_ast/typedef_001.aterm =================================================================== --- branches/scool-ng/tests/type/c++_ast/typedef_001.aterm (revision 0) +++ branches/scool-ng/tests/type/c++_ast/typedef_001.aterm (revision 129) @@ -0,0 +1 @@ +CxxProgram([CxxTypedef(CxxType("int"),CxxId("t"))]) Index: branches/scool-ng/tests/type/c++_src/typedef_001.cc =================================================================== --- branches/scool-ng/tests/type/c++_src/typedef_001.cc (revision 0) +++ branches/scool-ng/tests/type/c++_src/typedef_001.cc (revision 129) @@ -0,0 +1 @@ +typedef int t; Index: branches/scool-ng/tests/type/scool_ast/typedef_001.aterm =================================================================== --- branches/scool-ng/tests/type/scool_ast/typedef_001.aterm (revision 0) +++ branches/scool-ng/tests/type/scool_ast/typedef_001.aterm (revision 129) @@ -0,0 +1 @@ +Program([TypeDefinition(None,Identifier("t"),StaticInitialiser(SimpleType("int")))]) Index: branches/scool-ng/tests/type/c++_build/typedef_001.g++ =================================================================== Index: branches/scool-ng/tests/function/scool_ast/call_003.aterm =================================================================== --- branches/scool-ng/tests/function/scool_ast/call_003.aterm (revision 128) +++ branches/scool-ng/tests/function/scool_ast/call_003.aterm (revision 129) @@ -1 +1 @@ -Program([Cxx("#include <string>\n\nusing std::string;\n"),FunctionDefinition(None,Identifier("doit"),FunctionType(None,ArgumentsDeclaration([TypedId(Identifier("s"),SimpleType("string")),TypedId(Identifier("i"),SimpleType("int"))]),SimpleType("void")),FunctionBlock([ExpressionStatement(FunctionCall(Identifier("doit"),None,Arguments([String("\"bar\""),Integer("42")])))]))]) +Program([CxxStatement(Cxx("#include <string>\n\nusing std::string;\n")),FunctionDefinition(None,Identifier("doit"),FunctionType(None,ArgumentsDeclaration([TypedId(Identifier("s"),SimpleType("string")),TypedId(Identifier("i"),SimpleType("int"))]),SimpleType("void")),FunctionBlock([ExpressionStatement(FunctionCall(Identifier("doit"),None,Arguments([String("\"bar\""),Integer("42")])))]))]) Index: branches/scool-ng/tests/function/scool_src/call_003.scl =================================================================== --- branches/scool-ng/tests/function/scool_src/call_003.scl (revision 128) +++ branches/scool-ng/tests/function/scool_src/call_003.scl (revision 129) @@ -2,7 +2,7 @@ #include <string> using std::string; -]| +]|; doit : (s : string, i : int) -> void = { Index: branches/scool-ng/tests/variable/scool_ast/declaration_005.aterm =================================================================== --- branches/scool-ng/tests/variable/scool_ast/declaration_005.aterm (revision 128) +++ branches/scool-ng/tests/variable/scool_ast/declaration_005.aterm (revision 129) @@ -1 +1 @@ -Program([Cxx("#include <list>\n\nusing std::list;\n"),SimpleDeclaration(Some("var"),Identifier("l"),StaticFunctionCall(Identifier("list"),Parameters([SimpleType("int")])),None)]) +Program([CxxStatement(Cxx("#include <list>\n\nusing std::list;\n")),SimpleDeclaration(Some("var"),Identifier("l"),StaticFunctionCall(Identifier("list"),Parameters([SimpleType("int")])),None)]) Index: branches/scool-ng/tests/variable/scool_src/declaration_005.scl =================================================================== --- branches/scool-ng/tests/variable/scool_src/declaration_005.scl (revision 128) +++ branches/scool-ng/tests/variable/scool_src/declaration_005.scl (revision 129) @@ -2,6 +2,6 @@ #include <list> using std::list; -]| +]|; var l : list[int]; Index: branches/scool-ng/tests/examples/c++_ast/sample_1.aterm =================================================================== --- branches/scool-ng/tests/examples/c++_ast/sample_1.aterm (revision 0) +++ branches/scool-ng/tests/examples/c++_ast/sample_1.aterm (revision 129) @@ -0,0 +1 @@ +CxxProgram([CxxFun([],CxxType("void"),CxxId("f"),[],None,[CxxDecl(CxxConstType(CxxType("int")),CxxId("i"),CxxInt("3")),CxxExpStm(CxxAssign(CxxId("i"),CxxInt("4"))),CxxDecl(CxxType("int"),CxxId("j"),CxxInt("3")),CxxExpStm(CxxAssign(CxxId("j"),CxxInt("4")))])]) Index: branches/scool-ng/tests/examples/c++_ast/sample_3.aterm =================================================================== --- branches/scool-ng/tests/examples/c++_ast/sample_3.aterm (revision 0) +++ branches/scool-ng/tests/examples/c++_ast/sample_3.aterm (revision 129) @@ -0,0 +1 @@ +CxxProgram([CxxFun([],CxxType("void"),CxxId("f"),[],None,[CxxDecl(CxxType("int"),CxxId("i")),CxxDecl(CxxType("int"),CxxId("j")),CxxExpStm(CxxAssign(CxxId("i"),CxxInt("0"))),CxxExpStm(CxxAssign(CxxId("j"),CxxId("i"))),CxxExpStm(CxxAssign(CxxId("i"),CxxSum(CxxId("j"),CxxId("i"))))])]) Index: branches/scool-ng/tests/examples/c++_ast/sample_4.aterm =================================================================== --- branches/scool-ng/tests/examples/c++_ast/sample_4.aterm (revision 0) +++ branches/scool-ng/tests/examples/c++_ast/sample_4.aterm (revision 129) @@ -0,0 +1 @@ +CxxProgram([CxxProgram("#include <cmath>"),CxxFun([],CxxType("float"),CxxId("sqrt"),[(CxxType("float"),CxxId("arg"))],None,[CxxExpStm(CxxKeyword("return",CxxProgram("std::sqrt(arg) ")))])]) Index: branches/scool-ng/tests/examples/c++_ast/point1d_simple.aterm =================================================================== --- branches/scool-ng/tests/examples/c++_ast/point1d_simple.aterm (revision 0) +++ branches/scool-ng/tests/examples/c++_ast/point1d_simple.aterm (revision 129) @@ -0,0 +1 @@ +CxxProgram([CxxClassDecl([(CxxType("typename"),"Exact")],CxxId("point1d"),[],[CxxPublic([CxxTypedef(CxxType("int"),CxxId("point_type")),CxxFun([],CxxType("point_type"),CxxId("get_x"),[],Const,[CxxExpStm(CxxKeyword("return",CxxId("x_")))]),CxxFun([],CxxType("point_type"),CxxId("set_x"),[(CxxConstType(CxxRefType(CxxType("point_type"))),CxxId("x"))],None,[CxxExpStm(CxxKeyword("return",CxxAssign(CxxId("x_"),CxxId("x"))))])]),CxxPrivate([CxxDecl(CxxType("point_type"),CxxId("x_"))])])]) Index: branches/scool-ng/tests/examples/c++_src/sample_1.cc =================================================================== --- branches/scool-ng/tests/examples/c++_src/sample_1.cc (revision 0) +++ branches/scool-ng/tests/examples/c++_src/sample_1.cc (revision 129) @@ -0,0 +1,7 @@ +void f() +{ + const int i = 3; + i = 4; + int j = 3; + j = 4; +} Index: branches/scool-ng/tests/examples/c++_src/sample_3.cc =================================================================== --- branches/scool-ng/tests/examples/c++_src/sample_3.cc (revision 0) +++ branches/scool-ng/tests/examples/c++_src/sample_3.cc (revision 129) @@ -0,0 +1,8 @@ +void f() +{ + int i; + int j; + i = 0; + j = i; + i = j + i; +} Index: branches/scool-ng/tests/examples/c++_src/sample_4.cc =================================================================== --- branches/scool-ng/tests/examples/c++_src/sample_4.cc (revision 0) +++ branches/scool-ng/tests/examples/c++_src/sample_4.cc (revision 129) @@ -0,0 +1,5 @@ +#include <cmath> +float sqrt(float arg) +{ + return std::sqrt(arg) ; +} Index: branches/scool-ng/tests/examples/c++_src/point1d_simple.cc =================================================================== --- branches/scool-ng/tests/examples/c++_src/point1d_simple.cc (revision 0) +++ branches/scool-ng/tests/examples/c++_src/point1d_simple.cc (revision 129) @@ -0,0 +1,16 @@ +template < typename Exact > +class point1d +{ + public: + typedef int point_type; + point_type get_x() const + { + return x_; + } + point_type set_x(const point_type& x) + { + return x_ = x; + } + private: + point_type x_; +}; Index: branches/scool-ng/tests/examples/scool_ast/sample_animal_hierarchy.aterm =================================================================== --- branches/scool-ng/tests/examples/scool_ast/sample_animal_hierarchy.aterm (revision 0) +++ branches/scool-ng/tests/examples/scool_ast/sample_animal_hierarchy.aterm (revision 129) @@ -0,0 +1 @@ +Program([ClassDefinition(Identifier("Animal"),None,None,ClassBlock([AccessBlock(Public,[FunctionDeclaration(None,Identifier("scream"),FunctionType(None,ArgumentsDeclaration([]),SimpleType("void")))])])),ClassDefinition(Identifier("Cat"),None,Some(ClassWhereClause([Inherits("Cat",SimpleType("Animal"))])),ClassBlock([AccessBlock(Public,[FunctionDefinition(None,Identifier("scream"),FunctionType(None,ArgumentsDeclaration([]),SimpleType("void")),FunctionBlock([amb([ExpressionStatement(Cxx("std::cout << \"Miaou\" << std::endl; ")),CxxStatement(Cxx("std::cout << \"Miaou\" << std::endl; "))])]))])])),ClassDefinition(Identifier("Dog"),Some("final"),Some(ClassWhereClause([Inherits("Dog",SimpleType("Animal"))])),ClassBlock([AccessBlock(Public,[FunctionDefinition(None,Identifier("scream"),FunctionType(None,ArgumentsDeclaration([]),SimpleType("void")),FunctionBlock([amb([ExpressionStatement(Cxx("std::cout << \"Wouf\" << std::endl; ")),CxxStatement(Cxx("std::cout << \"Wouf\" << std::endl; "))])]))])])),FunctionDefinition(None,Identifier("scream"),FunctionType(None,ArgumentsDeclaration([TypedId(Identifier("animal"),SimpleType("Animal"))]),SimpleType("void")),FunctionBlock([amb([ExpressionStatement(Cxx("animal.scream(); ")),CxxStatement(Cxx("animal.scream(); "))])])),FunctionDefinition(None,Identifier("main"),FunctionType(None,ArgumentsDeclaration([]),SimpleType("int")),FunctionBlock([SimpleDeclaration(Some("var"),Identifier("cat"),SimpleType("Cat"),None),SimpleDeclaration(Some("var"),Identifier("dog"),SimpleType("Dog"),None),ExpressionStatement(FunctionCall(Identifier("scream"),None,Arguments([Identifier("cat")]))),ExpressionStatement(FunctionCall(Identifier("scream"),None,Arguments([Identifier("dog")]))),ReturnStatement(Integer("0"))]))]) Index: branches/scool-ng/tests/examples/scool_ast/sample_1.aterm =================================================================== --- branches/scool-ng/tests/examples/scool_ast/sample_1.aterm (revision 0) +++ branches/scool-ng/tests/examples/scool_ast/sample_1.aterm (revision 129) @@ -0,0 +1 @@ +Program([FunctionDefinition(None,Identifier("f"),FunctionType(None,ArgumentsDeclaration([]),SimpleType("void")),FunctionBlock([SimpleDeclaration(None,Identifier("i"),SimpleType("int"),Some(Initialiser(Integer("3")))),ExpressionStatement(Assign(Identifier("i"),Integer("4"))),SimpleDeclaration(Some("var"),Identifier("j"),SimpleType("int"),Some(Initialiser(Integer("3")))),ExpressionStatement(Assign(Identifier("j"),Integer("4")))]))]) Index: branches/scool-ng/tests/examples/scool_ast/sample_3.aterm =================================================================== --- branches/scool-ng/tests/examples/scool_ast/sample_3.aterm (revision 0) +++ branches/scool-ng/tests/examples/scool_ast/sample_3.aterm (revision 129) @@ -0,0 +1 @@ +Program([FunctionDefinition(None,Identifier("f"),FunctionType(None,ArgumentsDeclaration([]),SimpleType("void")),FunctionBlock([SimpleDeclaration(Some("var"),Identifier("i"),SimpleType("int"),None),SimpleDeclaration(Some("var"),Identifier("j"),SimpleType("int"),None),ExpressionStatement(Assign(Identifier("i"),Integer("0"))),ExpressionStatement(Assign(Identifier("j"),Identifier("i"))),ExpressionStatement(Assign(Identifier("i"),Sum(Identifier("j"),Identifier("i"))))]))]) Index: branches/scool-ng/tests/examples/scool_ast/sample_4.aterm =================================================================== --- branches/scool-ng/tests/examples/scool_ast/sample_4.aterm (revision 0) +++ branches/scool-ng/tests/examples/scool_ast/sample_4.aterm (revision 129) @@ -0,0 +1 @@ +Program([CxxStatement(Cxx("#include <cmath>")),FunctionDefinition(None,Identifier("sqrt"),FunctionType(None,ArgumentsDeclaration([TypedId(Identifier("arg"),SimpleType("float"))]),SimpleType("float")),FunctionBlock([ReturnStatement(Cxx("std::sqrt(arg) "))]))]) Index: branches/scool-ng/tests/examples/scool_ast/point1d_simple.aterm =================================================================== --- branches/scool-ng/tests/examples/scool_ast/point1d_simple.aterm (revision 0) +++ branches/scool-ng/tests/examples/scool_ast/point1d_simple.aterm (revision 129) @@ -0,0 +1 @@ +Program([ClassDefinition(Identifier("point1d"),None,None,ClassBlock([AccessBlock(Public,[TypeDefinition(None,Identifier("point_type"),StaticInitialiser(SimpleType("int"))),FunctionDefinition(None,Identifier("get_x"),FunctionType(None,ArgumentsDeclaration([]),SimpleType("point_type")),FunctionBlock(Identifier("x_"))),FunctionDefinition(Some("mutable"),Identifier("set_x"),FunctionType(None,ArgumentsDeclaration([TypedId(Identifier("x"),SimpleType("point_type"))]),SimpleType("point_type")),FunctionBlock(Assign(Identifier("x_"),Identifier("x"))))]),AccessBlock(Private,[SimpleDeclaration(Some("var"),Identifier("x_"),SimpleType("point_type"),None)])]))]) Index: branches/scool-ng/tests/examples/scool_src/sample_5.scl (deleted) =================================================================== Index: branches/scool-ng/tests/examples/scool_src/sample_animal_hierarchy.scl =================================================================== --- branches/scool-ng/tests/examples/scool_src/sample_animal_hierarchy.scl (revision 128) +++ branches/scool-ng/tests/examples/scool_src/sample_animal_hierarchy.scl (revision 129) @@ -14,7 +14,7 @@ } } -final Dog : class where Dog -> Animal = +Dog : final class where Dog -> Animal = { public { Index: branches/scool-ng/tests/examples/scool_src/sample_4.scl =================================================================== --- branches/scool-ng/tests/examples/scool_src/sample_4.scl (revision 128) +++ branches/scool-ng/tests/examples/scool_src/sample_4.scl (revision 129) @@ -1,3 +1,5 @@ +|[#include <cmath>]|; + sqrt : (arg : float) -> float = { -> |[ std::sqrt(arg) ]|; Index: branches/scool-ng/tests/examples/scool_src/point1d_simple.scl =================================================================== --- branches/scool-ng/tests/examples/scool_src/point1d_simple.scl (revision 128) +++ branches/scool-ng/tests/examples/scool_src/point1d_simple.scl (revision 129) @@ -4,12 +4,12 @@ { point_type : type = int; - get_x : () -> point_type => x_; - mutable set_x : (x : point_type) -> point_type => x_ = x; + get_x : () -> point_type = x_; + mutable set_x : (x : point_type) -> point_type = x_ = x; } private { - var x : point_type; + var x_ : point_type; } } Index: branches/scool-ng/tests/examples/c++_build/sample_4.g++ =================================================================== Index: branches/scool-ng/tests/examples/c++_build/point1d_simple.g++ =================================================================== Index: branches/scool-ng/tests/examples/c++_build/sample_3.g++ ===================================================================
16 years, 1 month
1
0
0
0
cleanup-2008 2879: Add accu transform stop and make erosion rely on it.
by Thierry Geraud
https://svn.lrde.epita.fr/svn/oln/branches/cleanup-2008/milena
Index: ChangeLog from Thierry Geraud <thierry.geraud(a)lrde.epita.fr> Add accu transform stop and make erosion rely on it. * mln/accu/land_basic.hh: New. * mln/accu/transform_stop.hh: New. * mln/accu/all.hh: Update. * mln/morpho/erosion.hh (erosion_on_set): Rely on accu::transform_stop. * mln/morpho/includes.hh: Update. accu/all.hh | 8 ++++- accu/land_basic.hh | 74 +++++++++++++++++++++++-------------------------- accu/transform_stop.hh | 66 +++++++++++++++++++++++-------------------- morpho/erosion.hh | 19 +----------- morpho/includes.hh | 14 +++++---- 5 files changed, 88 insertions(+), 93 deletions(-) Index: mln/accu/all.hh --- mln/accu/all.hh (revision 2878) +++ mln/accu/all.hh (working copy) @@ -58,7 +58,6 @@ # include <mln/accu/bbox.hh> # include <mln/accu/count.hh> -# include <mln/accu/convolve.hh> //# include <mln/accu/count_adjacent_vertices.hh> # include <mln/accu/height.hh> # include <mln/accu/histo.hh> @@ -78,5 +77,12 @@ # include <mln/accu/tuple.hh> # include <mln/accu/volume.hh> +// Routines. + +# include <mln/accu/convolve.hh> +# include <mln/accu/snake_2d.hh> +# include <mln/accu/transform.hh> +# include <mln/accu/transform_stop.hh> + #endif // ! MLN_ACCU_ALL_HH Index: mln/accu/land_basic.hh --- mln/accu/land_basic.hh (revision 2878) +++ mln/accu/land_basic.hh (working copy) @@ -1,4 +1,5 @@ -// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory (LRDE) +// Copyright (C) 2007, 2008 EPITA Research and Development Laboratory +// (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -25,13 +26,12 @@ // reasons why the executable file might be covered by the GNU General // Public License. -#ifndef MLN_ACCU_LAND_HH -# define MLN_ACCU_LAND_HH +#ifndef MLN_ACCU_LAND_BASIC_HH +# define MLN_ACCU_LAND_BASIC_HH -/// \file mln/accu/land.hh -/// -/// Define a 'logical-and' accumulator. +/// \file mln/accu/land_basic.hh /// +/// Define a basic 'logical-and' accumulator. # include <mln/accu/internal/base.hh> @@ -42,12 +42,14 @@ namespace accu { - /// "Logical-and" accumulator class. - struct land : public mln::accu::internal::base< bool, land > + /// "Logical-and" accumulator class. Conversely to accu::lands, + /// this version does not have the 'untake' method but features + /// the 'can_stop' method. + struct land_basic : public mln::accu::internal::base< bool, land_basic > { typedef bool argument; - land(); + land_basic(); /// Manipulators. /// \{ @@ -55,10 +57,7 @@ void take_as_init(const argument& t); void take(const argument& t); - void take(const land& other); - - void untake(const argument& t); - void untake(const land& other); + void take(const land_basic& other); /// \} /// Get the value of the accumulator. @@ -68,73 +67,70 @@ /// Always true here. bool is_valid() const; + /// Test if it is worth for this accumulator to take extra data. + /// If the result is already 'false' (because this accumulator + /// has already taken a 'false' value), can_stop returns true. + bool can_stop() const; + protected: - unsigned nfalse_; + bool res_; }; # ifndef MLN_INCLUDE_ONLY inline - land::land() + land_basic::land_basic() { init(); } inline void - land::init() + land_basic::init() { - nfalse_ = 0; + res_ = true; } inline - void land::take_as_init(const argument& t) + void land_basic::take_as_init(const argument& t) { - nfalse_ = t ? 0 : 1; + res_ = t; } inline - void land::take(const argument& t) + void land_basic::take(const argument& t) { - if (t == false) - ++nfalse_; + if (res_ == true && t == false) + res_ = false; } inline void - land::take(const land& other) + land_basic::take(const land_basic& other) { - nfalse_ += other.nfalse_; + res_ = res_ && other.res_; } inline - void land::untake(const argument& t) - { - if (t == false) - --nfalse_; - } - - inline - void - land::untake(const land& other) + bool + land_basic::to_result() const { - mln_precondition(other.nfalse_ <= nfalse_); - nfalse_ -= other.nfalse_; + return res_; } inline bool - land::to_result() const + land_basic::is_valid() const { - return nfalse_ == 0; + return true; } inline bool - land::is_valid() const + land_basic::can_stop() const { - return true; + return res_ == false; } # endif // ! MLN_INCLUDE_ONLY Property changes on: mln/accu/land_basic.hh ___________________________________________________________________ Added: svn:mergeinfo Index: mln/accu/transform_stop.hh --- mln/accu/transform_stop.hh (revision 2878) +++ mln/accu/transform_stop.hh (working copy) @@ -25,12 +25,12 @@ // reasons why the executable file might be covered by the GNU General // Public License. -#ifndef MLN_ACCU_TRANSFORM_HH -# define MLN_ACCU_TRANSFORM_HH +#ifndef MLN_ACCU_TRANSFORM_STOP_HH +# define MLN_ACCU_TRANSFORM_STOP_HH -/// \file mln/accu/transform.hh +/// \file mln/accu/transform_stop.hh /// -/// Transform an image by applying locally an accumulator on its +/// Transform_Stop an image by applying locally an accumulator on its /// values. # include <mln/core/concept/meta_accumulator.hh> @@ -47,15 +47,11 @@ template <typename I, typename A, typename W> mln_ch_value(I, mln_result(A)) - transform(const Image<I>& input, - const Accumulator<A>& a, - const Window<W>& win); + transform_stop(const Image<I>& input, const Accumulator<A>& a, const Window<W>& win); template <typename I, typename A, typename W> mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) - transform(const Image<I>& input, - const Meta_Accumulator<A>& a, - const Window<W>& win); + transform_stop(const Image<I>& input, const Meta_Accumulator<A>& a, const Window<W>& win); @@ -72,11 +68,11 @@ template <typename I, typename A, typename W> mln_ch_value(I, mln_result(A)) - transform(const Image<I>& input_, + transform_stop(const Image<I>& input_, const Accumulator<A>& a_, const Window<W>& win_) { - trace::entering("accu::impl::generic::transform"); + trace::entering("accu::impl::generic::transform_stop"); const I& input = exact(input_); const W& win = exact(win_); @@ -96,11 +92,15 @@ { a.init(); for_all(q) + { a.take(input(q)); + if (a.can_stop()) + break; + } output(p) = a.to_result(); } - trace::exiting("accu::impl::generic::transform"); + trace::exiting("accu::impl::generic::transform_stop"); return output; } @@ -111,9 +111,9 @@ template <typename I, typename A, typename W> mln_ch_value(I, mln_result(A)) - transform_fastest(const Image<I>& input_, const Accumulator<A>& a_, const Window<W>& win_) + transform_stop_fastest(const Image<I>& input_, const Accumulator<A>& a_, const Window<W>& win_) { - trace::entering("accu::impl::transform_fastest"); + trace::entering("accu::impl::transform_stop_fastest"); const I& input = exact(input_); const W& win = exact(win_); @@ -135,11 +135,15 @@ { a.init(); for_all(q) + { a.take(q.val()); + if (a.can_stop()) + break; + } o.val() = a.to_result(); } - trace::exiting("accu::impl::transform_fastest"); + trace::exiting("accu::impl::transform_stop_fastest"); return output; } @@ -154,25 +158,25 @@ template <typename I, typename A, typename W> mln_ch_value(I, mln_result(A)) - transform_dispatch(trait::image::speed::any, + transform_stop_dispatch(trait::image::speed::any, const Image<I>& input, const Accumulator<A>& a, const Window<W>& win) { - return impl::generic::transform(input, a, win); + return impl::generic::transform_stop(input, a, win); } template <typename I, typename A, typename W> mln_ch_value(I, mln_result(A)) - transform_dispatch(trait::image::speed::fastest, + transform_stop_dispatch(trait::image::speed::fastest, const Image<I>& input, const Accumulator<A>& a, const Window<W>& win) { - return impl::transform_fastest(input, a, win); + return impl::transform_stop_fastest(input, a, win); } template <typename I, typename A, typename W> mln_ch_value(I, mln_result(A)) - transform_dispatch(const Image<I>& input, const Accumulator<A>& a, const Window<W>& win) + transform_stop_dispatch(const Image<I>& input, const Accumulator<A>& a, const Window<W>& win) { - return transform_dispatch(mln_trait_image_speed(I)(), + return transform_stop_dispatch(mln_trait_image_speed(I)(), input, a, win); } @@ -184,25 +188,25 @@ template <typename I, typename A, typename W> inline mln_ch_value(I, mln_result(A)) - transform(const Image<I>& input, const Accumulator<A>& a, const Window<W>& win) + transform_stop(const Image<I>& input, const Accumulator<A>& a, const Window<W>& win) { - trace::entering("accu::transform"); + trace::entering("accu::transform_stop"); mln_precondition(exact(input).has_data()); // mln_precondition(exact(win).is_valid()); mln_ch_value(I, mln_result(A)) output; - output = internal::transform_dispatch(input, a, win); + output = internal::transform_stop_dispatch(input, a, win); - trace::exiting("accu::transform"); + trace::exiting("accu::transform_stop"); return output; } template <typename I, typename A, typename W> mln_ch_value(I, mln_accu_with(A, mln_value(I))::result) - transform(const Image<I>& input, const Meta_Accumulator<A>& a, const Window<W>& win) + transform_stop(const Image<I>& input, const Meta_Accumulator<A>& a, const Window<W>& win) { - trace::entering("accu::transform"); + trace::entering("accu::transform_stop"); mln_precondition(exact(input).has_data()); // mln_precondition(exact(win).is_valid()); @@ -211,9 +215,9 @@ A_ a_ = accu::unmeta(exact(a), mln_value(I)()); mln_ch_value(I, mln_result(A_)) output; - output = internal::transform_dispatch(input, a_, win); + output = internal::transform_stop_dispatch(input, a_, win); - trace::exiting("accu::transform"); + trace::exiting("accu::transform_stop"); return output; } @@ -224,4 +228,4 @@ } // end of namespace mln -#endif // ! MLN_ACCU_TRANSFORM_HH +#endif // ! MLN_ACCU_TRANSFORM_STOP_HH Property changes on: mln/accu/transform_stop.hh ___________________________________________________________________ Added: svn:mergeinfo Index: mln/morpho/erosion.hh --- mln/morpho/erosion.hh (revision 2878) +++ mln/morpho/erosion.hh (working copy) @@ -34,7 +34,6 @@ /// \brief Morphological erosion. # include <mln/morpho/includes.hh> -# include <mln/accu/transform.hh> // Specializations are in: # include <mln/morpho/erosion.spe.hh> @@ -109,27 +108,15 @@ template <typename I, typename W> inline mln_concrete(I) - erosion_on_set(const Image<I>& input_, const Window<W>& win_) + erosion_on_set(const Image<I>& input, const Window<W>& win) { trace::entering("morpho::impl::generic::erosion_on_set"); - const I& input = exact(input_); - const W& win = exact(win_); + internal::erosion_tests(input, win); extension::adjust_fill(input, win, true); - mln_concrete(I) output; - initialize(output, input); - - mln_piter(I) p(input.domain()); - mln_qiter(W) q(win, p); - for_all(p) - { - for_all(q) if (input.has(q)) - if (input(q) == false) - break; - output(p) = ! q.is_valid(); - } + output = accu::transform_stop(input, accu::land_basic(), win); trace::exiting("morpho::impl::generic::erosion_on_set"); return output; Index: mln/morpho/includes.hh --- mln/morpho/includes.hh (revision 2878) +++ mln/morpho/includes.hh (working copy) @@ -1,4 +1,5 @@ // Copyright (C) 2007, 2008 EPITA Research and Development Laboratory +// (LRDE) // // This file is part of the Olena Library. This library is free // software; you can redistribute it and/or modify it under the terms @@ -28,12 +29,9 @@ #ifndef MLN_MORPHO_INCLUDES_HH # define MLN_MORPHO_INCLUDES_HH -/*! \file mln/morpho/includes.hh - * - * \brief Basic list of includes for all files in mln/morpho/. - * - * \todo Re-activate the border/all include when ready. - */ +/// \file mln/morpho/includes.hh +/// +/// Basic list of includes for all files in mln/morpho/. # include <mln/core/concept/image.hh> @@ -45,6 +43,7 @@ # include <mln/value/ops.hh> # include <mln/accu/land.hh> +# include <mln/accu/land_basic.hh> // # include <mln/accu/lor.hh> # include <mln/accu/min.hh> # include <mln/accu/max.hh> @@ -52,6 +51,9 @@ # include <mln/accu/max_h.hh> # include <mln/accu/rank.hh> +# include <mln/accu/transform.hh> +# include <mln/accu/transform_stop.hh> + # include <mln/fun/v2v/saturate.hh> # include <mln/level/compare.hh>
16 years, 1 month
1
0
0
0
← Newer
1
...
11
12
13
14
15
16
17
...
27
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Results per page:
10
25
50
100
200