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_IMAGE_COMPLEX_IMAGE_HH
00027 # define MLN_CORE_IMAGE_COMPLEX_IMAGE_HH
00028
00032
00033 # include <vector>
00034
00035 # include <mln/trait/images.hh>
00036
00037 # include <mln/core/internal/image_primary.hh>
00038 # include <mln/metal/vec.hh>
00039 # include <mln/core/site_set/p_complex.hh>
00040 # include <mln/core/site_set/complex_psite.hh>
00041 # include <mln/value/set.hh>
00042
00043
00044
00045
00046
00047
00048
00049 namespace mln
00050 {
00051
00052
00053 template <unsigned D, typename G, typename V> class complex_image;
00054
00055 namespace internal
00056 {
00057
00059 template <unsigned D, typename G, typename V>
00060 struct data< complex_image<D, G, V> >
00061 {
00062 data(const p_complex<D, G>& pc,
00063 const metal::vec< D + 1, std::vector<V> >& values);
00064
00065 metal::vec< D + 1, std::vector<V> > values_;
00066 const p_complex<D, G> pc_;
00067 };
00068
00069 }
00070
00071
00072 namespace trait
00073 {
00074
00075 template <unsigned D, typename G, typename V>
00076 struct image_< complex_image<D, G, V> >
00077 : default_image_< V, complex_image<D, G, V> >
00078 {
00079 typedef trait::image::category::primary category;
00080
00081
00082 typedef trait::image::speed::fast speed;
00083 typedef trait::image::size::regular size;
00084
00085
00086 typedef trait::image::value_access::direct value_access;
00087
00088
00089
00090 typedef trait::image::vw_io::none vw_io;
00091 typedef trait::image::vw_set::none vw_set;
00092 typedef trait::image::value_storage::disrupted value_storage;
00093 typedef trait::image::value_browsing::site_wise_only value_browsing;
00094 typedef trait::image::value_alignment::irrelevant value_alignment;
00095 typedef trait::image::value_io::read_write value_io;
00096
00097
00098 typedef trait::image::pw_io::read_write pw_io;
00099 typedef trait::image::localization::space localization;
00100
00101
00102
00103
00104 typedef typename trait::image::dimension::none dimension;
00105
00106
00107 typedef trait::image::ext_domain::none ext_domain;
00108 typedef trait::image::ext_value::irrelevant ext_value;
00109 typedef trait::image::ext_io::irrelevant ext_io;
00110 };
00111
00112 }
00113
00114
00124 template <unsigned D, typename G, typename V>
00125 class complex_image
00126 : public internal::image_primary< V, p_complex<D, G>,
00127 complex_image<D, G, V> >
00128 {
00129 public:
00131 static const unsigned dim = D;
00133 typedef G geom;
00135 typedef V value;
00136
00143 typedef typename std::vector<V>::reference lvalue;
00144
00146 typedef typename std::vector<V>::const_reference rvalue;
00147
00149 typedef complex_image< D, tag::psite_<G>, tag::value_<V> > skeleton;
00150
00151 public:
00154 complex_image();
00155 complex_image(const p_complex<D, G>& pc);
00156 complex_image(const p_complex<D, G>& pc,
00157 const metal::vec< D + 1, std::vector<V> >& values);
00159
00161 void init_(const p_complex<D, G>& pc,
00162 const metal::vec< D + 1, std::vector<V> >& values);
00163
00165 rvalue operator()(const complex_psite<D, G>& p) const;
00167 lvalue operator()(const complex_psite<D, G>& p);
00168
00172 const p_complex<D, G>& domain() const;
00173
00175 const metal::vec<D + 1, std::vector<V> >& values() const;
00177 };
00178
00179
00180 template <unsigned D, typename G, typename V, typename W>
00181 void init_(tag::image_t,
00182 complex_image<D, G, V>& target,
00183 const complex_image<D, G, W>& model);
00184
00185
00186 # ifndef MLN_INCLUDE_ONLY
00187
00188
00189
00190
00191
00192 template <unsigned D, typename G, typename V, typename W>
00193 inline
00194 void init_(tag::image_t,
00195 complex_image<D, G, V>& target,
00196 const complex_image<D, G, W>& model)
00197 {
00198 metal::vec<D + 1, std::vector<V> > values;
00199 for (unsigned i = 0; i <= D; ++i)
00200 values[i].resize(model.values()[i].size());
00201 target.init_(model.domain(), values);
00202 }
00203
00204
00205
00206
00207
00208 namespace internal
00209 {
00210 template <unsigned D, typename G, typename V>
00211 inline
00212 data< complex_image<D, G, V> >::data(const p_complex<D, G>& pc,
00213 const metal::vec< D + 1, std::vector<V> >& values)
00214 : values_(values),
00215 pc_(pc)
00216 {
00217
00218
00219
00220 # ifndef NDEBUG
00221 for (unsigned i = 0; i < D; ++i)
00222 mln_precondition(pc.cplx().nfaces_of_dim(i) == values[i].size());
00223 # endif // !NDEBUG
00224 }
00225
00226 }
00227
00228
00229
00230
00231
00232 template <unsigned D, typename G, typename V>
00233 inline
00234 complex_image<D, G, V>::complex_image()
00235 {
00236 }
00237
00238 template <unsigned D, typename G, typename V>
00239 inline
00240 complex_image<D, G, V>::complex_image(const p_complex<D, G>& pc)
00241 {
00242 metal::vec<D + 1, std::vector<V> > values;
00243 for (unsigned i = 0; i <= D; ++i)
00244 values[i].resize(pc.cplx().nfaces_of_dim(i));
00245 init_(pc, values);
00246 }
00247
00248 template <unsigned D, typename G, typename V>
00249 inline
00250 complex_image<D, G, V>::complex_image(const p_complex<D, G>& pc,
00251 const metal::vec< D + 1,
00252 std::vector<V> >& values)
00253 {
00254 init_(pc, values);
00255 }
00256
00257 template <unsigned D, typename G, typename V>
00258 inline
00259 void
00260 complex_image<D, G, V>::init_(const p_complex<D, G>& pc,
00261 const metal::vec< D + 1, std::vector<V> >& values)
00262 {
00263 mln_precondition(! this->is_valid());
00264 this->data_ =
00265 new internal::data< complex_image<D, G, V> >(pc, values);
00266 }
00267
00268
00269
00270
00271
00272 template <unsigned D, typename G, typename V>
00273 inline
00274 typename complex_image<D, G, V>::rvalue
00275 complex_image<D, G, V>::operator()(const complex_psite<D, G>& p) const
00276 {
00277 mln_precondition(this->data_->pc_.has(p));
00278 return this->data_->values_[p.n()][p.face_id()];
00279 }
00280
00281 template <unsigned D, typename G, typename V>
00282 inline
00283 typename complex_image<D, G, V>::lvalue
00284 complex_image<D, G, V>::operator()(const complex_psite<D, G>& p)
00285 {
00286 mln_precondition(this->data_->pc_.has(p));
00287 return this->data_->values_[p.n()][p.face_id()];
00288 }
00289
00290 template <unsigned D, typename G, typename V>
00291 inline
00292 const metal::vec< D + 1, std::vector<V> >&
00293 complex_image<D, G, V>::values() const
00294 {
00295 return this->data_->values_;
00296 }
00297
00298 template <unsigned D, typename G, typename V>
00299 inline
00300 const p_complex<D, G>&
00301 complex_image<D, G, V>::domain() const
00302 {
00303 mln_precondition(this->is_valid());
00304 return this->data_->pc_;
00305 }
00306
00307 # endif // ! MLN_INCLUDE_ONLY
00308
00309 }
00310
00311
00312 #endif // ! MLN_CORE_IMAGE_COMPLEX_IMAGE_HH