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_CENTERED_HH
00027 # define MLN_CORE_SITE_SET_P_CENTERED_HH
00028 
00036 
00037 
00038 # include <mln/core/internal/site_set_base.hh>
00039 # include <mln/core/internal/site_set_iterator_base.hh>
00040 
00041 
00042 namespace mln
00043 {
00044 
00045   
00046   template <typename W> class p_centered;
00047   template <typename W> class p_centered_piter;
00048 
00049 
00050   namespace trait
00051   {
00052 
00053     template <typename W>
00054     struct site_set_< p_centered<W> >
00055     {
00056       typedef trait::site_set::nsites::unknown nsites;
00057       typedef trait::site_set::bbox::unknown   bbox;
00058       typedef trait::site_set::contents::fixed contents;
00059       typedef trait::site_set::arity::unique   arity;
00060     };
00061 
00062 
00063 
00064 
00065 
00066 
00067 
00068 
00069   } 
00070 
00071 
00075   
00076   template <typename W>
00077   class p_centered : public internal::site_set_base_< mln_psite(W), p_centered<W> >,
00078                      private mlc_is_a(W, Window)::check_t
00079   {
00080   public:
00081 
00083     typedef mln_psite(W) psite;
00084 
00086     typedef mln_site(W) site;
00087 
00088 
00090     typedef psite element;
00091 
00092 
00094     typedef p_centered_piter<W> fwd_piter;
00095 
00097     typedef p_centered_piter<W> bkd_piter; 
00098 
00100     typedef fwd_piter piter;
00101 
00102 
00104     p_centered();
00105 
00107     p_centered(const W& win, const mln_psite(W)& c);
00108 
00109 
00111     template <typename P>
00112     bool has(const P& p) const;
00113 
00115     bool is_valid() const;
00116 
00118     std::size_t memory_size() const;
00119 
00121     const mln_psite(W)& center() const;
00122 
00124     const W& window() const;
00125 
00126   protected:
00127 
00128     W win_;
00129     mln_psite(W) c_;
00130   };
00131 
00132 
00133   template <typename W>
00134   class p_centered_piter : public internal::site_set_iterator_base< p_centered<W>,
00135                                                                     p_centered_piter<W> >
00136   {
00137     typedef p_centered_piter<W> self_;
00138     typedef internal::site_set_iterator_base< p_centered<W>, self_ > super_;
00139   public:
00140 
00142     p_centered_piter();
00143 
00145     p_centered_piter(const p_centered<W>& s);
00146 
00148     bool is_valid_() const;
00149 
00151     void invalidate_();
00152 
00154     void start_();
00155 
00157     void next_();
00158 
00159   protected:
00160     using super_::p_;
00161     using super_::s_;
00162 
00163     mln_fwd_qiter(W) q_;
00164   };
00165 
00166 
00167 
00168 # ifndef MLN_INCLUDE_ONLY
00169 
00170   
00171 
00172   template <typename W>
00173   inline
00174   bool
00175   p_centered<W>::is_valid() const
00176   {
00177     return true; 
00178   }
00179 
00180   template <typename W>
00181   inline
00182   p_centered<W>::p_centered()
00183   {
00184   }
00185 
00186   template <typename W>
00187   inline
00188   p_centered<W>::p_centered(const W& win, const mln_psite(W)& c)
00189     : win_(win),
00190       c_(c)
00191   {
00192     mln_precondition(is_valid());
00193   }
00194 
00195   template <typename W>
00196   template <typename P>
00197   inline
00198   bool
00199   p_centered<W>::has(const P&) const
00200   {
00201     mln_precondition(is_valid());
00202     return true; 
00203   }
00204 
00205   template <typename W>
00206   inline
00207   std::size_t
00208   p_centered<W>::memory_size() const
00209   {
00210     return sizeof(*this);
00211   }
00212 
00213   template <typename W>
00214   inline
00215   const mln_psite(W)&
00216   p_centered<W>::center() const
00217   {
00218     return c_;
00219   }
00220 
00221   template <typename W>
00222   inline
00223   const W&
00224   p_centered<W>::window() const
00225   {
00226     return win_;
00227   }
00228 
00229 
00230 
00231 
00232 
00233 
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242 
00243 
00244 
00245   
00246 
00247   template <typename W>
00248   inline
00249   p_centered_piter<W>::p_centered_piter()
00250   {
00251   }
00252 
00253   template <typename W>
00254   inline
00255   p_centered_piter<W>::p_centered_piter(const p_centered<W>& s)
00256   {
00257     this->change_target(s);
00258     q_.center_at(s.center());
00259     q_.change_target(s.window_());
00260   }
00261 
00262   template <typename W>
00263   inline
00264   bool
00265   p_centered_piter<W>::is_valid_() const
00266   {
00267     return q_.is_valid();
00268   }
00269 
00270   template <typename W>
00271   inline
00272   void
00273   p_centered_piter<W>::invalidate_()
00274   {
00275     q_.invalidate();
00276   }
00277 
00278   template <typename W>
00279   inline
00280   void
00281   p_centered_piter<W>::start_()
00282   {
00283     q_.start();
00284     if (is_valid_())
00285       p_ = q_;
00286   }
00287 
00288   template <typename W>
00289   inline
00290   void
00291   p_centered_piter<W>::next_()
00292   {
00293     q_.next();
00294     if (is_valid_())
00295       p_ = q_;
00296   }
00297 
00298 # endif // ! MLN_INCLUDE_ONLY
00299 
00300 } 
00301 
00302 
00303 #endif // ! MLN_CORE_SITE_SET_P_CENTERED_HH