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_UTIL_INTERNAL_GRAPH_ITER_HH
00027 # define MLN_UTIL_INTERNAL_GRAPH_ITER_HH
00028
00032
00033 # include <mln/util/internal/graph_iter_base.hh>
00034 # include <mln/util/vertex.hh>
00035 # include <mln/util/edge.hh>
00036
00037
00038
00039 namespace mln
00040 {
00041
00042 namespace internal
00043 {
00044
00046
00047 template<typename G>
00048 class vertex_fwd_iterator
00049 : public graph_iter_base<G, util::vertex<G>, vertex_fwd_iterator<G> >
00050 {
00051 typedef graph_iter_base<G, util::vertex<G>, vertex_fwd_iterator<G> > super_;
00052
00053 public:
00056 vertex_fwd_iterator();
00057 vertex_fwd_iterator(const G& g);
00059
00060 protected:
00063 util::vertex_id_t start_id_() const;
00064
00067 util::vertex_id_t next_id_() const;
00068
00069 friend class graph_iter_base<G, util::vertex<G>, vertex_fwd_iterator<G> >;
00070 };
00071
00072
00074
00075 template<typename G>
00076 class vertex_bkd_iterator
00077 : public graph_iter_base<G, util::vertex<G>, vertex_bkd_iterator<G> >
00078 {
00079 typedef graph_iter_base<G, util::vertex<G>, vertex_bkd_iterator<G> > super_;
00080
00081 public:
00084 vertex_bkd_iterator();
00085 vertex_bkd_iterator(const G& g);
00087
00088 protected:
00091 util::vertex_id_t start_id_() const;
00092
00095 util::vertex_id_t next_id_() const;
00096
00097 friend class graph_iter_base<G, util::vertex<G>, vertex_bkd_iterator<G> >;
00098 };
00099
00100
00102
00103 template <typename G>
00104 class edge_fwd_iterator
00105 : public graph_iter_base<G, util::edge<G>, edge_fwd_iterator<G> >
00106 {
00107 typedef graph_iter_base<G, util::edge<G>, edge_fwd_iterator<G> > super_;
00108
00109 public:
00112 edge_fwd_iterator();
00113 edge_fwd_iterator(const G& g);
00115
00116 protected:
00119 util::edge_id_t start_id_() const;
00120
00123 util::edge_id_t next_id_() const;
00124
00125 friend class graph_iter_base<G, util::edge<G>, edge_fwd_iterator<G> >;
00126 };
00127
00128
00130
00131 template <typename G>
00132 class edge_bkd_iterator
00133 : public graph_iter_base<G, util::edge<G>, edge_bkd_iterator<G> >
00134 {
00135 typedef graph_iter_base<G, util::edge<G>, edge_bkd_iterator<G> > super_;
00136
00137 public:
00140 edge_bkd_iterator();
00141 edge_bkd_iterator(const G& g);
00143
00144 protected:
00147 util::edge_id_t start_id_() const;
00148
00151 util::edge_id_t next_id_() const;
00152
00153 friend class graph_iter_base<G, util::edge<G>, edge_bkd_iterator<G> >;
00154 };
00155
00156
00157
00158
00159 # ifndef MLN_INCLUDE_ONLY
00160
00161
00162
00163
00164
00165
00166 template <typename G>
00167 inline
00168 vertex_fwd_iterator<G>::vertex_fwd_iterator()
00169 {
00170 }
00171
00172 template <typename G>
00173 inline
00174 vertex_fwd_iterator<G>::vertex_fwd_iterator(const G& g)
00175 : super_(g)
00176 {
00177 }
00178
00179 template <typename G>
00180 inline
00181 util::vertex_id_t
00182 vertex_fwd_iterator<G>::start_id_() const
00183 {
00184 return 0;
00185 }
00186
00187 template <typename G>
00188 inline
00189 util::vertex_id_t
00190 vertex_fwd_iterator<G>::next_id_() const
00191 {
00192 return this->p_.id().value() + 1;
00193 }
00194
00195
00196
00197
00198
00199
00200
00201 template <typename G>
00202 inline
00203 vertex_bkd_iterator<G>::vertex_bkd_iterator()
00204 {
00205 }
00206
00207 template <typename G>
00208 inline
00209 vertex_bkd_iterator<G>::vertex_bkd_iterator(const G& g)
00210 : super_(g)
00211 {
00212 }
00213
00214 template <typename G>
00215 inline
00216 util::vertex_id_t
00217 vertex_bkd_iterator<G>::start_id_() const
00218 {
00219 return this->p_.graph().v_nmax() - 1;
00220 }
00221
00222 template <typename G>
00223 inline
00224 util::vertex_id_t
00225 vertex_bkd_iterator<G>::next_id_() const
00226 {
00227 return this->p_.id().value() - 1;
00228 }
00229
00230
00231
00232
00233
00234
00235
00236 template <typename G>
00237 inline
00238 edge_fwd_iterator<G>::edge_fwd_iterator()
00239 {
00240 }
00241
00242 template <typename G>
00243 inline
00244 edge_fwd_iterator<G>::edge_fwd_iterator(const G& g)
00245 : super_(g)
00246 {
00247 }
00248
00249 template <typename G>
00250 inline
00251 util::edge_id_t
00252 edge_fwd_iterator<G>::start_id_() const
00253 {
00254 return 0;
00255 }
00256
00257 template <typename G>
00258 inline
00259 util::edge_id_t
00260 edge_fwd_iterator<G>::next_id_() const
00261 {
00262 return this->p_.id().value() + 1;
00263 }
00264
00265
00266
00267
00268
00269
00270
00271 template <typename G>
00272 inline
00273 edge_bkd_iterator<G>::edge_bkd_iterator()
00274 {
00275 }
00276
00277 template <typename G>
00278 inline
00279 edge_bkd_iterator<G>::edge_bkd_iterator(const G& g)
00280 : super_(g)
00281 {
00282 }
00283
00284 template <typename G>
00285 inline
00286 util::edge_id_t
00287 edge_bkd_iterator<G>::start_id_() const
00288 {
00289 return this->p_.graph().e_nmax() - 1;
00290 }
00291
00292 template <typename G>
00293 inline
00294 util::edge_id_t
00295 edge_bkd_iterator<G>::next_id_() const
00296 {
00297 return this->p_.id().value() - 1;
00298 }
00299
00300 # endif // ! MLN_INCLUDE_ONLY
00301
00302 }
00303
00304 }
00305
00306
00307 #endif // ! MLN_UTIL_INTERNAL_GRAPH_ITER_HH