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;
53 struct data< safe_image<I> >
55 data(I& ima,
const mln_value(I)& default_value);
58 mln_value(I) default_value_;
68 struct image_< safe_image<I> > : image_< I >
71 typedef trait::image::category::identity_morpher category;
72 typedef mln_internal_trait_image_speed_from(I) speed;
93 safe_image(I& ima,
const mln_value(I)& default_value);
96 void init_(I& ima,
const mln_value(I)& default_value);
98 mln_rvalue(I) operator()(const mln_psite(I)& p) const;
100 mln_morpher_lvalue(I) operator()(const mln_psite(I)& p);
108 template <typename I>
110 mln_value(I) default_value = mln_value(I)());
112 template <typename I>
114 mln_value(I) default_value = mln_value(I)());
118 # ifndef MLN_INCLUDE_ONLY
125 template <
typename I>
129 default_value_(default_value)
137 template <
typename I>
139 safe_image<I>::safe_image()
143 template <
typename I>
145 safe_image<I>::safe_image(I& ima,
const mln_value(I)& default_value)
147 mln_precondition(ima.is_valid());
148 init_(ima, default_value);
151 template <
typename I>
153 safe_image<I>::safe_image(I& ima)
155 mln_precondition(ima.is_valid());
156 init_(ima, mln_value(I)());
159 template <
typename I>
162 safe_image<I>::init_(I& ima,
const mln_value(I)& default_value)
164 mln_precondition(! this->is_valid());
165 mln_precondition(ima.is_valid());
166 this->data_ =
new internal::data< safe_image<I> >(ima, default_value);
169 template <
typename I>
172 safe_image<I>::operator()(const mln_psite(I)& p)
const
174 mln_precondition(this->is_valid());
176 return this->data_->default_value_;
177 return this->data_->ima_(p);
180 template <
typename I>
182 mln_morpher_lvalue(I)
183 safe_image<I>::operator()(const mln_psite(I)& p)
185 mln_precondition(this->is_valid());
186 static mln_value(I) forget_it_;
188 return this->data_->ima_(p);
191 return forget_it_ = this->data_->default_value_;
194 template <typename I>
204 template <
typename I>
207 mln_value(I) default_value)
213 template <
typename I>
215 safe_image<const I> safe(
const Image<I>& ima,
216 mln_value(I) default_value)
218 safe_image<const I> tmp(exact(ima), default_value);
222 # endif // ! MLN_INCLUDE_ONLY
227 #endif // ! MLN_CORE_IMAGE_IMORPH_SAFE_HH