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_INTERNAL_P_COMPLEX_PITER_BASE_HH
00027 # define MLN_CORE_INTERNAL_P_COMPLEX_PITER_BASE_HH
00028
00032
00033 # include <mln/core/internal/site_set_iterator_base.hh>
00034
00035
00036
00037
00038
00039
00040 namespace mln
00041 {
00042
00043 namespace internal
00044 {
00045
00046
00047
00048
00049
00050
00051
00058 template <typename I, typename S, typename P, typename E>
00059 class p_complex_piter_base_
00060 : public internal::site_set_iterator_base< S, E >
00061 {
00062 typedef p_complex_piter_base_< I, S, P, E > self_;
00063 typedef internal::site_set_iterator_base< S, E > super_;
00064
00066 typedef I iter;
00067
00068 public:
00071 p_complex_piter_base_();
00072 p_complex_piter_base_(const S& pc);
00074
00077 public:
00079 bool is_valid_() const;
00081 void invalidate_();
00082
00084 void start_();
00086 void next_();
00087
00088 private:
00090 void update_();
00092
00093 protected:
00095 using super_::p_;
00097 iter iter_;
00098 };
00099
00100
00102 template <typename I, typename S, typename P, typename E>
00103 inline
00104 std::ostream&
00105 operator<<(std::ostream& ostr, const p_complex_piter_base_<I, S, P, E>& p);
00106
00107
00108
00109 # ifndef MLN_INCLUDE_ONLY
00110
00111
00112
00113
00114
00115 template <typename I, typename S, typename P, typename E>
00116 inline
00117 p_complex_piter_base_<I, S, P, E>::p_complex_piter_base_()
00118 {
00119 mln_postcondition(!this->is_valid());
00120 }
00121
00122 template <typename I, typename S, typename P, typename E>
00123 inline
00124 p_complex_piter_base_<I, S, P, E>::p_complex_piter_base_(const S& pc)
00125 {
00126 this->change_target(pc);
00127 iter_.set_cplx(pc.cplx());
00128 mln_postcondition(!this->is_valid());
00129 }
00130
00131 template <typename I, typename S, typename P, typename E>
00132 inline
00133 bool
00134 p_complex_piter_base_<I, S, P, E>::is_valid_() const
00135 {
00136 return iter_.is_valid();
00137 }
00138
00139 template <typename I, typename S, typename P, typename E>
00140 inline
00141 void
00142 p_complex_piter_base_<I, S, P, E>::invalidate_()
00143 {
00144 iter_.invalidate();
00145 }
00146
00147 template <typename I, typename S, typename P, typename E>
00148 inline
00149 void
00150 p_complex_piter_base_<I, S, P, E>::start_()
00151 {
00152 iter_.start();
00153 if (this->is_valid())
00154 update_();
00155 }
00156
00157 template <typename I, typename S, typename P, typename E>
00158 inline
00159 void
00160 p_complex_piter_base_<I, S, P, E>::next_()
00161 {
00162 iter_.next_();
00163 if (this->is_valid())
00164 update_();
00165 }
00166
00167 template <typename I, typename S, typename P, typename E>
00168 inline
00169 void
00170 p_complex_piter_base_<I, S, P, E>::update_()
00171 {
00172 mln_precondition(this->is_valid());
00173
00174 typedef mln_psite(S) psite;
00175 p_ = psite(exact(this)->site_set(), iter_);
00176 }
00177
00178
00179 template <typename I, typename S, typename P, typename E>
00180 inline
00181 std::ostream&
00182 operator<<(std::ostream& ostr, const p_complex_piter_base_<I, S, P, E>& p)
00183 {
00184 return ostr << p.unproxy_();
00185 }
00186
00187 # endif // ! MLN_INCLUDE_ONLY
00188
00189 }
00190
00191 }
00192
00193
00194 #endif // ! MLN_CORE_INTERNAL_P_COMPLEX_PITER_BASE_HH