Milena (Olena)
User documentation 2.0a Id
|
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_EDGE_IMAGE_HH 00027 # define MLN_CORE_IMAGE_EDGE_IMAGE_HH 00028 00032 00033 # include <mln/core/concept/graph.hh> 00034 # include <mln/core/site_set/p_edges.hh> 00035 # include <mln/core/image/graph_elt_window.hh> 00036 # include <mln/core/image/graph_elt_neighborhood.hh> 00037 # include <mln/pw/internal/image_base.hh> 00038 # include <mln/fun/i2v/array.hh> 00039 00040 00041 00042 namespace mln 00043 { 00044 // Forward declaration. 00045 template <typename P, typename V, typename G> class edge_image; 00046 namespace util { class graph; } 00047 00048 00049 // Properties 00050 00051 namespace trait 00052 { 00053 00054 template <typename P, typename V, typename G> 00055 struct image_< edge_image<P,V,G> > 00056 : pw_image_<fun::i2v::array<V>, 00057 p_edges<util::graph, fun::i2v::array<P> >, 00058 edge_image<P,V,G> > 00059 { 00060 }; 00061 00062 } // end of namespace mln::traits. 00063 00064 00065 00066 namespace internal 00067 { 00068 00070 template <typename P, typename V, typename G> 00071 struct data< mln::edge_image<P,V,G> > 00072 { 00073 typedef typename edge_image<P,V,G>::site_function_t site_function_t; 00074 00075 data(const fun::i2v::array<V>& edge_values, 00076 const p_edges<G,site_function_t>& pe); 00077 00078 fun::i2v::array<V> f_; 00079 p_edges<G,site_function_t> domain_; 00080 }; 00081 00082 } // end of namespace mln::internal 00083 00084 00085 00086 00089 template <typename V, typename G, typename P> 00090 edge_image<P,V,G> 00091 operator | (const fun::i2v::array<V>& edge_values, 00092 const p_edges<G,fun::i2v::array<P> >& pe); 00093 00094 00095 // Vertex_image_fsite_selector 00096 00097 namespace internal 00098 { 00099 00100 template <typename P, typename G> 00101 struct efsite_selector 00102 { 00103 typedef fun::i2v::array<P> site_function_t; 00104 }; 00105 00106 00107 00108 template <typename G> 00109 struct efsite_selector<void,G> 00110 { 00111 typedef util::internal::id2element< G,util::edge<G> > site_function_t; 00112 }; 00113 00114 00115 } // end of namespace mln::internal 00116 00117 00121 // 00122 template <typename P, typename V, typename G = util::graph> 00123 class edge_image 00124 : public pw::internal::image_base<fun::i2v::array<V>, 00125 p_edges<G, typename internal::efsite_selector<P,G>::site_function_t >, 00126 edge_image<P,V,G> > 00127 { 00128 typedef pw::internal::image_base<fun::i2v::array<V>, 00129 p_edges<G, typename internal::efsite_selector<P,G>::site_function_t >, 00130 edge_image<P,V,G> > super_; 00131 00132 public: 00133 typedef typename super_::psite psite; 00134 typedef typename super_::rvalue rvalue; 00135 typedef typename super_::lvalue lvalue; 00136 00138 typedef G graph_t; 00139 00141 typedef edge_image< tag::psite_<P>, 00142 tag::value_<V>, 00143 tag::graph_<G> > skeleton; 00144 00146 typedef typename internal::efsite_selector<P,G>::site_function_t 00147 site_function_t; 00148 typedef mln_result(site_function_t) function_result_t; 00149 00151 typedef graph_elt_window<G,p_edges<G,site_function_t> > edge_win_t; 00153 typedef graph_elt_neighborhood<G,p_edges<G,site_function_t> > edge_nbh_t; 00154 00156 typedef edge_win_t win_t; 00157 00159 typedef edge_nbh_t nbh_t; 00160 00161 00164 edge_image(); 00165 edge_image(const p_edges<G, site_function_t>& pe); 00166 edge_image(const Graph<G>& g, 00167 const Function_v2v< site_function_t >& edge_sites, 00168 const Function_v2v< fun::i2v::array<V> >& edge_values); 00169 00170 edge_image(const p_edges<G, site_function_t >& pe, 00171 const Function_v2v< fun::i2v::array<V> >& edge_values); 00172 00173 template <typename FP, typename FV> 00174 edge_image(const Graph<G>& g, 00175 const Function_v2v<FP>& edge_sites, 00176 const Function_v2v<FV>& edge_values); 00177 00178 template <typename FV> 00179 edge_image(const p_edges<G,site_function_t>& pe, 00180 const Function_v2v<FV>& edge_values); 00182 00185 rvalue operator()(unsigned e_id) const; 00186 lvalue operator()(unsigned e_id); 00188 00189 // Just to help g++-2.95... 00190 rvalue operator()(const psite& p) const; 00191 lvalue operator()(const psite& p); 00192 // ...because "using super_::operator()" does not properly work. 00193 00194 }; 00195 00196 template <typename P, typename V, typename G, typename J> 00197 void init_(tag::image_t, edge_image<P,V,G>& target, const Image<J>& model); 00198 00199 00200 # ifndef MLN_INCLUDE_ONLY 00201 00202 template <typename P, typename V, typename G, typename J> 00203 void init_(tag::image_t, edge_image<P,V,G>& target, const Image<J>& model) 00204 { 00205 fun::i2v::array<V> f; 00206 init_(tag::function, f, exact(model)); 00207 p_edges<G, typename edge_image<P,V,G>::site_function_t> s; 00208 init_(tag::domain, s, exact(model)); 00209 target.init_(f, s); 00210 } 00211 00212 // Operator. 00213 00214 template <typename V, typename G, typename P> 00215 inline 00216 edge_image<P,V,G> 00217 operator | (const fun::i2v::array<V>& edge_values, 00218 const p_edges<G,fun::i2v::array<P> >& pe) 00219 { 00220 edge_image<P,V,G> tmp(edge_values, pe); 00221 return tmp; 00222 } 00223 00224 00225 00226 // data< pw::image > 00227 00228 namespace internal 00229 { 00230 00231 template <typename P, typename V, typename G> 00232 inline 00233 data< mln::edge_image<P,V,G> >::data(const fun::i2v::array<V>& f, 00234 const p_edges<G,site_function_t>& ps) 00235 : f_(exact(f)), 00236 domain_(ps) 00237 { 00238 } 00239 00240 } // end of namespace mln::internal 00241 00242 00243 00244 // edge_image<P,V,G> 00245 00246 template <typename P, typename V, typename G> 00247 inline 00248 edge_image<P,V,G>::edge_image() 00249 { 00250 } 00251 00252 template <typename P, typename V, typename G> 00253 inline 00254 edge_image<P,V,G>::edge_image(const p_edges<G,site_function_t>& pe) 00255 : super_(fun::i2v::array<V>(pe.nsites()), pe) 00256 { 00257 } 00258 00259 template <typename P, typename V, typename G> 00260 inline 00261 edge_image<P,V,G>::edge_image(const Graph<G>& g, 00262 const Function_v2v< site_function_t >& edge_sites, 00263 const Function_v2v< fun::i2v::array<V> >& edge_values) 00264 : super_(exact(edge_values), 00265 p_edges<G,site_function_t>(g, exact(edge_sites))) 00266 { 00267 } 00268 00269 template <typename P, typename V, typename G> 00270 inline 00271 edge_image<P,V,G>::edge_image(const p_edges<G,site_function_t>& pe, 00272 const Function_v2v< fun::i2v::array<V> >& edge_values) 00273 : super_(exact(edge_values), pe) 00274 { 00275 } 00276 00277 template <typename P, typename V, typename G> 00278 template <typename FP, typename FV> 00279 inline 00280 edge_image<P,V,G>::edge_image(const Graph<G>& g, 00281 const Function_v2v<FP>& edge_sites, 00282 const Function_v2v<FV>& edge_values) 00283 : super_(convert::to<fun::i2v::array<V> >(exact(edge_values)), 00284 p_edges<G,site_function_t>(g, exact(edge_sites))) 00285 { 00286 mlc_equal(mln_result(FP),P)::check(); 00287 mlc_equal(mln_result(FV),V)::check(); 00288 } 00289 00290 template <typename P, typename V, typename G> 00291 template <typename FV> 00292 inline 00293 edge_image<P,V,G>::edge_image(const p_edges<G,site_function_t>& pe, 00294 const Function_v2v<FV>& edge_values) 00295 : super_(convert::to<fun::i2v::array<V> >(exact(edge_values)), pe) 00296 { 00297 mlc_equal(mln_result(FV),V)::check(); 00298 } 00299 00300 template <typename P, typename V, typename G> 00301 typename edge_image<P,V,G>::rvalue 00302 edge_image<P,V,G>::operator()(unsigned e_id) const 00303 { 00304 return this->data_->f_(e_id); 00305 } 00306 00307 template <typename P, typename V, typename G> 00308 typename edge_image<P,V,G>::lvalue 00309 edge_image<P,V,G>::operator()(unsigned e_id) 00310 { 00311 return this->data_->f_(e_id); 00312 } 00313 00314 template <typename P, typename V, typename G> 00315 typename edge_image<P,V,G>::rvalue 00316 edge_image<P,V,G>::operator()(const typename edge_image<P,V,G>::psite& p) const 00317 { 00318 return this->super_::operator()(p); 00319 } 00320 00321 template <typename P, typename V, typename G> 00322 typename edge_image<P,V,G>::lvalue 00323 edge_image<P,V,G>::operator()(const typename edge_image<P,V,G>::psite& p) 00324 { 00325 return this->super_::operator()(p); 00326 } 00327 00328 # endif // ! MLN_INCLUDE_ONLY 00329 00330 } // end of namespace mln 00331 00332 00333 #endif // ! MLN_CORE_IMAGE_EDGE_IMAGE_HH