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;
56 struct data< extension_val<I> >
58 data(I& ima,
const mln_value(I)& val_);
71 struct image_< extension_val<I> > : image_< I >
74 typedef trait::image::category::identity_morpher category;
75 typedef mln_internal_trait_image_speed_from(I) speed;
76 typedef trait::image::value_access::indirect value_access;
79 typedef trait::image::ext_domain::infinite ext_domain;
80 typedef trait::image::ext_value::single ext_value;
81 typedef trait::image::ext_io::read_write ext_io;
84 template <typename I, typename V>
87 typedef mlc_converts_to(mln_value(I), V)
keep_ext;
88 typedef mln_ch_value(I, V)
Iv;
90 typedef mlc_if(keep_ext, Iv_ext, Iv)
ret;
101 template <typename I>
103 public internal::image_identity< I, mln_domain(I),
extension_val<I> >
126 void init_(I& ima, const mln_value(I)& val);
132 template <typename P>
133 bool has(const P&
p) const;
137 mln_value(I) operator()(const mln_psite(I)&
p) const;
140 mln_morpher_lvalue(I) operator()(const mln_psite(I)&
p);
144 const mln_value(I)& extension() const;
147 void change_extension(const mln_value(I)& val);
155 template <typename I, typename J>
158 template <typename V, typename I>
164 # ifndef MLN_INCLUDE_ONLY
171 template <
typename I>
183 template <
typename I>
189 template <
typename I>
191 extension_val<I>::extension_val(I& ima,
const mln_value(I)& val)
196 template <
typename I>
201 this->data_ =
new internal::data< extension_val<I> >(ima, val);
204 template <
typename I>
205 template <
typename P>
208 extension_val<I>::has(
const P&)
const
213 template <
typename I>
216 extension_val<I>::operator()(const mln_psite(I)& p)
const
218 mln_precondition(this->is_valid());
220 if (this->data_->ima_.domain().has(p))
221 return this->data_->ima_(p);
223 return this->data_->val_;
226 template <
typename I>
228 mln_morpher_lvalue(I)
229 extension_val<I>::operator()(const mln_psite(I)& p)
231 static mln_value(I) cpy;
232 mln_precondition(this->is_valid());
234 if (this->data_->ima_.domain().has(p))
235 return this->data_->ima_(p);
239 cpy = this->data_->val_;
244 template <
typename I>
247 extension_val<I>::extension()
const
249 mln_precondition(this->is_valid());
250 return this->data_->val_;
253 template <
typename I>
256 extension_val<I>::change_extension(
const mln_value(I)& val)
258 mln_precondition(this->is_valid());
259 this->data_->val_ = val;
265 template <
typename I,
typename J>
266 void init_(tag::image_t, extension_val<I>& target,
const J& model)
271 init_(tag::extension, val, model);
272 target.
init_(ima, val);
275 template <typename V, typename I>
276 void init_(tag::extension_t, V& target, const extension_val<I>& model)
278 mlc_converts_to(mln_value(I), V)::check();
279 target =
static_cast<V
>(model.extension());
282 # endif // ! MLN_INCLUDE_ONLY
287 #endif // ! MLN_CORE_IMAGE_DMORPH_EXTENSION_VAL_HH