00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
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/site_set/p_vertices.hh>
00037 # include <mln/pw/internal/image_base.hh>
00038 # include <mln/fun/i2v/array.hh>
00039
00040 # include <mln/util/internal/id2element.hh>
00041
00042
00043 namespace mln
00044 {
00045
00046
00047 template <typename P, typename V, typename G> class vertex_image;
00048 namespace util { class graph; }
00049
00050
00051
00052
00053 namespace trait
00054 {
00055
00056 template <typename P, typename V, typename G>
00057 struct image_< vertex_image<P,V,G> >
00058 : pw_image_<fun::i2v::array<V>,
00059 p_vertices<util::graph, fun::i2v::array<P> >,
00060 vertex_image<P,V,G> >
00061 {
00062 };
00063
00064 }
00065
00066
00067
00068 namespace internal
00069 {
00070
00072 template <typename P, typename V, typename G>
00073 struct data< mln::vertex_image<P,V,G> >
00074 {
00075 typedef typename vertex_image<P,V,G>::site_function_t site_function_t;
00076
00077 template <typename F>
00078 data(const fun::i2v::array<V>& vertex_values,
00079 const p_vertices<G,F>& pv);
00080
00081 fun::i2v::array<V> f_;
00082 p_vertices<G,site_function_t> domain_;
00083 };
00084
00085 }
00086
00087
00088
00091 template <typename V, typename G, typename P>
00092 vertex_image<P,V,G>
00093 operator | (const fun::i2v::array<V>& vertex_values,
00094 const p_vertices<G,fun::i2v::array<P> >& pv);
00095
00096
00097
00098
00099 namespace internal
00100 {
00101
00102 template <typename P, typename G>
00103 struct vfsite_selector
00104 {
00105 typedef fun::i2v::array<P> site_function_t;
00106 };
00107
00108
00109
00110 template <typename G>
00111 struct vfsite_selector<void,G>
00112 {
00113 typedef util::internal::id2element< G,util::vertex<G> > site_function_t;
00114 };
00115
00116
00117 }
00118
00119
00123
00124 template <typename P, typename V, typename G = util::graph>
00125 class vertex_image
00126 : public pw::internal::image_base<fun::i2v::array<V>,
00127 p_vertices<G, typename internal::vfsite_selector<P,G>::site_function_t >,
00128 vertex_image<P,V,G> >
00129 {
00130 typedef pw::internal::image_base<fun::i2v::array<V>,
00131 p_vertices<G, typename internal::vfsite_selector<P,G>::site_function_t >,
00132 vertex_image<P,V,G> > super_;
00133
00134 public:
00135 typedef typename super_::psite psite;
00136 typedef typename super_::rvalue rvalue;
00137 typedef typename super_::lvalue lvalue;
00138
00140 typedef G graph_t;
00141
00143 typedef typename internal::vfsite_selector<P,G>::site_function_t
00144 site_function_t;
00145 typedef mln_result(site_function_t) function_result_t;
00146
00147
00149 typedef vertex_image< tag::psite_<P>,
00150 tag::value_<V>,
00151 tag::graph_<G> > skeleton;
00152
00154 typedef graph_elt_window<G,p_vertices<G,site_function_t> > win_t;
00156 typedef graph_elt_neighborhood<G,p_vertices<G,site_function_t> > nbh_t;
00157
00160 vertex_image();
00161 vertex_image(const p_vertices<G, site_function_t>& pv);
00162 vertex_image(const p_vertices<G, site_function_t>& pv,
00163 const Function_v2v< fun::i2v::array<V> >& vertex_values);
00164 template <typename FV>
00165 vertex_image(const p_vertices<G, site_function_t>& pv,
00166 const Function_v2v<FV>& vertex_values);
00168
00171 rvalue operator()(unsigned v_id) const;
00172 lvalue operator()(unsigned v_id);
00174
00175
00176
00177 rvalue operator()(const psite& p) const;
00178 lvalue operator()(const psite& p);
00179
00180
00181 };
00182
00183 template <typename P, typename V, typename G, typename J>
00184 void init_(tag::image_t, vertex_image<P,V,G>& target, const Image<J>& model);
00185
00186
00187 # ifndef MLN_INCLUDE_ONLY
00188
00189 template <typename P, typename V, typename G, typename J>
00190 void init_(tag::image_t, vertex_image<P,V,G>& target, const Image<J>& model)
00191 {
00192 fun::i2v::array<V> f;
00193 init_(tag::function, f, exact(model));
00194 p_vertices<G,typename vertex_image<P,V,G>::site_function_t> s;
00195 init_(tag::domain, s, exact(model));
00196 target.init_(f, s);
00197 }
00198
00199
00200
00201 template <typename V, typename G, typename P>
00202 inline
00203 vertex_image<P,V,G>
00204 operator | (const fun::i2v::array<V>& vertex_values,
00205 const p_vertices<G, fun::i2v::array<P> >& pv)
00206 {
00207 vertex_image<P,V,G> tmp(vertex_values, pv);
00208 return tmp;
00209 }
00210
00211
00212
00213
00214
00215 namespace internal
00216 {
00217
00218 template <typename P, typename V, typename G>
00219 template <typename F>
00220 inline
00221 data< mln::vertex_image<P,V,G> >::data(const fun::i2v::array<V>& f,
00222 const p_vertices<G,F>& ps)
00223 : f_(f),
00224 domain_(ps)
00225 {
00226 }
00227
00228 }
00229
00230
00231
00232
00233
00234 template <typename P, typename V, typename G>
00235 inline
00236 vertex_image<P,V,G>::vertex_image()
00237 {
00238 }
00239
00240 template <typename P, typename V, typename G>
00241 inline
00242 vertex_image<P,V,G>::vertex_image(const p_vertices<G,site_function_t>& pv)
00243 : super_(fun::i2v::array<V>(pv.nsites()), pv)
00244 {
00245 }
00246
00247 template <typename P, typename V, typename G>
00248 inline
00249 vertex_image<P,V,G>::vertex_image(const p_vertices<G,site_function_t>& pv,
00250 const Function_v2v< fun::i2v::array<V> >& vertex_values)
00251 : super_(exact(vertex_values), pv)
00252 {
00253 }
00254
00255 template <typename P, typename V, typename G>
00256 template <typename FV>
00257 inline
00258 vertex_image<P,V,G>::vertex_image(const p_vertices<G,site_function_t>& pv,
00259 const Function_v2v<FV>& vertex_values)
00260 : super_(convert::to<fun::i2v::array<V> >(exact(vertex_values)), pv)
00261 {
00262 mlc_equal(mln_result(FV),V)::check();
00263 }
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279 template <typename P, typename V, typename G>
00280 typename vertex_image<P,V,G>::rvalue
00281 vertex_image<P,V,G>::operator()(unsigned v_id) const
00282 {
00283 return this->data_->f_(v_id);
00284 }
00285
00286 template <typename P, typename V, typename G>
00287 typename vertex_image<P,V,G>::lvalue
00288 vertex_image<P,V,G>::operator()(unsigned v_id)
00289 {
00290 return this->data_->f_(v_id);
00291 }
00292
00293 template <typename P, typename V, typename G>
00294 typename vertex_image<P,V,G>::rvalue
00295 vertex_image<P,V,G>::operator()(const typename vertex_image<P,V,G>::psite& p) const
00296 {
00297 return this->super_::operator()(p);
00298 }
00299
00300 template <typename P, typename V, typename G>
00301 typename vertex_image<P,V,G>::lvalue
00302 vertex_image<P,V,G>::operator()(const typename vertex_image<P,V,G>::psite& p)
00303 {
00304 return this->super_::operator()(p);
00305 }
00306
00307 # endif // ! MLN_INCLUDE_ONLY
00308
00309 }
00310
00311
00312 #endif // ! MLN_CORE_IMAGE_VERTEX_IMAGE_HH