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
00027 #ifndef MLN_CORE_SITE_SET_P_VERTICES_HH
00028 # define MLN_CORE_SITE_SET_P_VERTICES_HH
00029
00033
00034 # include <mln/core/concept/function.hh>
00035 # include <mln/core/internal/site_set_base.hh>
00036 # include <mln/core/site_set/p_graph_piter.hh>
00037 # include <mln/core/site_set/p_vertices_psite.hh>
00038 # include <mln/util/graph.hh>
00039 # include <mln/util/internal/id2element.hh>
00040
00041
00042
00043 namespace mln
00044 {
00045
00046
00047 template <typename G, typename F> struct p_vertices;
00048
00049
00050 namespace trait
00051 {
00052
00053 template <typename G, typename F>
00054 struct site_set_< p_vertices<G,F> >
00055 {
00056 typedef trait::site_set::nsites::known nsites;
00057
00058 typedef trait::site_set::bbox::unknown bbox;
00059 typedef trait::site_set::contents::fixed contents;
00060 typedef trait::site_set::arity::unique arity;
00061 };
00062
00063 }
00064
00065
00069
00070 template <typename G, typename F = util::internal::id2element<G,util::vertex<G> > >
00071 class p_vertices
00072 : public internal::site_set_base_< mln_result(F), p_vertices<G,F> >
00073 {
00074
00075 typedef p_vertices<G,F> self_;
00076 typedef internal::site_set_base_< mln_result(F), self_ > super_;
00077
00078 public:
00079
00081 typedef G graph_t;
00082
00084 typedef F fun_t;
00085
00087 typedef util::vertex<G> vertex;
00088
00089
00091 typedef util::vertex<G> graph_element;
00092
00093
00095 p_vertices();
00096
00100 p_vertices(const Graph<G>& gr);
00101
00105 p_vertices(const Graph<G>& gr, const Function<F>& f);
00106
00111 template <typename F2>
00112 p_vertices(const Graph<G>& gr, const Function<F2>& f);
00114
00116 template <typename F2>
00117 p_vertices(const p_vertices<G,F2>& other);
00118
00121
00123 typedef mln_site(super_) element;
00124
00126 typedef p_vertices_psite<G,F> psite;
00127
00129 typedef p_graph_piter< self_, mln_vertex_fwd_iter(G) > fwd_piter;
00130
00132 typedef p_graph_piter< self_, mln_vertex_bkd_iter(G) > bkd_piter;
00133
00135 typedef fwd_piter piter;
00136
00138
00139
00144 unsigned nsites() const;
00145
00147 unsigned nvertices() const;
00148
00150 bool is_valid() const;
00151
00153 void invalidate();
00154
00156 bool has(const psite& p) const;
00157
00159 template <typename G2>
00160 bool has(const util::vertex<G2>& v) const;
00161
00165
00166
00167 std::size_t memory_size() const;
00168
00171 mln_result(F) operator()(const psite& p) const;
00172 mln_result(F) operator()(const util::vertex<G>& p) const;
00173 mln_result(F) operator()(unsigned id_v) const;
00175
00179 const G& graph() const;
00181 const F& function() const;
00183
00184 private:
00185 G g_;
00186 F f_;
00187 };
00188
00189
00194 template <typename G, typename F>
00195 bool
00196 operator==(const p_vertices<G,F>& lhs, const p_vertices<G,F>& rhs);
00197
00198
00199
00200
00201
00210 template <typename G, typename F>
00211 bool
00212 operator<=(const p_vertices<G,F>& lhs, const p_vertices<G,F>& rhs);
00213
00214
00215
00216 # ifndef MLN_INCLUDE_ONLY
00217
00218 template <typename G, typename F>
00219 inline
00220 p_vertices<G,F>::p_vertices()
00221 {
00222 }
00223
00224 template <typename G, typename F>
00225 inline
00226 p_vertices<G,F>::p_vertices(const Graph<G>& g)
00227 {
00228 typedef util::internal::id2element<G,util::vertex<G> > F_REF;
00229 mlc_equal(F, F_REF)::check();
00230
00231 mln_precondition(exact(g).is_valid());
00232 g_ = exact(g);
00233 f_ = util::internal::id2element< G, util::vertex<G> >(g);
00234 }
00235
00236 template <typename G, typename F>
00237 inline
00238 p_vertices<G,F>::p_vertices(const Graph<G>& g, const Function<F>& f)
00239 {
00240 mln_precondition(exact(g).is_valid());
00241 g_ = exact(g);
00242 f_ = exact(f);
00243 }
00244
00245 template <typename G, typename F>
00246 template <typename F2>
00247 inline
00248 p_vertices<G,F>::p_vertices(const Graph<G>& g, const Function<F2>& f)
00249 {
00250 mln_precondition(exact(g).is_valid());
00251 mlc_converts_to(F2,F)::check();
00252
00253 g_ = exact(g);
00254 convert::from_to(f, f_);
00255 }
00256
00257 template <typename G, typename F>
00258 template <typename F2>
00259 inline
00260 p_vertices<G,F>::p_vertices(const p_vertices<G,F2>& other)
00261 {
00262 mln_precondition(other.is_valid());
00263 mlc_converts_to(F2,F)::check();
00264
00265 g_ = other.graph();
00266 convert::from_to(other.function(), f_);
00267 }
00268
00269 template <typename G, typename F>
00270 inline
00271 unsigned
00272 p_vertices<G,F>::nsites() const
00273 {
00274 return nvertices();
00275 }
00276
00277 template <typename G, typename F>
00278 inline
00279 unsigned
00280 p_vertices<G,F>::nvertices() const
00281 {
00282 return this->g_.v_nmax();
00283 }
00284
00285 template <typename G, typename F>
00286 inline
00287 bool
00288 p_vertices<G,F>::is_valid() const
00289 {
00290 return g_.is_valid();
00291 }
00292
00293 template <typename G, typename F>
00294 inline
00295 void
00296 p_vertices<G,F>::invalidate()
00297 {
00298 g_.invalidate();
00299 }
00300
00301 template <typename G, typename F>
00302 inline
00303 bool
00304 p_vertices<G,F>::has(const psite& p) const
00305 {
00306 mln_precondition(is_valid());
00307 return has(p.v());
00308 }
00309
00310 template <typename G, typename F>
00311 template <typename G2>
00312 inline
00313 bool
00314 p_vertices<G,F>::has(const util::vertex<G2>& v) const
00315 {
00316 mln_precondition(is_valid());
00317 return
00318
00319 v.graph().is_subgraph_of(g_) &&
00320 g_.has(v) &&
00321
00322
00323 (v.is_valid());
00324 }
00325
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336 template <typename G, typename F>
00337 inline
00338 std::size_t
00339 p_vertices<G,F>::memory_size() const
00340 {
00341
00342 abort();
00343 return 0;
00344 }
00345
00346 template <typename G, typename F>
00347 inline
00348 mln_result(F)
00349 p_vertices<G,F>::operator()(const psite& p) const
00350 {
00351 mln_precondition(g_.has(p.v()));
00352 return (*this)(p.v().id());
00353 }
00354
00355 template <typename G, typename F>
00356 inline
00357 mln_result(F)
00358 p_vertices<G,F>::operator()(const util::vertex<G>& v) const
00359 {
00360 mln_precondition(g_.has_v(v));
00361 return (*this)(v.id());
00362 }
00363
00364 template <typename G, typename F>
00365 inline
00366 mln_result(F)
00367 p_vertices<G,F>::operator()(unsigned id_v) const
00368 {
00369 mln_precondition(g_.has_v(id_v));
00370 return f_(id_v);
00371 }
00372
00373 template <typename G, typename F>
00374 inline
00375 const G&
00376 p_vertices<G,F>::graph() const
00377 {
00378 mln_precondition(is_valid());
00379 return g_;
00380 }
00381
00382 template <typename G, typename F>
00383 inline
00384 const F&
00385 p_vertices<G,F>::function() const
00386 {
00387 return f_;
00388 }
00389
00390 template <typename G, typename F>
00391 bool
00392 operator==(const p_vertices<G,F>& lhs, const p_vertices<G,F>& rhs)
00393 {
00394 return (lhs.graph()) == (rhs.graph());
00395 }
00396
00397 template <typename G, typename F>
00398 bool
00399 operator<=(const p_vertices<G,F>& lhs, const p_vertices<G,F>& rhs)
00400 {
00401 return lhs == rhs;
00402 }
00403
00404 # endif // ! MLN_INCLUDE_ONLY
00405
00406 }
00407
00408
00409 #endif // ! MLN_CORE_SITE_SET_P_VERTICES_HH