26 #ifndef MLN_CORE_IMAGE_DMORPH_IMAGE_IF_HH
27 # define MLN_CORE_IMAGE_DMORPH_IMAGE_IF_HH
34 # include <mln/core/internal/image_domain_morpher.hh>
35 # include <mln/core/site_set/p_if.hh>
36 # include <mln/pw/all.hh>
37 # include <mln/convert/to_fun.hh>
44 template <
typename I,
typename F>
struct image_if;
51 template <
typename I,
typename F>
52 struct data< image_if<I,F> >
54 data(I& ima,
const F& f);
57 p_if<mln_domain(I), F> domain_;
66 template <
typename I,
typename F>
67 struct image_< image_if<I,F> > : default_image_morpher< I,
71 typedef trait::image::category::domain_morpher category;
73 typedef trait::image::ext_domain::none ext_domain;
74 typedef trait::image::ext_value::irrelevant ext_value;
75 typedef trait::image::ext_io::irrelevant ext_io;
77 typedef trait::image::vw_io::none vw_io;
78 typedef trait::image::vw_set::none vw_set;
79 typedef trait::image::value_alignment::not_aligned value_alignment;
80 typedef trait::image::value_storage::disrupted value_storage;
92 template <
typename I,
typename F>
93 struct image_if :
public internal::image_domain_morpher< I,
94 p_if<mln_domain(I), F>,
98 typedef image_if< tag::image_<I>, tag::function_<F> > skeleton;
104 image_if(I& ima,
const F& f);
106 void init_(I& ima,
const F& f);
109 const p_if<mln_domain(I), F>& domain()
const;
112 operator image_if<const I, F>()
const;
125 template <
typename I,
typename F>
127 operator | (Image<I>& ima,
const Function_v2b<F>& f);
132 template <
typename I,
typename F>
134 operator | (
const Image<I>& ima,
const Function_v2b<F>& f);
138 template <
typename I,
typename A>
139 image_if< const I, fun::C<bool(*)(A)> >
140 operator | (
const Image<I>& ima,
bool (*f)(A) );
142 template <
typename I,
typename A>
143 image_if< I, fun::C<bool(*)(A)> >
144 operator | (Image<I>& ima,
bool (*f)(A) );
148 # ifndef MLN_INCLUDE_ONLY
152 template <
typename I,
typename F>
153 void init_(tag::function_t, F& f,
const image_if<I,F>& model)
155 f = model.domain().predicate();
158 template <
typename I,
typename F,
typename J>
159 void init_(tag::image_t, image_if<I,F>& target,
const J& model)
162 init_(tag::image, ima, exact(model));
164 init_(tag::function, f, exact(model));
165 target.init_(ima, f);
173 template <
typename I,
typename F>
177 domain_(ima.domain() | f)
186 template <
typename I,
typename F>
188 image_if<I,F>::image_if()
192 template <
typename I,
typename F>
194 image_if<I,F>::image_if(I& ima,
const F& f)
199 template <
typename I,
typename F>
202 image_if<I,F>::init_(I& ima,
const F& f)
204 mln_precondition(! this->is_valid());
205 this->data_ =
new internal::data< image_if<I,F> >(ima, f);
208 template <
typename I,
typename F>
210 const p_if<mln_domain(I), F>&
211 image_if<I,F>::domain()
const
213 mln_precondition(this->is_valid());
214 return this->data_->domain_;
217 template <
typename I,
typename F>
219 image_if<I,F>::operator image_if<const I,F>()
const
221 mln_precondition(this->is_valid());
222 image_if<const I,F> tmp(this->data_->ima_,
223 this->data_->domain_.predicate());
230 template <
typename I,
typename F>
233 operator | (Image<I>& ima,
const Function_v2b<F>& f)
235 image_if<I,F> tmp(exact(ima), exact(f));
239 template <
typename I,
typename F>
242 operator | (
const Image<I>& ima,
const Function_v2b<F>& f)
244 image_if<const I, F> tmp(exact(ima), exact(f));
249 template <
typename I,
typename A>
250 image_if< const I, fun::C<bool(*)(A)> >
251 operator | (
const Image<I>& ima,
bool (*f)(A) )
256 template <
typename I,
typename A>
257 image_if< I, fun::C<bool(*)(A)> >
258 operator | (Image<I>& ima,
bool (*f)(A) )
264 # endif // ! MLN_INCLUDE_ONLY
269 #endif // ! MLN_CORE_IMAGE_DMORPH_IMAGE_IF_HH