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_CORE_IMAGE_COMPLEX_NEIGHBORHOOD_PITER_HH
00027 # define MLN_CORE_IMAGE_COMPLEX_NEIGHBORHOOD_PITER_HH
00028
00031
00032 # include <mln/core/concept/neighborhood.hh>
00033 # include <mln/core/internal/site_relative_iterator_base.hh>
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044 namespace mln
00045 {
00046
00047
00048
00049
00050
00052 template <typename I, typename G, typename N>
00053 class complex_neighborhood_fwd_piter
00054 : public internal::site_relative_iterator_base< N,
00055 complex_neighborhood_fwd_piter<I, G, N> >
00056 {
00057 typedef complex_neighborhood_fwd_piter<I, G, N> self_;
00058 typedef internal::site_relative_iterator_base< N, self_ > super_;
00059
00060 public:
00062 typedef mln_psite(N) psite;
00064 typedef typename N::complex_fwd_iter iter_type;
00065
00066 public:
00069 complex_neighborhood_fwd_piter();
00070 template <typename Pref>
00071 complex_neighborhood_fwd_piter(const Neighborhood<N>& nbh,
00072 const Pref& p_ref);
00074
00076 template <typename Pref>
00077 void init_(const Neighborhood<N>& nbh, const Pref& p_ref);
00078
00082 bool is_valid_() const;
00084 void invalidate_();
00085
00087 void do_start_();
00089 void do_next_();
00090
00092 template <typename Pref>
00093 void center_at_(const Pref& c);
00094
00096 psite compute_p_() const;
00098
00101 const iter_type& iter() const;
00102 iter_type& iter();
00104
00105 private:
00107 iter_type iter_;
00108 };
00109
00110
00112 template <typename I, typename G, typename N>
00113 std::ostream&
00114 operator<<(std::ostream& ostr,
00115 const complex_neighborhood_fwd_piter<I, G, N>& p);
00116
00117
00118
00119
00120
00121
00123 template <typename I, typename G, typename N>
00124 class complex_neighborhood_bkd_piter
00125 : public internal::site_relative_iterator_base< N,
00126 complex_neighborhood_bkd_piter<I, G, N> >
00127 {
00128 typedef complex_neighborhood_bkd_piter<I, G, N> self_;
00129 typedef internal::site_relative_iterator_base< N, self_ > super_;
00130
00131 public:
00133 typedef mln_psite(N) psite;
00135 typedef typename N::complex_bkd_iter iter_type;
00136
00137 public:
00140 complex_neighborhood_bkd_piter();
00141 template <typename Pref>
00142 complex_neighborhood_bkd_piter(const Neighborhood<N>& nbh,
00143 const Pref& p_ref);
00145
00147 template <typename Pref>
00148 void init_(const Neighborhood<N>& nbh, const Pref& p_ref);
00149
00153 bool is_valid_() const;
00155 void invalidate_();
00156
00158 void do_start_();
00160 void do_next_();
00161
00163 template <typename Pref>
00164 void center_at_(const Pref& c);
00165
00167 psite compute_p_() const;
00169
00172 const iter_type& iter() const;
00173 iter_type& iter();
00175
00176 private:
00178 iter_type iter_;
00179 };
00180
00181
00183 template <typename I, typename G, typename N>
00184 std::ostream&
00185 operator<<(std::ostream& ostr,
00186 const complex_neighborhood_bkd_piter<I, G, N>& p);
00187
00188
00189
00190 # ifndef MLN_INCLUDE_ONLY
00191
00192
00193
00194
00195
00196 template <typename I, typename G, typename N>
00197 inline
00198 complex_neighborhood_fwd_piter<I, G, N>::complex_neighborhood_fwd_piter()
00199 {
00200 }
00201
00202 template <typename I, typename G, typename N>
00203 template <typename Pref>
00204 inline
00205 complex_neighborhood_fwd_piter<I, G, N>::complex_neighborhood_fwd_piter(const Neighborhood<N>& nbh,
00206 const Pref& p_ref)
00207 {
00208 init_(nbh, p_ref);
00209 }
00210
00211 template <typename I, typename G, typename N>
00212 template <typename Pref>
00213 inline
00214 void
00215 complex_neighborhood_fwd_piter<I, G, N>::init_(const Neighborhood<N>& nbh,
00216 const Pref& p_ref)
00217 {
00218 this->change_target(exact(nbh));
00219 this->center_at(p_ref);
00220 mln_postcondition(!this->is_valid());
00221 }
00222
00223 template <typename I, typename G, typename N>
00224 inline
00225 bool
00226 complex_neighborhood_fwd_piter<I, G, N>::is_valid_() const
00227 {
00228 return iter_.is_valid();
00229 }
00230
00231 template <typename I, typename G, typename N>
00232 inline
00233 void
00234 complex_neighborhood_fwd_piter<I, G, N>::invalidate_()
00235 {
00236 iter_.invalidate();
00237 }
00238
00239 template <typename I, typename G, typename N>
00240 inline
00241 void
00242 complex_neighborhood_fwd_piter<I, G, N>::do_start_()
00243 {
00244 iter_.start();
00245 }
00246
00247 template <typename I, typename G, typename N>
00248 inline
00249 void
00250 complex_neighborhood_fwd_piter<I, G, N>::do_next_()
00251 {
00252 iter_.next();
00253 }
00254
00255 template <typename I, typename G, typename N>
00256 template <typename Pref>
00257 inline
00258 void
00259 complex_neighborhood_fwd_piter<I, G, N>::center_at_(const Pref&)
00260 {
00261 iter_.center_at(this->center().face());
00262 }
00263
00264 template <typename I, typename G, typename N>
00265 inline
00266 mln_psite(N)
00267 complex_neighborhood_fwd_piter<I, G, N>::compute_p_() const
00268 {
00269 return psite(this->center().site_set(), iter_);
00270 }
00271
00272 template <typename I, typename G, typename N>
00273 inline
00274 const typename N::complex_fwd_iter&
00275 complex_neighborhood_fwd_piter<I, G, N>::iter() const
00276 {
00277 return iter_;
00278 }
00279
00280 template <typename I, typename G, typename N>
00281 inline
00282 typename N::complex_fwd_iter&
00283 complex_neighborhood_fwd_piter<I, G, N>::iter()
00284 {
00285 return iter_;
00286 }
00287
00288
00289 template <typename I, typename G, typename N>
00290 inline
00291 std::ostream&
00292 operator<<(std::ostream& ostr,
00293 const complex_neighborhood_fwd_piter<I, G, N>& p)
00294 {
00295 return ostr << p.unproxy_();
00296 }
00297
00298
00299
00300
00301
00302
00303 template <typename I, typename G, typename N>
00304 inline
00305 complex_neighborhood_bkd_piter<I, G, N>::complex_neighborhood_bkd_piter()
00306 {
00307 }
00308
00309 template <typename I, typename G, typename N>
00310 template <typename Pref>
00311 inline
00312 complex_neighborhood_bkd_piter<I, G, N>::complex_neighborhood_bkd_piter(const Neighborhood<N>& nbh,
00313 const Pref& p_ref)
00314 {
00315 init_(nbh, p_ref);
00316 }
00317
00318 template <typename I, typename G, typename N>
00319 template <typename Pref>
00320 inline
00321 void
00322 complex_neighborhood_bkd_piter<I, G, N>::init_(const Neighborhood<N>& nbh,
00323 const Pref& p_ref)
00324 {
00325 this->change_target(exact(nbh));
00326 this->center_at(p_ref);
00327 mln_postcondition(!this->is_valid());
00328 }
00329
00330 template <typename I, typename G, typename N>
00331 inline
00332 bool
00333 complex_neighborhood_bkd_piter<I, G, N>::is_valid_() const
00334 {
00335 return iter_.is_valid();
00336 }
00337
00338 template <typename I, typename G, typename N>
00339 inline
00340 void
00341 complex_neighborhood_bkd_piter<I, G, N>::invalidate_()
00342 {
00343 iter_.invalidate();
00344 }
00345
00346 template <typename I, typename G, typename N>
00347 inline
00348 void
00349 complex_neighborhood_bkd_piter<I, G, N>::do_start_()
00350 {
00351 iter_.start();
00352 }
00353
00354 template <typename I, typename G, typename N>
00355 inline
00356 void
00357 complex_neighborhood_bkd_piter<I, G, N>::do_next_()
00358 {
00359 iter_.next();
00360 }
00361
00362 template <typename I, typename G, typename N>
00363 template <typename Pref>
00364 inline
00365 void
00366 complex_neighborhood_bkd_piter<I, G, N>::center_at_(const Pref&)
00367 {
00368 iter_.center_at(this->center().face());
00369 }
00370
00371 template <typename I, typename G, typename N>
00372 inline
00373 mln_psite(N)
00374 complex_neighborhood_bkd_piter<I, G, N>::compute_p_() const
00375 {
00376 return psite(this->center().site_set(), iter_);
00377 }
00378
00379 template <typename I, typename G, typename N>
00380 inline
00381 const typename N::complex_bkd_iter&
00382 complex_neighborhood_bkd_piter<I, G, N>::iter() const
00383 {
00384 return iter_;
00385 }
00386
00387 template <typename I, typename G, typename N>
00388 inline
00389 typename N::complex_bkd_iter&
00390 complex_neighborhood_bkd_piter<I, G, N>::iter()
00391 {
00392 return iter_;
00393 }
00394
00395
00396 template <typename I, typename G, typename N>
00397 inline
00398 std::ostream&
00399 operator<<(std::ostream& ostr,
00400 const complex_neighborhood_bkd_piter<I, G, N>& p)
00401 {
00402 return ostr << p.unproxy_();
00403 }
00404
00405 # endif // ! MLN_INCLUDE_ONLY
00406
00407 }
00408
00409 #endif // ! MLN_CORE_IMAGE_COMPLEX_NEIGHBORHOOD_PITER_HH