• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List

vertex_image.hh

00001 // Copyright (C) 2009 EPITA Research and Development Laboratory (LRDE)
00002 //
00003 // This file is part of Olena.
00004 //
00005 // Olena is free software: you can redistribute it and/or modify it under
00006 // the terms of the GNU General Public License as published by the Free
00007 // Software Foundation, version 2 of the License.
00008 //
00009 // Olena is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with Olena.  If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 // As a special exception, you may use this file as part of a free
00018 // software project without restriction.  Specifically, if other files
00019 // instantiate templates or use macros or inline functions from this
00020 // file, or you compile this file and link it with other files to produce
00021 // an executable, this file does not by itself cause the resulting
00022 // executable to be covered by the GNU General Public License.  This
00023 // exception does not however invalidate any other reasons why the
00024 // executable file might be covered by the GNU General Public License.
00025 
00026 #ifndef MLN_CORE_IMAGE_VERTEX_IMAGE_HH
00027 # define MLN_CORE_IMAGE_VERTEX_IMAGE_HH
00028 
00032 
00033 # include <mln/core/concept/graph.hh>
00034 # include <mln/core/image/graph_elt_window.hh>
00035 # include <mln/core/image/graph_elt_neighborhood.hh>
00036 # include <mln/core/image/graph_elt_mixed_neighborhood.hh>
00037 # include <mln/core/site_set/p_vertices.hh>
00038 # include <mln/pw/internal/image_base.hh>
00039 # include <mln/fun/i2v/array.hh>
00040 
00041 # include <mln/util/internal/id2element.hh>
00042 
00043 
00044 namespace mln
00045 {
00046 
00047   // Forward declaration.
00048   template <typename P, typename V, typename G> class vertex_image;
00049   namespace util { class graph; }
00050 
00051 
00052   // Properties
00053 
00054   namespace trait
00055   {
00056 
00057     template <typename P, typename V, typename G>
00058     struct image_< vertex_image<P,V,G> >
00059       : pw_image_<fun::i2v::array<V>,
00060                   p_vertices<util::graph, fun::i2v::array<P> >,
00061                   vertex_image<P,V,G> >
00062     {
00063     };
00064 
00065   } // end of namespace mln::traits.
00066 
00067 
00068 
00069   namespace internal
00070   {
00071 
00073     template <typename P, typename V, typename G>
00074     struct data< mln::vertex_image<P,V,G> >
00075     {
00076       typedef typename vertex_image<P,V,G>::site_function_t site_function_t;
00077 
00078       template <typename F>
00079       data(const fun::i2v::array<V>& vertex_values,
00080            const p_vertices<G,F>& pv);
00081 
00082       fun::i2v::array<V> f_;
00083       p_vertices<G,site_function_t> domain_;
00084     };
00085 
00086   } // end of namespace mln::internal
00087 
00088 
00089 
00092   template <typename V, typename G, typename P>
00093   vertex_image<P,V,G>
00094   operator | (const fun::i2v::array<V>& vertex_values,
00095               const p_vertices<G,fun::i2v::array<P> >& pv);
00096 
00097 
00098   // Vertex_image_fsite_selector
00099 
00100   namespace internal
00101   {
00102 
00103     template <typename P, typename G>
00104     struct vfsite_selector
00105     {
00106       typedef fun::i2v::array<P> site_function_t;
00107     };
00108 
00109 
00110 
00111     template <typename G>
00112     struct vfsite_selector<void,G>
00113     {
00114       typedef util::internal::id2element< G,util::vertex<G> > site_function_t;
00115     };
00116 
00117 
00118   } // end of namespace mln::internal
00119 
00120 
00124   //
00125   template <typename P, typename V, typename G = util::graph>
00126   class vertex_image
00127     : public pw::internal::image_base<fun::i2v::array<V>,
00128                                       p_vertices<G, typename internal::vfsite_selector<P,G>::site_function_t >,
00129                                       vertex_image<P,V,G> >
00130   {
00131     typedef pw::internal::image_base<fun::i2v::array<V>,
00132                                      p_vertices<G, typename internal::vfsite_selector<P,G>::site_function_t >,
00133                                      vertex_image<P,V,G> > super_;
00134 
00135   public:
00136     typedef typename super_::psite  psite;
00137     typedef typename super_::rvalue rvalue;
00138     typedef typename super_::lvalue lvalue;
00139 
00141     typedef G graph_t;
00142 
00144     typedef typename internal::vfsite_selector<P,G>::site_function_t
00145     site_function_t;
00146     typedef mln_result(site_function_t) function_result_t;
00147 
00148 
00150     typedef vertex_image< tag::psite_<P>,
00151                           tag::value_<V>,
00152                           tag::graph_<G> > skeleton;
00153 
00154     typedef p_vertices<G,site_function_t> S;
00155 
00157     typedef graph_elt_window<G,S> vertex_win_t;
00158 
00160     typedef graph_elt_neighborhood<G,S> vertex_nbh_t;
00161 
00163     typedef vertex_win_t win_t;
00165     typedef vertex_nbh_t nbh_t;
00166 
00167 
00168 
00171     vertex_image();
00172     vertex_image(const p_vertices<G, site_function_t>& pv);
00173     vertex_image(const p_vertices<G, site_function_t>& pv,
00174                  const Function_v2v< fun::i2v::array<V> >& vertex_values);
00175     template <typename FV>
00176     vertex_image(const p_vertices<G, site_function_t>& pv,
00177                  const Function_v2v<FV>& vertex_values);
00179 
00182     rvalue operator()(unsigned v_id) const;
00183     lvalue operator()(unsigned v_id);
00185 
00186 
00187     // Just to help g++-2.95...
00188     rvalue operator()(const psite& p) const;
00189     lvalue operator()(const psite& p);
00190     // ...because "using super_::operator()" does not properly work.
00191 
00192   };
00193 
00194   template <typename P, typename V, typename G, typename J>
00195   void init_(tag::image_t, vertex_image<P,V,G>& target, const Image<J>& model);
00196 
00197 
00198 # ifndef MLN_INCLUDE_ONLY
00199 
00200   template <typename P, typename V, typename G, typename J>
00201   void init_(tag::image_t, vertex_image<P,V,G>& target, const Image<J>& model)
00202   {
00203     fun::i2v::array<V> f;
00204     init_(tag::function, f, exact(model));
00205     p_vertices<G,typename vertex_image<P,V,G>::site_function_t> s;
00206     init_(tag::domain, s, exact(model));
00207     target.init_(f, s);
00208   }
00209 
00210   // Operator.
00211 
00212   template <typename V, typename G, typename P>
00213   inline
00214   vertex_image<P,V,G>
00215   operator | (const fun::i2v::array<V>& vertex_values,
00216               const p_vertices<G, fun::i2v::array<P> >& pv)
00217   {
00218     vertex_image<P,V,G> tmp(pv, vertex_values);
00219     return tmp;
00220   }
00221 
00222 
00223 
00224   // data< pw::image >
00225 
00226   namespace internal
00227   {
00228 
00229     template <typename P, typename V, typename G>
00230     template <typename F>
00231     inline
00232     data< mln::vertex_image<P,V,G> >::data(const fun::i2v::array<V>& f,
00233                                            const p_vertices<G,F>& ps)
00234       : f_(f),
00235         domain_(ps)
00236     {
00237     }
00238 
00239   } // end of namespace mln::internal
00240 
00241 
00242 
00243   // vertex_image<P,V,G>
00244 
00245   template <typename P, typename V, typename G>
00246   inline
00247   vertex_image<P,V,G>::vertex_image()
00248   {
00249   }
00250 
00251   template <typename P, typename V, typename G>
00252   inline
00253   vertex_image<P,V,G>::vertex_image(const p_vertices<G,site_function_t>& pv)
00254     : super_(fun::i2v::array<V>(pv.nsites()), pv)
00255   {
00256   }
00257 
00258   template <typename P, typename V, typename G>
00259   inline
00260   vertex_image<P,V,G>::vertex_image(const p_vertices<G,site_function_t>& pv,
00261                                     const Function_v2v< fun::i2v::array<V> >& vertex_values)
00262     : super_(exact(vertex_values), pv)
00263   {
00264   }
00265 
00266   template <typename P, typename V, typename G>
00267   template <typename FV>
00268   inline
00269   vertex_image<P,V,G>::vertex_image(const p_vertices<G,site_function_t>& pv,
00270                                     const Function_v2v<FV>& vertex_values)
00271     : super_(convert::to<fun::i2v::array<V> >(exact(vertex_values)), pv)
00272   {
00273     mlc_equal(mln_result(FV),V)::check();
00274   }
00275 
00276 //  template <typename P, typename V, typename G>
00277 //  typename vertex_image<P,V,G>::rvalue
00278 //  vertex_image<P,V,G>::operator()(const util::vertex<G>& v) const
00279 //  {
00280 //    return this->data_->f_(v.id());
00281 //  }
00282 
00283 //  template <typename P, typename V, typename G>
00284 //  typename vertex_image<P,V,G>::lvalue
00285 //  vertex_image<P,V,G>::operator()(const util::vertex<G>& v)
00286 //  {
00287 //    return this->data_->f_(v.id());
00288 //  }
00289 
00290   template <typename P, typename V, typename G>
00291   typename vertex_image<P,V,G>::rvalue
00292   vertex_image<P,V,G>::operator()(unsigned v_id) const
00293   {
00294     return this->data_->f_(v_id);
00295   }
00296 
00297   template <typename P, typename V, typename G>
00298   typename vertex_image<P,V,G>::lvalue
00299   vertex_image<P,V,G>::operator()(unsigned v_id)
00300   {
00301     return this->data_->f_(v_id);
00302   }
00303 
00304   template <typename P, typename V, typename G>
00305   typename vertex_image<P,V,G>::rvalue
00306   vertex_image<P,V,G>::operator()(const typename vertex_image<P,V,G>::psite& p) const
00307   {
00308     return this->super_::operator()(p);
00309   }
00310 
00311   template <typename P, typename V, typename G>
00312   typename vertex_image<P,V,G>::lvalue
00313   vertex_image<P,V,G>::operator()(const typename vertex_image<P,V,G>::psite& p)
00314   {
00315     return this->super_::operator()(p);
00316   }
00317 
00318 # endif // ! MLN_INCLUDE_ONLY
00319 
00320 } // end of namespace mln
00321 
00322 
00323 #endif // ! MLN_CORE_IMAGE_VERTEX_IMAGE_HH

Generated on Tue Oct 4 2011 15:25:07 for Milena (Olena) by  doxygen 1.7.1