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