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_SITE_SET_IMPL_HH
00027 # define MLN_CORE_INTERNAL_SITE_SET_IMPL_HH
00028 
00031 
00032 # include <mln/core/concept/site_set.hh>
00033 # include <mln/accu/shape/bbox.hh>
00034 
00035 
00036 
00037 namespace mln
00038 {
00039 
00040   namespace internal
00041   {
00042 
00045     template <typename Sc>
00046     struct site_set_impl;
00047 
00048 
00049 
00050     
00051 
00052     template <typename trait_nsites, typename Sc>
00053     struct site_set_impl__nsites
00054     {
00055     protected:
00056       template <typename T>
00057       void update_nsites_(const T&); 
00058     };
00059 
00060     template <typename Sc>
00061     struct site_set_impl__nsites< trait::site_set::nsites::known, Sc>
00062     {
00063       site_set_impl__nsites();
00064       unsigned nsites() const;
00065     protected:
00066       void update_nsites_(const mln_site(Sc)& p);
00067       template <typename S>
00068       void update_nsites_(const Site_Set<S>& s);
00069       unsigned nsites_;
00070     };
00071 
00072 
00073     
00074 
00075     template <typename trait_bbox, typename Sc>
00076     struct site_set_impl__bbox
00077     {
00078       typedef const mln::box<mln_site(Sc)>& q_box;
00079       q_box bbox() const;
00080 
00081     protected:
00082       void update_bbox_(const mln_site(Sc)& p);
00083       template <typename S>
00084       void update_bbox_(const Site_Set<S>& s);
00085 
00086       accu::shape::bbox<mln_site(Sc)> bb_;
00087     };
00088 
00089     template <typename Sc>
00090     struct site_set_impl__bbox< trait::site_set::nsites::unknown, Sc >
00091     {
00092     protected:
00093       template <typename T>
00094       void update_bbox_(const T&); 
00095     };
00096 
00097 
00098     
00099 
00100     template <typename Sc>
00101     struct site_set_impl
00102       : site_set_impl__nsites< mln_trait_site_set_nsites(Sc), Sc>,
00103         site_set_impl__bbox  < mln_trait_site_set_bbox(Sc),   Sc>
00104     {
00105     };
00106 
00107 
00108 
00109 
00110 # ifndef MLN_INCLUDE_ONLY
00111 
00112 
00113     
00114 
00115     template <typename trait_nsites, typename Sc>
00116     template <typename T>
00117     inline
00118     void
00119     site_set_impl__nsites<trait_nsites, Sc>::update_nsites_(const T&)
00120     {
00121       
00122     }
00123 
00124     template <typename Sc>
00125     inline
00126     site_set_impl__nsites<trait::site_set::nsites::known, Sc>::site_set_impl__nsites()
00127       : nsites_(0)
00128     {
00129     }
00130 
00131     template <typename Sc>
00132     inline
00133     unsigned
00134     site_set_impl__nsites<trait::site_set::nsites::known, Sc>::nsites() const
00135     {
00136       return nsites_;
00137     }
00138 
00139     template <typename Sc>
00140     inline
00141     void
00142     site_set_impl__nsites<trait::site_set::nsites::known, Sc>::update_nsites_(const mln_site(Sc)&)
00143     {
00144       ++nsites_;
00145     }
00146 
00147     template <typename Sc>
00148     template <typename S>
00149     inline
00150     void
00151     site_set_impl__nsites<trait::site_set::nsites::known, Sc>::update_nsites_(const Site_Set<S>& s)
00152     {
00153       nsites_ += exact(s).nsites();
00154     }
00155 
00156     
00157 
00158     template <typename trait_bbox, typename Sc>
00159     inline
00160     typename site_set_impl__bbox<trait_bbox, Sc>::q_box
00161     site_set_impl__bbox<trait_bbox, Sc>::bbox() const
00162     {
00163       return bb_.to_result();
00164     }
00165 
00166     template <typename trait_bbox, typename Sc>
00167     inline
00168     void
00169     site_set_impl__bbox<trait_bbox, Sc>::update_bbox_(const mln_site(Sc)& p)
00170     {
00171       bb_.take(p);
00172     }
00173 
00174     template <typename trait_bbox, typename Sc>
00175     template <typename S>
00176     inline
00177     void
00178     site_set_impl__bbox<trait_bbox, Sc>::update_bbox_(const Site_Set<S>& s)
00179     {
00180       bb_.take(exact(s).bbox());
00181     }
00182 
00183     template <typename Sc>
00184     template <typename T>
00185     inline
00186     void
00187     site_set_impl__bbox< trait::site_set::nsites::unknown, Sc >::update_bbox_(const T&)
00188     {
00189       
00190     }
00191 
00192 # endif // ! MLN_INCLUDE_ONLY
00193 
00194   } 
00195 
00196 } 
00197 
00198 
00199 #endif // ! MLN_CORE_INTERNAL_SITE_SET_IMPL_HH