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_DPSITES_PITER_HH
00028 # define MLN_CORE_DPSITES_PITER_HH
00029
00034
00035 # include <vector>
00036 # include <mln/core/internal/site_relative_iterator_base.hh>
00037
00038
00039 namespace mln
00040 {
00041
00047 template <typename V>
00048 class dpsites_fwd_piter
00049 : public internal::site_relative_iterator_base< V, dpsites_fwd_piter<V> >
00050 {
00051 public:
00052
00057 template <typename P>
00058 dpsites_fwd_piter(const V& v, const P& c);
00059
00061 template <typename P>
00062 void init_(const V& v, const P& c);
00063
00065 dpsites_fwd_piter();
00066
00068 bool is_valid_() const;
00069
00071 void invalidate_();
00072
00074 void do_start_();
00075
00077 void do_next_();
00078
00080 mln_psite(V) compute_p_() const;
00081
00082 protected:
00083
00084 unsigned i_;
00085 };
00086
00087
00093 template <typename V>
00094 class dpsites_bkd_piter :
00095 public internal::site_relative_iterator_base< V, dpsites_bkd_piter<V> >
00096 {
00097 public:
00098
00103 template <typename P>
00104 dpsites_bkd_piter(const V& v, const P& c);
00105
00107 dpsites_bkd_piter();
00108
00110 template <typename P>
00111 void init_(const V& v, const P& c);
00112
00114 bool is_valid_() const;
00115
00117 void invalidate_();
00118
00120 void do_start_();
00121
00123 void do_next_();
00124
00126 mln_psite(V) compute_p_() const;
00127
00128 protected:
00129
00130 int i_;
00131 };
00132
00133
00134
00135 # ifndef MLN_INCLUDE_ONLY
00136
00137
00138
00139
00140 template <typename V>
00141 inline
00142 dpsites_fwd_piter<V>::dpsites_fwd_piter()
00143 {
00144 }
00145
00146 template <typename V>
00147 template <typename P>
00148 inline
00149 dpsites_fwd_piter<V>::dpsites_fwd_piter(const V& v, const P& c)
00150 {
00151 init_(v, c);
00152 }
00153
00154 template <typename V>
00155 template <typename P>
00156 inline
00157 void
00158 dpsites_fwd_piter<V>::init_(const V& v, const P& c)
00159 {
00160 this->change_target(v);
00161 this->center_at(c);
00162 }
00163
00164
00165 template <typename V>
00166 inline
00167 bool
00168 dpsites_fwd_piter<V>::is_valid_() const
00169 {
00170 return i_ != this->s_->std_vector().size();
00171 }
00172
00173 template <typename V>
00174 inline
00175 void
00176 dpsites_fwd_piter<V>::invalidate_()
00177 {
00178 i_ = this->s_->std_vector().size();
00179 }
00180
00181 template <typename V>
00182 inline
00183 void
00184 dpsites_fwd_piter<V>::do_start_()
00185 {
00186 i_ = 0;
00187 }
00188
00189 template <typename V>
00190 inline
00191 void
00192 dpsites_fwd_piter<V>::do_next_()
00193 {
00194 ++i_;
00195 }
00196
00197 template <typename V>
00198 inline
00199 mln_psite(V)
00200 dpsites_fwd_piter<V>::compute_p_() const
00201 {
00202 return *this->c_ + this->s_->std_vector()[i_];
00203 }
00204
00205
00206
00207
00208 template <typename V>
00209 inline
00210 dpsites_bkd_piter<V>::dpsites_bkd_piter()
00211 {
00212 }
00213
00214 template <typename V>
00215 template <typename P>
00216 inline
00217 dpsites_bkd_piter<V>::dpsites_bkd_piter(const V& v, const P& c)
00218 {
00219 init_(v, c);
00220 }
00221
00222 template <typename V>
00223 template <typename P>
00224 inline
00225 void
00226 dpsites_bkd_piter<V>::init_(const V& v, const P& c)
00227 {
00228 this->change_target(v);
00229 this->center_at(c);
00230 }
00231
00232
00233 template <typename V>
00234 inline
00235 bool
00236 dpsites_bkd_piter<V>::is_valid_() const
00237 {
00238 return i_ != -1;
00239 }
00240
00241 template <typename V>
00242 inline
00243 void
00244 dpsites_bkd_piter<V>::invalidate_()
00245 {
00246 i_ = -1;
00247 }
00248
00249 template <typename V>
00250 inline
00251 void
00252 dpsites_bkd_piter<V>::do_start_()
00253 {
00254 i_ = this->s_->std_vector().size() - 1;
00255 }
00256
00257 template <typename V>
00258 inline
00259 void
00260 dpsites_bkd_piter<V>::do_next_()
00261 {
00262 --i_;
00263 }
00264
00265 template <typename V>
00266 inline
00267 mln_psite(V)
00268 dpsites_bkd_piter<V>::compute_p_() const
00269 {
00270 return *this->c_ + this->s_->std_vector()[i_];
00271 }
00272
00273 # endif // ! MLN_INCLUDE_ONLY
00274
00275 }
00276
00277
00278 #endif // ! MLN_CORE_DPSITES_PITER_HH