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

graph_nbh_iter.hh

00001 // Copyright (C) 2008, 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_UTIL_INTERNAL_GRAPH_NBH_ITER_HH
00027 # define MLN_UTIL_INTERNAL_GRAPH_NBH_ITER_HH
00028 
00029 # include <mln/core/concept/proxy.hh>
00030 # include <mln/util/internal/graph_nbh_iter_base.hh>
00031 # include <mln/util/vertex.hh>
00032 # include <mln/util/edge.hh>
00033 
00036 
00037 namespace mln
00038 {
00039 
00040   namespace internal
00041   {
00042 
00043     /*-----------------------------`
00044     | vertex_nbh_vertex_*_iterator |
00045     \-----------------------------*/
00046 
00047     template <typename G>
00048     class vertex_nbh_vertex_fwd_iterator
00049       : public nbh_iterator_base<G,
00050                                  util::vertex<G>,
00051                                  util::vertex<G>,
00052                                  vertex_nbh_vertex_fwd_iterator<G> >
00053     {
00054       typedef util::vertex<G> V;
00055       typedef vertex_nbh_vertex_fwd_iterator<G> self_;
00056       typedef nbh_iterator_base<G, V, V, self_> super_;
00057 
00058       public:
00061         vertex_nbh_vertex_fwd_iterator();
00062         template <typename C>
00063         vertex_nbh_vertex_fwd_iterator(const C& c);
00065 
00066       protected:
00067         // Manipulation.
00070         bool is_valid_() const;
00072 
00074         unsigned start_id_() const;
00075 
00077         unsigned next_id_() const;
00078 
00079         void update_();
00080 
00081         friend class nbh_iterator_base<G, V, V, self_>;
00082     };
00083 
00084     template <typename G>
00085     class vertex_nbh_vertex_bkd_iterator
00086       : public nbh_iterator_base<G,
00087                                  util::vertex<G>,
00088                                  util::vertex<G>,
00089                                  vertex_nbh_vertex_bkd_iterator<G> >
00090     {
00091       typedef util::vertex<G> V;
00092       typedef vertex_nbh_vertex_bkd_iterator<G> self_;
00093       typedef nbh_iterator_base<G, V, V, self_> super_;
00094 
00095       public:
00098         vertex_nbh_vertex_bkd_iterator();
00099         template <typename C>
00100         vertex_nbh_vertex_bkd_iterator(const C& c);
00102 
00103       protected:
00107         bool is_valid_() const;
00109 
00111         unsigned start_id_() const;
00112 
00114         unsigned next_id_() const;
00115 
00116         void update_();
00117 
00118         friend class nbh_iterator_base<G, V, V, self_>;
00119     };
00120 
00121 
00122     /*---------------------------`
00123     | vertex_nbh_edge_*_iterator |
00124     \---------------------------*/
00125 
00126     template <typename G>
00127     class vertex_nbh_edge_fwd_iterator
00128       : public nbh_iterator_base<G,
00129                                  util::vertex<G>,
00130                                  util::edge<G>,
00131                                  vertex_nbh_edge_fwd_iterator<G> >
00132     {
00133       typedef util::vertex<G> V;
00134       typedef util::edge<G> E;
00135       typedef vertex_nbh_edge_fwd_iterator<G> self_;
00136       typedef nbh_iterator_base<G, V, E, self_> super_;
00137 
00138       public:
00141         vertex_nbh_edge_fwd_iterator();
00142         template <typename C>
00143         vertex_nbh_edge_fwd_iterator(const C& c);
00145 
00146       protected:
00147         // Manipulation.
00150         bool is_valid_() const;
00152 
00154         unsigned start_id_() const;
00155 
00157         unsigned next_id_() const;
00158 
00159         void update_();
00160 
00161         friend class nbh_iterator_base<G, V, E, self_>;
00162     };
00163 
00164 
00165     template <typename G>
00166     class vertex_nbh_edge_bkd_iterator
00167       : public nbh_iterator_base<G,
00168                                  util::vertex<G>,
00169                                  util::edge<G>,
00170                                  vertex_nbh_edge_bkd_iterator<G> >
00171     {
00172       typedef util::vertex<G> V;
00173       typedef util::edge<G> E;
00174       typedef vertex_nbh_edge_bkd_iterator<G> self_;
00175       typedef nbh_iterator_base<G, V, E, self_> super_;
00176 
00177       public:
00180         vertex_nbh_edge_bkd_iterator();
00181         template <typename C>
00182         vertex_nbh_edge_bkd_iterator(const C& c);
00184 
00185       protected:
00186         // Manipulation.
00189         bool is_valid_() const;
00191 
00193         unsigned start_id_() const;
00194 
00196         unsigned next_id_() const;
00197 
00198         void update_();
00199 
00200         friend class nbh_iterator_base<G, V, E, self_>;
00201     };
00202 
00203 
00204     /*---------------------------`
00205     | edge_nbh_edge_*_iterator |
00206     \---------------------------*/
00207 
00208     template <typename G>
00209     class edge_nbh_edge_fwd_iterator
00210       : public nbh_iterator_base<G,
00211                                  util::edge<G>,
00212                                  util::edge<G>,
00213                                  edge_nbh_edge_fwd_iterator<G> >
00214     {
00215       typedef util::edge<G> E;
00216       typedef edge_nbh_edge_fwd_iterator<G> self_;
00217       typedef nbh_iterator_base<G, E, E, self_> super_;
00218 
00219       public:
00222         edge_nbh_edge_fwd_iterator();
00223         template <typename C>
00224         edge_nbh_edge_fwd_iterator(const C& c);
00226 
00227       protected:
00228         // Manipulation.
00231         bool is_valid_() const;
00233 
00235         unsigned start_id_() const;
00236 
00238         unsigned next_id_() const;
00239 
00240         void update_();
00241 
00242         friend class nbh_iterator_base<G, E, E, self_>;
00243     };
00244 
00245 
00246     template <typename G>
00247     class edge_nbh_edge_bkd_iterator
00248       : public nbh_iterator_base<G,
00249                                  util::edge<G>,
00250                                  util::edge<G>,
00251                                  edge_nbh_edge_bkd_iterator<G> >
00252     {
00253       typedef util::edge<G> E;
00254       typedef edge_nbh_edge_bkd_iterator<G> self_;
00255       typedef nbh_iterator_base<G, E, E, self_> super_;
00256 
00257       public:
00260         edge_nbh_edge_bkd_iterator();
00261         template <typename C>
00262         edge_nbh_edge_bkd_iterator(const C& c);
00264 
00265       protected:
00266         // Manipulation.
00269         bool is_valid_() const;
00271 
00273         unsigned start_id_() const;
00274 
00276         unsigned next_id_() const;
00277 
00278         void update_();
00279 
00280         friend class nbh_iterator_base<G, E, E, self_>;
00281     };
00282 
00283 # ifndef MLN_INCLUDE_ONLY
00284 
00285     /*-------------------------------`
00286     | vertex_nbh_vertex_fwd_iterator |
00287     \-------------------------------*/
00288 
00289     template <typename G>
00290     inline
00291     vertex_nbh_vertex_fwd_iterator<G>::vertex_nbh_vertex_fwd_iterator()
00292     {
00293     }
00294 
00295     template <typename G>
00296     template <typename C>
00297     inline
00298     vertex_nbh_vertex_fwd_iterator<G>::vertex_nbh_vertex_fwd_iterator(const C& c)
00299     : super_(c)
00300     {
00301     }
00302 
00303     template <typename G>
00304     inline
00305     bool
00306     vertex_nbh_vertex_fwd_iterator<G>::is_valid_() const
00307     {
00308       return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_vertices();
00309     }
00310 
00311     template <typename G>
00312     inline
00313     unsigned
00314     vertex_nbh_vertex_fwd_iterator<G>::start_id_() const
00315     {
00316       return 0;
00317     }
00318 
00319     template <typename G>
00320     inline
00321     unsigned
00322     vertex_nbh_vertex_fwd_iterator<G>::next_id_() const
00323     {
00324       return this->i_ + 1;
00325     }
00326 
00327     template <typename G>
00328     inline
00329     void
00330     vertex_nbh_vertex_fwd_iterator<G>::update_()
00331     {
00332       this->elt_.update_id(this->c_->ith_nbh_vertex(this->i_));
00333     }
00334 
00335     /*-------------------------------`
00336     | vertex_nbh_vertex_bkd_iterator |
00337     \-------------------------------*/
00338 
00339     template <typename G>
00340     inline
00341     vertex_nbh_vertex_bkd_iterator<G>::vertex_nbh_vertex_bkd_iterator()
00342     {
00343     }
00344 
00345     template <typename G>
00346     template <typename C>
00347     inline
00348     vertex_nbh_vertex_bkd_iterator<G>::vertex_nbh_vertex_bkd_iterator(const C& c)
00349       : super_(c)
00350     {
00351     }
00352 
00353     template <typename G>
00354     inline
00355     bool
00356     vertex_nbh_vertex_bkd_iterator<G>::is_valid_() const
00357     {
00358       return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_vertices();
00359     }
00360 
00361     template <typename G>
00362     inline
00363     unsigned
00364     vertex_nbh_vertex_bkd_iterator<G>::start_id_() const
00365     {
00366       return this->c_->nmax_nbh_vertices() - 1;
00367     }
00368 
00369     template <typename G>
00370     inline
00371     unsigned
00372     vertex_nbh_vertex_bkd_iterator<G>::next_id_() const
00373     {
00374       return this->i_ - 1;
00375     }
00376 
00377     template <typename G>
00378     inline
00379     void
00380     vertex_nbh_vertex_bkd_iterator<G>::update_()
00381     {
00382       this->elt_.update_id(this->c_->ith_nbh_vertex(this->i_));
00383     }
00384 
00385 
00386     /*-----------------------------`
00387     | vertex_nbh_edge_fwd_iterator |
00388     \-----------------------------*/
00389 
00390     template <typename G>
00391     inline
00392     vertex_nbh_edge_fwd_iterator<G>::vertex_nbh_edge_fwd_iterator()
00393     {
00394     }
00395 
00396     template <typename G>
00397     template <typename C>
00398     inline
00399     vertex_nbh_edge_fwd_iterator<G>::vertex_nbh_edge_fwd_iterator(const C& c)
00400       : super_(c)
00401     {
00402     }
00403 
00404     template <typename G>
00405     inline
00406     bool
00407     vertex_nbh_edge_fwd_iterator<G>::is_valid_() const
00408     {
00409       return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_edges();
00410     }
00411 
00412     template <typename G>
00413     inline
00414     unsigned
00415     vertex_nbh_edge_fwd_iterator<G>::start_id_() const
00416     {
00417       return 0;
00418     }
00419 
00420     template <typename G>
00421     inline
00422     unsigned
00423     vertex_nbh_edge_fwd_iterator<G>::next_id_() const
00424     {
00425       return this->i_ + 1;
00426     }
00427 
00428     template <typename G>
00429     inline
00430     void
00431     vertex_nbh_edge_fwd_iterator<G>::update_()
00432     {
00433       this->elt_.update_id(this->c_->ith_nbh_edge(this->i_));
00434     }
00435 
00436     /*-----------------------------`
00437     | vertex_nbh_edge_bkd_iterator |
00438     \-----------------------------*/
00439 
00440     template <typename G>
00441     inline
00442     vertex_nbh_edge_bkd_iterator<G>::vertex_nbh_edge_bkd_iterator()
00443     {
00444     }
00445 
00446     template <typename G>
00447     template <typename C>
00448     inline
00449     vertex_nbh_edge_bkd_iterator<G>::vertex_nbh_edge_bkd_iterator(const C& c)
00450       : super_(c)
00451     {
00452     }
00453 
00454     template <typename G>
00455     inline
00456     bool
00457     vertex_nbh_edge_bkd_iterator<G>::is_valid_() const
00458     {
00459       return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_edges();
00460     }
00461 
00462     template <typename G>
00463     inline
00464     unsigned
00465     vertex_nbh_edge_bkd_iterator<G>::start_id_() const
00466     {
00467       return this->c_->nmax_nbh_edges() - 1;
00468     }
00469 
00470     template <typename G>
00471     inline
00472     unsigned
00473     vertex_nbh_edge_bkd_iterator<G>::next_id_() const
00474     {
00475       return this->i_ - 1;
00476     }
00477 
00478     template <typename G>
00479     inline
00480     void
00481     vertex_nbh_edge_bkd_iterator<G>::update_()
00482     {
00483       this->elt_.update_id(this->c_->ith_nbh_edge(this->i_));
00484     }
00485 
00486 
00487 
00488     /*-----------------------------`
00489     | edge_nbh_edge_fwd_iterator |
00490     \-----------------------------*/
00491 
00492     template <typename G>
00493     inline
00494     edge_nbh_edge_fwd_iterator<G>::edge_nbh_edge_fwd_iterator()
00495     {
00496     }
00497 
00498     template <typename G>
00499     template <typename C>
00500     inline
00501     edge_nbh_edge_fwd_iterator<G>::edge_nbh_edge_fwd_iterator(const C& c)
00502       : super_(c)
00503     {
00504     }
00505 
00506     template <typename G>
00507     inline
00508     bool
00509     edge_nbh_edge_fwd_iterator<G>::is_valid_() const
00510     {
00511       return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_edges();
00512     }
00513 
00514     template <typename G>
00515     inline
00516     unsigned
00517     edge_nbh_edge_fwd_iterator<G>::start_id_() const
00518     {
00519       return 0;
00520     }
00521 
00522     template <typename G>
00523     inline
00524     unsigned
00525     edge_nbh_edge_fwd_iterator<G>::next_id_() const
00526     {
00527       return this->i_ + 1;
00528     }
00529 
00530     template <typename G>
00531     inline
00532     void
00533     edge_nbh_edge_fwd_iterator<G>::update_()
00534     {
00535       // We shall encounter the current edge in its neighborhood
00536       // since it is computed thanks to the edge neighboors of its
00537       // two vertices.
00538       // We do not want the current edge to be part of its neighbors.
00539       util::edge_id_t e_id = this->c_->ith_nbh_edge(this->i_);
00540       while (e_id == this->c_->id())
00541       {
00542         this->i_ = next_id_();
00543         e_id = this->c_->ith_nbh_edge(this->i_);
00544       }
00545 
00546       this->elt_.update_id(e_id);
00547     }
00548 
00549     /*-----------------------------`
00550     | edge_nbh_edge_bkd_iterator |
00551     \-----------------------------*/
00552 
00553     template <typename G>
00554     inline
00555     edge_nbh_edge_bkd_iterator<G>::edge_nbh_edge_bkd_iterator()
00556     {
00557     }
00558 
00559     template <typename G>
00560     template <typename C>
00561     inline
00562     edge_nbh_edge_bkd_iterator<G>::edge_nbh_edge_bkd_iterator(const C& c)
00563       : super_(c)
00564     {
00565     }
00566 
00567     template <typename G>
00568     inline
00569     bool
00570     edge_nbh_edge_bkd_iterator<G>::is_valid_() const
00571     {
00572       return this->c_->is_valid() && this->i_ < this->c_->nmax_nbh_edges();
00573     }
00574 
00575     template <typename G>
00576     inline
00577     unsigned
00578     edge_nbh_edge_bkd_iterator<G>::start_id_() const
00579     {
00580       return this->c_->nmax_nbh_edges() - 1;
00581     }
00582 
00583     template <typename G>
00584     inline
00585     unsigned
00586     edge_nbh_edge_bkd_iterator<G>::next_id_() const
00587     {
00588       return this->i_ - 1;
00589     }
00590 
00591     template <typename G>
00592     inline
00593     void
00594     edge_nbh_edge_bkd_iterator<G>::update_()
00595     {
00596       // We shall encounter vertices which are part of the
00597       // current edge.
00598       // We do not want them to be part of the edge neighbors.
00599       unsigned e_id = this->c_->ith_nbh_edge(this->i_);
00600       while (e_id == this->c_->id())
00601       {
00602         this->i_ = next_id_();
00603         e_id = this->c_->ith_nbh_edge(this->i_);
00604       }
00605 
00606       this->elt_.update_id(e_id);
00607     }
00608 
00609 # endif // !MLN_INCLUDE_ONLY
00610 
00611   } // End of namespace mln::internal
00612 
00613 } // End of namespace mln
00614 
00615 
00616 #endif // ! MLN_UTIL_INTERNAL_GRAPH_NBH_ITER_HH

Generated on Thu Sep 8 2011 18:31:52 for Milena (Olena) by  doxygen 1.7.1