26 #ifndef MLN_CORE_CONCEPT_WINDOW_HH
27 # define MLN_CORE_CONCEPT_WINDOW_HH
37 # include <mln/core/concept/object.hh>
38 # include <mln/core/concept/iterator.hh>
39 # include <mln/trait/windows.hh>
41 # include <mln/core/site_set/p_array.hh>
42 # include <mln/core/internal/geom_bbox.hh>
43 # include <mln/convert/from_to.hxx>
44 # include <mln/util/array.hh>
48 # define mln_is_simple_window(W) \
50 mln::metal::and_< mlc_is(mln_trait_window_size(W), \
51 mln::trait::window::size::fixed), \
52 mln::metal::and_< mlc_is(mln_trait_window_support(W), \
53 mln::trait::window::support::regular), \
54 mlc_is(mln_trait_window_definition(W), \
55 mln::trait::window::definition::unique) > >
58 # define mln_is_fastest_IW(I, W) \
60 mlc_and(mlc_is(mln_trait_image_speed(I), \
61 trait::image::speed::fastest), \
62 mln_is_simple_window(W))
70 template <
typename E>
struct Window;
71 template <
typename E>
struct Image;
78 typedef Object<void> super;
106 template <
typename Wl,
typename Wr>
110 template <
typename W>
111 std::ostream& operator<<(std::ostream& ostr, const Window<W>& win);
115 template <
typename I,
typename W>
119 template <
typename I,
typename W>
123 template <
typename I,
typename W>
135 template <
typename W,
typename I>
145 # ifndef MLN_INCLUDE_ONLY
152 template <
typename trait_size,
typename E>
153 struct window_size_check
155 static void run() { }
158 template <
typename E>
159 struct window_size_check< mln::trait::window::size::fixed, E >
163 unsigned (E::*m)()
const = & E::size;
170 template <
typename trait_support,
typename E>
171 struct window_support_check
173 static void run() { }
176 template <
typename E>
177 struct window_support_check< mln::trait::window::support::regular, E >
179 static void run_extra()
185 bool (E::*m1)() const = &E::is_centered;
187 bool (E::*m2)() const = &E::is_symmetric;
189 void (E::*m3)() = &E::sym;
191 unsigned (E::*m4)() const = &E::delta;
193 bool (E::*m5)() const = &E::is_valid;
197 static
void run(mln::trait::window::definition::unique)
199 typedef mln_dpsite(E) D;
200 const D& (E::*m1)(
unsigned) const = &E::dp;
202 bool (E::*m2)(const D&) const = &E::has;
207 static
void run(mln::trait::window::definition::n_ary)
212 static void run(mln::trait::window::definition::varying)
219 run(mln_trait_window_definition(E)());
225 template <
typename trait_definition,
typename E>
226 struct window_definition_check
228 static void run() { }
231 template <
typename E>
232 struct window_definition_check< mln::trait::window::definition::multiple, E >
236 typedef mln_element(E) W;
237 void (E::*m1)(
unsigned, const W&) = &E::set_window;
239 const W& (E::*m2)(
unsigned) const = &E::window;
241 unsigned (E::*m3)() const = &E::nwindows;
249 template <typename E>
254 mlc_not_equal( mln_trait_window_size(E), mln::trait::undef )::check();
255 mlc_not_equal( mln_trait_window_support(E), mln::trait::undef )::check();
256 mlc_not_equal( mln_trait_window_definition(E), mln::trait::undef )::check();
259 typedef mln_site(E) site;
260 typedef mln_psite(E) psite;
261 typedef mln_dpsite(E) dpsite;
262 typedef mln_qiter(E) qiter;
263 typedef mln_fwd_qiter(E) fwd_qiter;
264 typedef mln_bkd_qiter(E) bkd_qiter;
267 internal::window_size_check < mln_trait_window_size(E), E >::run();
268 internal::window_support_check < mln_trait_window_support(E), E >::run();
269 internal::window_definition_check< mln_trait_window_definition(E), E >::run();
272 template <typename Wl, typename Wr>
274 bool operator==(const Window<Wl>& lhs, const Window<Wr>& rhs)
276 return exact(lhs).std_vector() == exact(rhs).std_vector();
285 template <
typename W>
287 void print(trait::window::definition::unique,
288 std::ostream& ostr,
const W& win)
293 template <
typename W>
295 void print(trait::window::definition::multiple,
296 std::ostream& ostr,
const W& win)
299 const unsigned nw = win.nwindows();
300 for (
unsigned w = 0; w < nw; ++w)
302 ostr <<
" #" << w <<
':';
303 win.window_(w).print(ostr);
310 template <
typename W>
312 std::ostream& operator<<(std::ostream& ostr, const Window<W>& win)
314 mlc_is(mln_trait_window_support(W),
315 trait::window::support::regular)::check();
316 mlc_is_not(mln_trait_window_definition(W),
317 trait::window::definition::varying)::check();
319 internal::print(mln_trait_window_definition(W)(),
325 template <
typename I,
typename W>
328 offsets_wrt(
const Image<I>& ima_,
const Window<W>& win_)
330 mln_is_simple_window(W)::check();
332 const I& ima = exact(ima_);
333 const W& win = exact(win_);
334 mln_precondition(ima.is_valid());
335 mln_precondition(win.is_valid());
337 util::array<int> arr;
338 unsigned n = win.size();
340 for (
unsigned i = 0; i < n; ++i)
341 arr.append(ima.delta_index(win.dp(i)));
347 template <
typename I,
typename W>
350 positive_offsets_wrt(
const Image<I>& ima_,
const Window<W>& win_)
352 mln_is_simple_window(W)::check();
354 const I& ima = exact(ima_);
355 const W& win = exact(win_);
356 mln_precondition(ima.is_valid());
357 mln_precondition(win.is_valid());
359 util::array<int> arr;
360 unsigned n = win.size();
362 for (
unsigned i = 0; i < n; ++i)
364 int offset = ima.delta_index(win.dp(i));
373 template <
typename I,
typename W>
376 negative_offsets_wrt(
const Image<I>& ima_,
const Window<W>& win_)
378 mln_is_simple_window(W)::check();
380 const I& ima = exact(ima_);
381 const W& win = exact(win_);
382 mln_precondition(ima.is_valid());
383 mln_precondition(win.is_valid());
385 util::array<int> arr;
386 unsigned n = win.size();
388 for (
unsigned i = 0; i < n; ++i)
390 int offset = ima.delta_index(win.dp(i));
405 template <
typename W,
typename I>
407 from_to_(
const Window<W>& win_, Image<I>& ima_)
409 mln_is_simple_window(W)::check();
410 typedef mln_psite(I) P;
411 mlc_converts_to(mln_dpsite(W), mln_delta(P))::check();
412 mlc_equal(mln_value(I),
bool)::check();
414 const W& win = exact(win_);
415 I& ima = exact(ima_);
417 mln_precondition(win.is_valid());
418 mln_precondition(! ima.is_valid());
421 ima.init_(mln::internal::geom_bbox(win));
424 mln_piter(I) p(ima.domain());
428 unsigned n = win.size();
429 for (
unsigned i = 0; i < n; ++i)
430 ima(convert::to<P>(win.dp(i))) = true;
437 # endif // ! MLN_INCLUDE_ONLY
442 #endif // ! MLN_CORE_CONCEPT_WINDOW_HH