• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List

p_image.hh

00001 // Copyright (C) 2007, 2008, 2009 EPITA Research and Development Laboratory (LRDE)
00002 //
00003 // This file is part of Olena.
00004 //
00005 // Olena is free software: you can redistribute it and/or modify it under
00006 // the terms of the GNU General Public License as published by the Free
00007 // Software Foundation, version 2 of the License.
00008 //
00009 // Olena is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with Olena.  If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 // As a special exception, you may use this file as part of a free
00018 // software project without restriction.  Specifically, if other files
00019 // instantiate templates or use macros or inline functions from this
00020 // file, or you compile this file and link it with other files to produce
00021 // an executable, this file does not by itself cause the resulting
00022 // executable to be covered by the GNU General Public License.  This
00023 // exception does not however invalidate any other reasons why the
00024 // executable file might be covered by the GNU General Public License.
00025 
00026 #ifndef MLN_CORE_SITE_SET_P_IMAGE_HH
00027 # define MLN_CORE_SITE_SET_P_IMAGE_HH
00028 
00035 
00036 
00037 # include <mln/core/site_set/p_if.hh>
00038 # include <mln/fun/ops.hh>
00039 # include <mln/pw/value.hh>
00040 # include <mln/pw/cst.hh>
00041 # include <mln/data/fill_with_value.hh>
00042 
00043 
00044 
00045 namespace mln
00046 {
00047 
00048   // Forward declaration.
00049   template <typename I> class p_image;
00050 
00051 
00052   namespace trait
00053   {
00054 
00055     template <typename I>
00056     struct site_set_< p_image<I> >
00057     {
00058       typedef trait::site_set::nsites::known  nsites;
00059       typedef trait::site_set::bbox::unknown  bbox; // FIXME
00060       typedef trait::site_set::contents::free contents;
00061       typedef trait::site_set::arity::unique  arity;
00062     };
00063 
00064   } // end of namespace trait
00065 
00066 
00067   namespace internal
00068   {
00069 
00070     template <typename I>
00071     struct p_image_site_set // Hack to help g++-2.95.
00072     {
00073     private:
00074       typedef mln_domain(I) S_;
00075       typedef fun::eq_v2b_expr_< pw::value_<I>, pw::cst_<bool> > F_;
00076     public:
00077      typedef p_if<S_, F_> ret;
00078     };
00079     
00080 
00081   } // end of namespace internal
00082 
00083 
00087   template <typename I>
00088   class p_image : public internal::site_set_base_< mln_psite(I), p_image<I> >
00089   {
00090   public:
00091 
00093     typedef typename internal::p_image_site_set<I>::ret S;
00094 
00096     operator typename internal::p_image_site_set<I>::ret () const;
00097 
00098 
00100     typedef mln_psite(I) element;
00101 
00102 
00104     typedef mln_psite(I) psite;
00105 
00107     typedef mln_fwd_piter(S) fwd_piter;
00108 
00110     typedef mln_bkd_piter(S) bkd_piter;
00111 
00113     typedef mln_piter(S) piter;
00114 
00115 
00117     p_image();
00118 
00120     p_image(const I& ima);
00121 
00122 
00123 
00125     bool has(const psite&) const;
00126 
00127 
00129     bool is_valid() const;
00130 
00132     unsigned nsites() const;
00133 
00134 
00136     typedef psite i_element;
00137 
00139     void insert(const psite& p);
00140 
00142     typedef psite r_element;
00143 
00145     void remove(const psite& p);
00146 
00147 
00149     void toggle(const psite& p);
00150 
00151 
00153     std::size_t memory_size() const;
00154 
00155 
00157     void clear();
00158 
00159 
00161     const I& image_hook_() const;
00162 
00163   private:
00164 
00165     I ima_;
00166     unsigned nsites_;
00167   };
00168 
00169 
00170 # ifndef MLN_INCLUDE_ONLY
00171 
00172   template <typename I>
00173   inline
00174   p_image<I>::operator typename internal::p_image_site_set<I>::ret () const
00175   {
00176     S tmp(ima_.domain(), pw::value(ima_) == pw::cst(true));
00177     return tmp;
00178   }
00179 
00180   template <typename I>
00181   inline
00182   p_image<I>::p_image()
00183   {
00184     nsites_ = 0;
00185   }
00186 
00187   template <typename I>
00188   inline
00189   p_image<I>::p_image(const I& ima)
00190   {
00191     mln_precondition(ima.is_valid());
00192     ima_ = ima;
00193     clear();
00194   }
00195 
00196   template <typename I>
00197   inline
00198   bool
00199   p_image<I>::has(const psite& p) const
00200   {
00201     mln_precondition(is_valid());
00202     return ima_.domain().has(p) && ima_(p) == true;
00203   }
00204 
00205   template <typename I>
00206   inline
00207   bool
00208   p_image<I>::is_valid() const
00209   {
00210     return ima_.is_valid();
00211   }
00212 
00213   template <typename I>
00214   inline
00215   unsigned
00216   p_image<I>::nsites() const
00217   {
00218     return nsites_;
00219   }
00220 
00221   template <typename I>
00222   inline
00223   void
00224   p_image<I>::insert(const psite& p)
00225   {
00226     mln_precondition(is_valid());
00227     mln_precondition(ima_.domain().has(p));
00228     if (ima_(p) == true)
00229       return; // No-op.
00230     ima_(p) = true;
00231     ++nsites_;
00232   }
00233 
00234   template <typename I>
00235   inline
00236   void
00237   p_image<I>::remove(const psite& p)
00238   {
00239     mln_precondition(is_valid());
00240     mln_precondition(ima_.domain().has(p));
00241     if (ima_(p) == false)
00242       return; // No-op.
00243     ima_(p) = false;
00244     mln_assertion(nsites_ > 0);
00245     --nsites_;
00246   }
00247 
00248   template <typename I>
00249   inline
00250   void
00251   p_image<I>::toggle(const psite& p)
00252   {
00253     mln_precondition(is_valid());
00254     mln_precondition(ima_.domain().has(p));
00255     if (ima_(p) == true)
00256       {
00257         // Removal.
00258         ima_(p) = false;
00259         mln_assertion(nsites_ > 0);
00260         --nsites_;
00261       }
00262     else
00263       {
00264         // Insertion.
00265         ima_(p) = true;
00266         ++nsites_;
00267       }
00268   }
00269 
00270   template <typename I>
00271   inline
00272   std::size_t
00273   p_image<I>::memory_size() const
00274   {
00275     if (! is_valid())
00276       return sizeof(*this);
00277     return 0; // FIXME
00278   }
00279 
00280   template <typename I>
00281   inline
00282   void
00283   p_image<I>::clear()
00284   {
00285     if (! is_valid())
00286       return; // No-op.
00287     nsites_ = 0;
00288     data::fill_with_value(ima_, false);
00289   }
00290 
00291   template <typename I>
00292   inline
00293   const I&
00294   p_image<I>::image_hook_() const
00295   {
00296     mln_precondition(is_valid());
00297     return ima_;
00298   }
00299 
00300 # endif // ! MLN_INCLUDE_ONLY
00301 
00302 } // end of namespace mln
00303 
00304 
00305 #endif // ! MLN_CORE_SITE_SET_P_IMAGE_HH

Generated on Tue Oct 4 2011 15:24:16 for Milena (Olena) by  doxygen 1.7.1