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_UTIL_INTERNAL_GRAPH_NBH_ITER_HH
00028 # define MLN_UTIL_INTERNAL_GRAPH_NBH_ITER_HH
00029
00030 # include <mln/core/concept/proxy.hh>
00031 # include <mln/util/internal/graph_nbh_iter_base.hh>
00032 # include <mln/util/vertex.hh>
00033 # include <mln/util/edge.hh>
00034
00038
00039 namespace mln
00040 {
00041
00042 namespace internal
00043 {
00044
00045
00046
00047
00048
00049 template <typename G>
00050 class vertex_nbh_vertex_fwd_iterator
00051 : public nbh_iterator_base<G,
00052 util::vertex<G>,
00053 util::vertex<G>,
00054 vertex_nbh_vertex_fwd_iterator<G> >
00055 {
00056 typedef util::vertex<G> V;
00057 typedef vertex_nbh_vertex_fwd_iterator<G> self_;
00058 typedef nbh_iterator_base<G, V, V, self_> super_;
00059
00060 public:
00062 typedef V center;
00064 typedef V nbh;
00065
00068 vertex_nbh_vertex_fwd_iterator();
00069 template <typename C>
00070 vertex_nbh_vertex_fwd_iterator(const C& c);
00072
00073 protected:
00074
00077 bool is_valid_() const;
00079
00081 unsigned start_id_() const;
00082
00084 unsigned next_id_() const;
00085
00086 void update_();
00087
00088 friend class nbh_iterator_base<G, V, V, self_>;
00089 };
00090
00091 template <typename G>
00092 class vertex_nbh_vertex_bkd_iterator
00093 : public nbh_iterator_base<G,
00094 util::vertex<G>,
00095 util::vertex<G>,
00096 vertex_nbh_vertex_bkd_iterator<G> >
00097 {
00098 typedef util::vertex<G> V;
00099
00100 typedef vertex_nbh_vertex_bkd_iterator<G> self_;
00101 typedef nbh_iterator_base<G, V, V, self_> super_;
00102
00103 public:
00105 typedef V center;
00107 typedef V nbh;
00108
00111 vertex_nbh_vertex_bkd_iterator();
00112 template <typename C>
00113 vertex_nbh_vertex_bkd_iterator(const C& c);
00115
00116 protected:
00120 bool is_valid_() const;
00122
00124 unsigned start_id_() const;
00125
00127 unsigned next_id_() const;
00128
00129 void update_();
00130
00131 friend class nbh_iterator_base<G, V, V, self_>;
00132 };
00133
00134
00135
00136
00137
00138
00139 template <typename G>
00140 class vertex_nbh_edge_fwd_iterator
00141 : public nbh_iterator_base<G,
00142 util::vertex<G>,
00143 util::edge<G>,
00144 vertex_nbh_edge_fwd_iterator<G> >
00145 {
00146 typedef util::vertex<G> V;
00147 typedef util::edge<G> E;
00148 typedef vertex_nbh_edge_fwd_iterator<G> self_;
00149 typedef nbh_iterator_base<G, V, E, self_> super_;
00150
00151 public:
00153 typedef V center;
00155 typedef E nbh;
00156
00159 vertex_nbh_edge_fwd_iterator();
00160 template <typename C>
00161 vertex_nbh_edge_fwd_iterator(const C& c);
00163
00164 protected:
00165
00168 bool is_valid_() const;
00170
00172 unsigned start_id_() const;
00173
00175 unsigned next_id_() const;
00176
00177 void update_();
00178
00179 friend class nbh_iterator_base<G, V, E, self_>;
00180 };
00181
00182
00183 template <typename G>
00184 class vertex_nbh_edge_bkd_iterator
00185 : public nbh_iterator_base<G,
00186 util::vertex<G>,
00187 util::edge<G>,
00188 vertex_nbh_edge_bkd_iterator<G> >
00189 {
00190 typedef util::vertex<G> V;
00191 typedef util::edge<G> E;
00192 typedef vertex_nbh_edge_bkd_iterator<G> self_;
00193 typedef nbh_iterator_base<G, V, E, self_> super_;
00194
00195 public:
00197 typedef V center;
00199 typedef E nbh;
00200
00203 vertex_nbh_edge_bkd_iterator();
00204 template <typename C>
00205 vertex_nbh_edge_bkd_iterator(const C& c);
00207
00208 protected:
00209
00212 bool is_valid_() const;
00214
00216 unsigned start_id_() const;
00217
00219 unsigned next_id_() const;
00220
00221 void update_();
00222
00223 friend class nbh_iterator_base<G, V, E, self_>;
00224 };
00225
00226
00227
00228
00229
00230
00231 template <typename G>
00232 class edge_nbh_edge_fwd_iterator
00233 : public nbh_iterator_base<G,
00234 util::edge<G>,
00235 util::edge<G>,
00236 edge_nbh_edge_fwd_iterator<G> >
00237 {
00238 typedef util::edge<G> E;
00239 typedef edge_nbh_edge_fwd_iterator<G> self_;
00240 typedef nbh_iterator_base<G, E, E, self_> super_;
00241
00242 public:
00244 typedef E center;
00246 typedef E nbh;
00247
00248
00251 edge_nbh_edge_fwd_iterator();
00252 template <typename C>
00253 edge_nbh_edge_fwd_iterator(const C& c);
00255
00256 protected:
00257
00260 bool is_valid_() const;
00262
00264 unsigned start_id_() const;
00265
00267 unsigned next_id_() const;
00268
00269 void update_();
00270
00271 friend class nbh_iterator_base<G, E, E, self_>;
00272 };
00273
00274
00275 template <typename G>
00276 class edge_nbh_edge_bkd_iterator
00277 : public nbh_iterator_base<G,
00278 util::edge<G>,
00279 util::edge<G>,
00280 edge_nbh_edge_bkd_iterator<G> >
00281 {
00282 typedef util::edge<G> E;
00283
00284 typedef edge_nbh_edge_bkd_iterator<G> self_;
00285 typedef nbh_iterator_base<G, E, E, self_> super_;
00286
00287 public:
00288
00290 typedef E center;
00292 typedef E nbh;
00293
00296 edge_nbh_edge_bkd_iterator();
00297 template <typename C>
00298 edge_nbh_edge_bkd_iterator(const C& c);
00300
00301 protected:
00302
00305 bool is_valid_() const;
00307
00309 unsigned start_id_() const;
00310
00312 unsigned next_id_() const;
00313
00314 void update_();
00315
00316 friend class nbh_iterator_base<G, E, E, self_>;
00317 };
00318
00319 # ifndef MLN_INCLUDE_ONLY
00320
00321
00322
00323
00324
00325 template <typename G>
00326 inline
00327 vertex_nbh_vertex_fwd_iterator<G>::vertex_nbh_vertex_fwd_iterator()
00328 {
00329 }
00330
00331 template <typename G>
00332 template <typename C>
00333 inline
00334 vertex_nbh_vertex_fwd_iterator<G>::vertex_nbh_vertex_fwd_iterator(const C& c)
00335 : super_(c)
00336 {
00337 }
00338
00339 template <typename G>
00340 inline
00341 bool
00342 vertex_nbh_vertex_fwd_iterator<G>::is_valid_() const
00343 {
00344 return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_vertices();
00345 }
00346
00347 template <typename G>
00348 inline
00349 unsigned
00350 vertex_nbh_vertex_fwd_iterator<G>::start_id_() const
00351 {
00352 return 0;
00353 }
00354
00355 template <typename G>
00356 inline
00357 unsigned
00358 vertex_nbh_vertex_fwd_iterator<G>::next_id_() const
00359 {
00360 return this->i_ + 1;
00361 }
00362
00363 template <typename G>
00364 inline
00365 void
00366 vertex_nbh_vertex_fwd_iterator<G>::update_()
00367 {
00368 this->elt_.update_id(this->c_->ith_nbh_vertex(this->i_));
00369 }
00370
00371
00372
00373
00374
00375 template <typename G>
00376 inline
00377 vertex_nbh_vertex_bkd_iterator<G>::vertex_nbh_vertex_bkd_iterator()
00378 {
00379 }
00380
00381 template <typename G>
00382 template <typename C>
00383 inline
00384 vertex_nbh_vertex_bkd_iterator<G>::vertex_nbh_vertex_bkd_iterator(const C& c)
00385 : super_(c)
00386 {
00387 }
00388
00389 template <typename G>
00390 inline
00391 bool
00392 vertex_nbh_vertex_bkd_iterator<G>::is_valid_() const
00393 {
00394 return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_vertices();
00395 }
00396
00397 template <typename G>
00398 inline
00399 unsigned
00400 vertex_nbh_vertex_bkd_iterator<G>::start_id_() const
00401 {
00402 return this->c_->nmax_nbh_vertices() - 1;
00403 }
00404
00405 template <typename G>
00406 inline
00407 unsigned
00408 vertex_nbh_vertex_bkd_iterator<G>::next_id_() const
00409 {
00410 return this->i_ - 1;
00411 }
00412
00413 template <typename G>
00414 inline
00415 void
00416 vertex_nbh_vertex_bkd_iterator<G>::update_()
00417 {
00418 this->elt_.update_id(this->c_->ith_nbh_vertex(this->i_));
00419 }
00420
00421
00422
00423
00424
00425
00426 template <typename G>
00427 inline
00428 vertex_nbh_edge_fwd_iterator<G>::vertex_nbh_edge_fwd_iterator()
00429 {
00430 }
00431
00432 template <typename G>
00433 template <typename C>
00434 inline
00435 vertex_nbh_edge_fwd_iterator<G>::vertex_nbh_edge_fwd_iterator(const C& c)
00436 : super_(c)
00437 {
00438 }
00439
00440 template <typename G>
00441 inline
00442 bool
00443 vertex_nbh_edge_fwd_iterator<G>::is_valid_() const
00444 {
00445 return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_edges();
00446 }
00447
00448 template <typename G>
00449 inline
00450 unsigned
00451 vertex_nbh_edge_fwd_iterator<G>::start_id_() const
00452 {
00453 return 0;
00454 }
00455
00456 template <typename G>
00457 inline
00458 unsigned
00459 vertex_nbh_edge_fwd_iterator<G>::next_id_() const
00460 {
00461 return this->i_ + 1;
00462 }
00463
00464 template <typename G>
00465 inline
00466 void
00467 vertex_nbh_edge_fwd_iterator<G>::update_()
00468 {
00469 this->elt_.update_id(this->c_->ith_nbh_edge(this->i_));
00470 }
00471
00472
00473
00474
00475
00476 template <typename G>
00477 inline
00478 vertex_nbh_edge_bkd_iterator<G>::vertex_nbh_edge_bkd_iterator()
00479 {
00480 }
00481
00482 template <typename G>
00483 template <typename C>
00484 inline
00485 vertex_nbh_edge_bkd_iterator<G>::vertex_nbh_edge_bkd_iterator(const C& c)
00486 : super_(c)
00487 {
00488 }
00489
00490 template <typename G>
00491 inline
00492 bool
00493 vertex_nbh_edge_bkd_iterator<G>::is_valid_() const
00494 {
00495 return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_edges();
00496 }
00497
00498 template <typename G>
00499 inline
00500 unsigned
00501 vertex_nbh_edge_bkd_iterator<G>::start_id_() const
00502 {
00503 return this->c_->nmax_nbh_edges() - 1;
00504 }
00505
00506 template <typename G>
00507 inline
00508 unsigned
00509 vertex_nbh_edge_bkd_iterator<G>::next_id_() const
00510 {
00511 return this->i_ - 1;
00512 }
00513
00514 template <typename G>
00515 inline
00516 void
00517 vertex_nbh_edge_bkd_iterator<G>::update_()
00518 {
00519 this->elt_.update_id(this->c_->ith_nbh_edge(this->i_));
00520 }
00521
00522
00523
00524
00525
00526
00527
00528 template <typename G>
00529 inline
00530 edge_nbh_edge_fwd_iterator<G>::edge_nbh_edge_fwd_iterator()
00531 {
00532 }
00533
00534 template <typename G>
00535 template <typename C>
00536 inline
00537 edge_nbh_edge_fwd_iterator<G>::edge_nbh_edge_fwd_iterator(const C& c)
00538 : super_(c)
00539 {
00540 }
00541
00542 template <typename G>
00543 inline
00544 bool
00545 edge_nbh_edge_fwd_iterator<G>::is_valid_() const
00546 {
00547 return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_edges();
00548 }
00549
00550 template <typename G>
00551 inline
00552 unsigned
00553 edge_nbh_edge_fwd_iterator<G>::start_id_() const
00554 {
00555 return 0;
00556 }
00557
00558 template <typename G>
00559 inline
00560 unsigned
00561 edge_nbh_edge_fwd_iterator<G>::next_id_() const
00562 {
00563 return this->i_ + 1;
00564 }
00565
00566 template <typename G>
00567 inline
00568 void
00569 edge_nbh_edge_fwd_iterator<G>::update_()
00570 {
00571
00572
00573
00574
00575 util::edge_id_t e_id = this->c_->ith_nbh_edge(this->i_);
00576 while (e_id == this->c_->id())
00577 {
00578 this->i_ = next_id_();
00579 e_id = this->c_->ith_nbh_edge(this->i_);
00580 }
00581
00582 this->elt_.update_id(e_id);
00583 }
00584
00585
00586
00587
00588
00589 template <typename G>
00590 inline
00591 edge_nbh_edge_bkd_iterator<G>::edge_nbh_edge_bkd_iterator()
00592 {
00593 }
00594
00595 template <typename G>
00596 template <typename C>
00597 inline
00598 edge_nbh_edge_bkd_iterator<G>::edge_nbh_edge_bkd_iterator(const C& c)
00599 : super_(c)
00600 {
00601 }
00602
00603 template <typename G>
00604 inline
00605 bool
00606 edge_nbh_edge_bkd_iterator<G>::is_valid_() const
00607 {
00608 return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_edges();
00609 }
00610
00611 template <typename G>
00612 inline
00613 unsigned
00614 edge_nbh_edge_bkd_iterator<G>::start_id_() const
00615 {
00616 return this->c_->nmax_nbh_edges() - 1;
00617 }
00618
00619 template <typename G>
00620 inline
00621 unsigned
00622 edge_nbh_edge_bkd_iterator<G>::next_id_() const
00623 {
00624 return this->i_ - 1;
00625 }
00626
00627 template <typename G>
00628 inline
00629 void
00630 edge_nbh_edge_bkd_iterator<G>::update_()
00631 {
00632
00633
00634
00635 unsigned e_id = this->c_->ith_nbh_edge(this->i_);
00636 while (e_id == this->c_->id())
00637 {
00638 this->i_ = next_id_();
00639 e_id = this->c_->ith_nbh_edge(this->i_);
00640 }
00641
00642 this->elt_.update_id(e_id);
00643 }
00644
00645 # endif // !MLN_INCLUDE_ONLY
00646
00647 }
00648
00649 }
00650
00651
00652 #endif // ! MLN_UTIL_INTERNAL_GRAPH_NBH_ITER_HH