27 #ifndef MLN_CORE_IMAGE_DMORPH_EXTENSION_VAL_HH
28 # define MLN_CORE_IMAGE_DMORPH_EXTENSION_VAL_HH
37 # include <mln/core/internal/image_identity.hh>
45 template <
typename I>
class extension_val;
53 struct data< extension_val<I> >
55 data(I& ima,
const mln_value(I)& val_);
68 struct image_< extension_val<I> > : image_< I >
71 typedef trait::image::category::identity_morpher category;
72 typedef mln_internal_trait_image_speed_from(I) speed;
73 typedef trait::image::value_access::indirect value_access;
76 typedef trait::image::ext_domain::infinite ext_domain;
77 typedef trait::image::ext_value::single ext_value;
78 typedef trait::image::ext_io::read_write ext_io;
81 template <typename I, typename V>
82 struct ch_value< extension_val<I>, V >
84 typedef mlc_converts_to(mln_value(I), V) keep_ext;
85 typedef mln_ch_value(I, V) Iv;
86 typedef extension_val<Iv> Iv_ext;
87 typedef mlc_if(keep_ext, Iv_ext, Iv) ret;
100 public internal::image_identity< I, mln_domain(I),
extension_val<I> >
122 void init_(I& ima, const mln_value(I)& val);
127 template <typename P>
128 bool has(const P& p) const;
132 mln_value(I) operator()(const mln_psite(I)& p) const;
135 mln_morpher_lvalue(I) operator()(const mln_psite(I)& p);
139 const mln_value(I)& extension() const;
142 void change_extension(const mln_value(I)& val);
148 template <typename I, typename J>
149 void init_(tag::image_t,
extension_val<I>& target, const J& model);
151 template <typename V, typename I>
152 void init_(tag::extension_t, V& target, const
extension_val<I>& model);
156 # ifndef MLN_INCLUDE_ONLY
163 template <
typename I>
175 template <
typename I>
181 template <
typename I>
188 template <
typename I>
193 this->data_ =
new internal::data< extension_val<I> >(ima, val);
196 template <
typename I>
197 template <
typename P>
205 template <
typename I>
210 mln_precondition(this->is_valid());
212 if (this->data_->ima_.domain().has(p))
213 return this->data_->ima_(p);
215 return this->data_->val_;
218 template <
typename I>
220 mln_morpher_lvalue(I)
223 static mln_value(I) cpy;
224 mln_precondition(this->is_valid());
226 if (this->data_->ima_.domain().has(p))
227 return this->data_->ima_(p);
231 cpy = this->data_->val_;
236 template <
typename I>
241 mln_precondition(this->is_valid());
242 return this->data_->val_;
245 template <
typename I>
250 mln_precondition(this->is_valid());
251 this->data_->val_ = val;
257 template <
typename I,
typename J>
261 init_(tag::image, ima, model);
263 init_(tag::extension, val, model);
264 target.init_(ima, val);
267 template <typename V, typename I>
268 void init_(tag::extension_t, V& target, const
extension_val<I>& model)
270 mlc_converts_to(mln_value(I), V)::check();
271 target =
static_cast<V
>(model.extension());
274 # endif // ! MLN_INCLUDE_ONLY
279 #endif // ! MLN_CORE_IMAGE_DMORPH_EXTENSION_VAL_HH