27 #ifndef MLN_CORE_CONCEPT_WINDOW_HH
28 # define MLN_CORE_CONCEPT_WINDOW_HH
38 # include <mln/core/concept/object.hh>
39 # include <mln/core/concept/iterator.hh>
40 # include <mln/trait/windows.hh>
42 # include <mln/core/site_set/p_array.hh>
43 # include <mln/core/internal/geom_bbox.hh>
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;
112 template <
typename Wl,
typename Wr>
116 template <
typename W>
117 std::ostream& operator<<(std::ostream& ostr, const Window<W>& win);
124 template <
typename W,
typename I>
131 template <
typename I,
typename W>
137 template <
typename I,
typename W>
143 template <
typename I,
typename W>
149 # ifndef MLN_INCLUDE_ONLY
156 template <
typename trait_size,
typename E>
157 struct window_size_check
159 static void run() { }
162 template <
typename E>
163 struct window_size_check< mln::trait::window::size::fixed, E >
167 unsigned (E::*m)()
const = & E::size;
174 template <
typename trait_support,
typename E>
175 struct window_support_check
177 static void run() { }
180 template <
typename E>
181 struct window_support_check< mln::trait::window::support::regular, E >
183 static void run_extra()
189 bool (E::*m1)() const = &E::is_centered;
191 bool (E::*m2)() const = &E::is_symmetric;
193 void (E::*m3)() = &E::sym;
195 unsigned (E::*m4)() const = &E::
delta;
197 bool (E::*m5)() const = &E::is_valid;
201 static
void run(mln::trait::window::definition::unique)
203 typedef mln_dpsite(E) D;
204 const D& (E::*m1)(
unsigned) const = &E::dp;
206 bool (E::*m2)(const D&) const = &E::has;
211 static
void run(mln::trait::window::definition::n_ary)
216 static void run(mln::trait::window::definition::varying)
223 run(mln_trait_window_definition(E)());
229 template <
typename trait_definition,
typename E>
230 struct window_definition_check
232 static void run() { }
235 template <
typename E>
236 struct window_definition_check< mln::trait::window::definition::multiple, E >
240 typedef mln_element(E) W;
241 void (E::*m1)(
unsigned, const W&) = &E::set_window;
243 const W& (E::*m2)(
unsigned) const = &E::window;
245 unsigned (E::*m3)() const = &E::nwindows;
253 template <typename E>
263 typedef mln_site(E)
site;
264 typedef mln_psite(E)
psite;
265 typedef mln_dpsite(E) dpsite;
266 typedef mln_qiter(E) qiter;
267 typedef mln_fwd_qiter(E) fwd_qiter;
271 internal::window_size_check < mln_trait_window_size(E), E >::run();
272 internal::window_support_check < mln_trait_window_support(E), E >::run();
273 internal::window_definition_check< mln_trait_window_definition(E), E >::run();
276 template <typename Wl, typename Wr>
278 bool operator==(const Window<Wl>& lhs, const Window<Wr>&
rhs)
280 return exact(lhs).std_vector() ==
exact(rhs).std_vector();
289 template <
typename W>
291 void print(trait::window::definition::unique,
292 std::ostream& ostr,
const W& win)
297 template <
typename W>
299 void print(trait::window::definition::multiple,
300 std::ostream& ostr,
const W& win)
303 const unsigned nw = win.nwindows();
304 for (
unsigned w = 0; w < nw; ++w)
306 ostr <<
" #" << w <<
':';
307 win.window_(w).print(ostr);
314 template <
typename W>
316 std::ostream& operator<<(std::ostream& ostr, const Window<W>& win)
318 mlc_is(mln_trait_window_support(W),
319 trait::window::support::regular)::check();
320 mlc_is_not(mln_trait_window_definition(W),
321 trait::window::definition::varying)::check();
323 internal::print(mln_trait_window_definition(W)(),
329 template <
typename W,
typename I>
331 from_to_(
const Window<W>& win_, Image<I>& ima_)
333 mln_is_simple_window(W)::check();
334 typedef mln_psite(I) P;
335 mlc_converts_to(mln_dpsite(W), mln_delta(P))::check();
336 mlc_equal(mln_value(I),
bool)::check();
338 const W& win =
exact(win_);
339 I& ima =
exact(ima_);
341 mln_precondition(win.is_valid());
342 mln_precondition(! ima.is_valid());
348 mln_piter(I)
p(ima.domain());
352 unsigned n = win.size();
353 for (
unsigned i = 0; i < n; ++i)
354 ima(
convert::to<P>(win.dp(i))) = true;
358 template <typename I, typename W>
361 offsets_wrt(const Image<I>& ima_, const Window<W>& win_)
363 mln_is_simple_window(W)::check();
365 const I& ima =
exact(ima_);
366 const W& win =
exact(win_);
367 mln_precondition(ima.is_valid());
368 mln_precondition(win.is_valid());
370 util::array<int> arr;
371 unsigned n = win.size();
373 for (
unsigned i = 0; i < n; ++i)
374 arr.append(ima.delta_offset(win.dp(i)));
380 template <
typename I,
typename W>
383 positive_offsets_wrt(
const Image<I>& ima_,
const Window<W>& win_)
385 mln_is_simple_window(W)::check();
387 const I& ima =
exact(ima_);
388 const W& win =
exact(win_);
389 mln_precondition(ima.is_valid());
390 mln_precondition(win.is_valid());
392 util::array<int> arr;
393 unsigned n = win.size();
395 for (
unsigned i = 0; i < n; ++i)
397 int offset = ima.delta_offset(win.dp(i));
406 template <
typename I,
typename W>
409 negative_offsets_wrt(
const Image<I>& ima_,
const Window<W>& win_)
411 mln_is_simple_window(W)::check();
413 const I& ima =
exact(ima_);
414 const W& win =
exact(win_);
415 mln_precondition(ima.is_valid());
416 mln_precondition(win.is_valid());
418 util::array<int> arr;
419 unsigned n = win.size();
421 for (
unsigned i = 0; i < n; ++i)
423 int offset = ima.delta_offset(win.dp(i));
431 # endif // ! MLN_INCLUDE_ONLY
436 #endif // ! MLN_CORE_CONCEPT_WINDOW_HH