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_SITE_SET_P_TRANSFORMED_PITER_HH
00027 # define MLN_CORE_SITE_SET_P_TRANSFORMED_PITER_HH
00028
00032
00033 # include <mln/core/internal/site_set_iterator_base.hh>
00034 # include <mln/core/site_set/p_transformed.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040
00047
00048 template <typename Pi, typename S, typename F>
00049 struct p_transformed_piter
00050 : public internal::site_set_iterator_base< p_transformed<S,F>,
00051 p_transformed_piter<Pi,S,F> >
00052 {
00054 p_transformed_piter();
00055
00057 p_transformed_piter(const p_transformed<S,F>& s);
00058
00060 bool is_valid_() const;
00061
00063 void invalidate_();
00064
00066 void start_();
00067
00069 void next_();
00070
00072 void change_target(const p_transformed<S,F>& s);
00073
00074 private:
00075 typedef p_transformed_piter<Pi,S,F> self_;
00076 typedef internal::site_set_iterator_base<p_transformed<S,F>, self_> super_;
00077
00078 protected:
00079 using super_::s_;
00080 using super_::p_;
00081
00082
00083 Pi pi_;
00084 };
00085
00086
00087
00088 # ifndef MLN_INCLUDE_ONLY
00089
00090 template <typename Pi, typename S, typename F>
00091 inline
00092 p_transformed_piter<Pi,S,F>::p_transformed_piter()
00093 {
00094 }
00095
00096 template <typename Pi, typename S, typename F>
00097 inline
00098 p_transformed_piter<Pi,S,F>::p_transformed_piter(const p_transformed<S,F>& s)
00099 {
00100 this->change_target(s);
00101 }
00102
00103 template <typename Pi, typename S, typename F>
00104 inline
00105 bool
00106 p_transformed_piter<Pi,S,F>::is_valid_() const
00107 {
00108 return pi_.is_valid();
00109 }
00110
00111 template <typename Pi, typename S, typename F>
00112 inline
00113 void
00114 p_transformed_piter<Pi,S,F>::invalidate_()
00115 {
00116 pi_.invalidate();
00117 }
00118
00119 template <typename Pi, typename S, typename F>
00120 inline
00121 void
00122 p_transformed_piter<Pi,S,F>::start_()
00123 {
00124 pi_.start();
00125 if (pi_.is_valid())
00126 p_ = s_->function()(pi_);
00127 }
00128
00129 template <typename Pi, typename S, typename F>
00130 inline
00131 void
00132 p_transformed_piter<Pi,S,F>::next_()
00133 {
00134 pi_.next();
00135 if (pi_.is_valid())
00136 p_ = s_->function()(pi_);
00137 }
00138
00139 template <typename Pi, typename S, typename F>
00140 inline
00141 void
00142 p_transformed_piter<Pi,S,F>::change_target(const p_transformed<S,F>& s)
00143 {
00144 s_ = & s;
00145
00146
00147 pi_.change_target(s.primary_set());
00148
00149 this->invalidate();
00150 }
00151
00152 # endif // ! MLN_INCLUDE_ONLY
00153
00154 }
00155
00156
00157 #endif // ! MLN_CORE_SITE_SET_P_TRANSFORMED_PITER_HH