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_GRAPH_WINDOW_IF_PITER_HH
00027 # define MLN_CORE_IMAGE_GRAPH_WINDOW_IF_PITER_HH
00028
00032
00033 # include <mln/core/internal/is_masked_impl_selector.hh>
00034 # include <mln/core/internal/site_relative_iterator_base.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040
00041 template <typename S, typename I> class p_graph_piter;
00042
00043
00044
00046 template <typename S, typename W, typename I>
00047 class graph_window_if_piter
00048 : public internal::site_relative_iterator_base< W,
00049 graph_window_if_piter<S,W,I> >,
00050 public internal::is_masked_impl_selector< S,
00051 typename W::mask_t::domain_t,
00052 graph_window_if_piter<S,W,I> >
00053 {
00054 typedef graph_window_if_piter<S,W,I> self_;
00055 typedef internal::site_relative_iterator_base<W,self_> super_;
00056
00057 public:
00060 typedef mln_result(S::fun_t) P;
00062
00065 graph_window_if_piter();
00066 template <typename Pref>
00067 graph_window_if_piter(const Window<W>& win,
00068 const Pref& p_ref);
00070
00074 bool is_valid_() const;
00076 void invalidate_();
00077
00079 void do_start_();
00081 void do_next_();
00082
00084 template <typename Pref>
00085 void center_at_(const Pref& c);
00086
00088 template <typename I2>
00089 void center_at_(const p_graph_piter<S, I2>& c);
00090
00092 const mln_graph_element(S)& element() const;
00093
00095 mln_psite(W) compute_p_() const;
00096
00101 unsigned id() const;
00103
00104 private:
00105 I iter_;
00106
00107 protected:
00109 using super_::s_;
00110 };
00111
00112
00113
00114 # ifndef MLN_INCLUDE_ONLY
00115
00116 template <typename S, typename W, typename I>
00117 inline
00118 graph_window_if_piter<S,W,I>::graph_window_if_piter()
00119 {
00120 }
00121
00122 template <typename S, typename W, typename I>
00123 template <typename Pref>
00124 inline
00125 graph_window_if_piter<S,W,I>::graph_window_if_piter(const Window<W>& win,
00126 const Pref& p_ref)
00127 {
00128 this->center_at(p_ref);
00129 this->change_target(exact(win));
00130
00131 mln_postcondition(!this->is_valid());
00132 }
00133
00134 template <typename S, typename W, typename I>
00135 inline
00136 bool
00137 graph_window_if_piter<S,W,I>::is_valid_() const
00138 {
00139 return iter_.is_valid();
00140 }
00141
00142 template <typename S, typename W, typename I>
00143 inline
00144 void
00145 graph_window_if_piter<S,W,I>::invalidate_()
00146 {
00147 iter_.invalidate();
00148 }
00149
00150 template <typename S, typename W, typename I>
00151 inline
00152 void
00153 graph_window_if_piter<S,W,I>::do_start_()
00154 {
00155 iter_.start();
00156 while (iter_.is_valid() && is_masked(this->c_->element(), iter_))
00157 iter_.next();
00158 }
00159
00160 template <typename S, typename W, typename I>
00161 inline
00162 void
00163 graph_window_if_piter<S,W,I>::do_next_()
00164 {
00165 iter_.next();
00166 while (iter_.is_valid() && is_masked(this->c_->element(), iter_))
00167 iter_.next();
00168 }
00169
00170 template <typename S, typename W, typename I>
00171 template <typename Pref>
00172 inline
00173 void
00174 graph_window_if_piter<S,W,I>::center_at_(const Pref& c)
00175 {
00176 iter_.center_at(c.p_hook_());
00177 }
00178
00179 template <typename S, typename W, typename I>
00180 template <typename I2>
00181 inline
00182 void
00183 graph_window_if_piter<S,W,I>::center_at_(const p_graph_piter<S, I2>& c)
00184 {
00185 iter_.center_at(c.hook_elt_());
00186 }
00187
00188 template <typename S, typename W, typename I>
00189 inline
00190 mln_psite(W)
00191 graph_window_if_piter<S,W,I>::compute_p_() const
00192 {
00193 return mln_psite(S)(this->center().site_set(), iter_.id());
00194 }
00195
00196 template <typename S, typename W, typename I>
00197 inline
00198 const mln_graph_element(S)&
00199 graph_window_if_piter<S,W,I>::element() const
00200 {
00201 return iter_;
00202 }
00203
00204 template <typename S, typename W, typename I>
00205 inline
00206 unsigned
00207 graph_window_if_piter<S,W,I>::id() const
00208 {
00209 return iter_.id();
00210 }
00211
00212
00213 # endif // ! MLN_INCLUDE_ONLY
00214
00215 }
00216
00217 #endif // ! MLN_CORE_IMAGE_GRAPH_WINDOW_IF_PITER_HH