27 #ifndef MLN_CORE_IMAGE_IMORPH_SAFE_HH
28 # define MLN_CORE_IMAGE_IMORPH_SAFE_HH
37 # include <mln/core/internal/image_identity.hh>
45 template <
typename I>
class safe_image;
55 struct data< safe_image<I> >
57 data(I& ima,
const mln_value(I)& default_value);
60 mln_value(I) default_value_;
70 struct image_< safe_image<I> > : image_< I >
73 typedef trait::image::category::identity_morpher category;
74 typedef mln_internal_trait_image_speed_from(I) speed;
95 safe_image(I& ima,
const mln_value(I)& default_value);
99 void init_(I& ima,
const mln_value(I)& default_value);
102 mln_rvalue(I) operator()(const mln_psite(I)&
p) const;
104 mln_morpher_lvalue(I) operator()(const mln_psite(I)&
p);
112 template <typename I>
114 mln_value(I) default_value = mln_value(I)());
116 template <typename I>
118 mln_value(I) default_value = mln_value(I)());
122 # ifndef MLN_INCLUDE_ONLY
129 template <
typename I>
133 default_value_(default_value)
141 template <
typename I>
143 safe_image<I>::safe_image()
147 template <
typename I>
149 safe_image<I>::safe_image(I& ima,
const mln_value(I)& default_value)
151 mln_precondition(ima.is_valid());
152 init_(ima, default_value);
155 template <
typename I>
157 safe_image<I>::safe_image(I& ima)
159 mln_precondition(ima.is_valid());
160 init_(ima, mln_value(I)());
163 template <
typename I>
166 safe_image<I>::init_(I& ima,
const mln_value(I)& default_value)
168 mln_precondition(! this->is_valid());
169 mln_precondition(ima.is_valid());
170 this->data_ =
new internal::data< safe_image<I> >(ima, default_value);
173 template <
typename I>
176 safe_image<I>::operator()(const mln_psite(I)& p)
const
178 mln_precondition(this->is_valid());
180 return this->data_->default_value_;
181 return this->data_->ima_(p);
184 template <
typename I>
186 mln_morpher_lvalue(I)
187 safe_image<I>::operator()(const mln_psite(I)& p)
189 mln_precondition(this->is_valid());
190 static mln_value(I) forget_it_;
192 return this->data_->ima_(p);
195 return forget_it_ = this->data_->default_value_;
198 template <typename I>
200 safe_image<I>::operator safe_image<const I>()
const
202 safe_image<const I> tmp(this->data_->ima_, this->data_->default_value_);
208 template <
typename I>
210 safe_image<I>
safe(Image<I>& ima,
211 mln_value(I) default_value)
213 safe_image<I> tmp(
exact(ima), default_value);
217 template <
typename I>
219 safe_image<const I>
safe(
const Image<I>& ima,
220 mln_value(I) default_value)
222 safe_image<const I> tmp(
exact(ima), default_value);
226 # endif // ! MLN_INCLUDE_ONLY
231 #endif // ! MLN_CORE_IMAGE_IMORPH_SAFE_HH