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_BASE_HH
00027 # define MLN_UTIL_INTERNAL_GRAPH_ITER_BASE_HH
00028
00035
00036 # include <mln/core/concept/iterator.hh>
00037 # include <mln/core/concept/proxy.hh>
00038
00039
00040 namespace mln
00041 {
00042
00043 namespace internal
00044 {
00045
00046 template <typename G, typename Elt, typename E>
00047 class graph_iter_base
00048 : public Proxy< E >,
00049 public internal::proxy_impl< const Elt&, E >
00050 {
00051 public:
00055 bool is_valid() const;
00057 void invalidate();
00058
00060 void start();
00061
00063 void next();
00064
00066 typename Elt::id_t id() const;
00067
00069 operator typename Elt::id_t() const;
00070
00073 operator typename Elt::id_value_t() const;
00074
00076 operator const Elt&() const;
00078
00080 const Elt& subj_();
00081
00083 const Elt& p_hook_() const;
00084
00085 protected:
00086 graph_iter_base(const G& g);
00087
00088 Elt p_;
00089 };
00090
00091
00092
00093 # ifndef MLN_INCLUDE_ONLY
00094
00095 template <typename G, typename Elt, typename E>
00096 inline
00097 graph_iter_base<G, Elt, E>::graph_iter_base(const G& g)
00098 : p_(Elt(g))
00099 {
00100 invalidate();
00101 }
00102
00103 template <typename G, typename Elt, typename E>
00104 inline
00105 bool
00106 graph_iter_base<G, Elt, E>::is_valid() const
00107 {
00108 return p_.is_valid();
00109 }
00110
00111 template <typename G, typename Elt, typename E>
00112 inline
00113 void
00114 graph_iter_base<G, Elt, E>::invalidate()
00115 {
00116 p_.invalidate();
00117 mln_postcondition(! is_valid());
00118 }
00119
00120 template <typename G, typename Elt, typename E>
00121 inline
00122 void
00123 graph_iter_base<G, Elt, E>::start()
00124 {
00125 p_.update_id(exact(this)->start_id_());
00126 }
00127
00128 template <typename G, typename Elt, typename E>
00129 inline
00130 void
00131 graph_iter_base<G, Elt, E>::next()
00132 {
00133 mln_precondition(is_valid());
00134 p_.update_id(exact(this)->next_id_());
00135 }
00136
00137 template <typename G, typename Elt, typename E>
00138 inline
00139 typename Elt::id_t
00140 graph_iter_base<G, Elt, E>::id() const
00141 {
00142 return p_.id();
00143 }
00144
00145 template <typename G, typename Elt, typename E>
00146 inline
00147 graph_iter_base<G, Elt, E>::operator typename Elt::id_t() const
00148 {
00149 return p_.id();
00150 }
00151
00152 template <typename G, typename Elt, typename E>
00153 inline
00154 graph_iter_base<G, Elt, E>::operator typename Elt::id_value_t() const
00155 {
00156 return p_.id();
00157 }
00158
00159 template <typename G, typename Elt, typename E>
00160 inline
00161 graph_iter_base<G, Elt, E>::operator const Elt&() const
00162 {
00163 return p_;
00164 }
00165
00166 template <typename G, typename Elt, typename E>
00167 inline
00168 const Elt&
00169 graph_iter_base<G, Elt, E>::subj_()
00170 {
00171 return p_;
00172 }
00173
00174 template <typename G, typename Elt, typename E>
00175 inline
00176 const Elt&
00177 graph_iter_base<G, Elt, E>::p_hook_() const
00178 {
00179 return p_;
00180 }
00181
00182 # endif // ! MLN_INCLUDE_ONLY
00183
00184 }
00185
00186 }
00187
00188 #endif // ! MLN_UTIL_INTERNAL_GRAPH_ITER_BASE_HH