30 #ifndef MLN_GEOM_HORIZONTAL_SYMMETRY_HH
31 # define MLN_GEOM_HORIZONTAL_SYMMETRY_HH
33 # include <mln/core/concept/image.hh>
34 # include <mln/core/box_runend_piter.hh>
35 # include <mln/core/box_runstart_piter.hh>
47 horizontal_symmetry(const Image<I>& input);
50 # ifndef MLN_INCLUDE_ONLY
63 horizontal_symmetry(const Image<I>& input_)
65 const I& input = exact(input_);
66 mln_precondition(input.is_valid());
68 mln_concrete(I) output(input.domain());
70 typedef mln_site(I) P;
71 box_runstart_piter<P> pi(input.domain());
72 box_runend_piter<P> po(output.domain());
78 mln_site(I) idi = pi, ido = po;
80 for (
unsigned n = 0; n < ncols; ++n, ++idi[1], ++ido[1])
81 output(ido) = input(idi);
92 horizontal_symmetry_fastest(const Image<I>& input_)
94 const I& input = exact(input_);
95 mln_precondition(input.is_valid());
97 mln_concrete(I) output(input.domain());
99 typedef mln_site(I) P;
100 box_runstart_piter<P> pi(input.domain());
101 box_runend_piter<P> po(output.domain());
103 unsigned ncols = input.ncols();
105 typedef mln_value(I)* ptr_t;
109 const mln_value(I)* ptr_in = & input(pi);
110 ptr_t ptr_out = (& output(po)) - ncols + 1;
112 for (
unsigned n = 0; n <
ncols; ++n)
113 *ptr_out++ = *ptr_in++;
129 template <
typename I>
131 horizontal_symmetry_dispatch(
132 trait::image::value_alignment::any,
133 trait::image::value_storage::any,
134 trait::image::value_access::any,
135 const Image<I>& input)
137 return impl::generic::horizontal_symmetry(input);
141 template <
typename I>
143 horizontal_symmetry_dispatch(
144 trait::image::value_alignment::with_grid,
145 trait::image::value_storage::one_block,
146 trait::image::value_access::direct,
147 const Image<I>& input)
149 return impl::horizontal_symmetry_fastest(input);
153 template <
typename I>
155 horizontal_symmetry_dispatch(const Image<I>& input)
157 return horizontal_symmetry_dispatch(
158 mln_trait_image_value_alignment(I)(),
159 mln_trait_image_value_storage(I)(),
160 mln_trait_image_value_access(I)(),
170 template <
typename I>
172 horizontal_symmetry(const Image<I>& input_)
174 trace::entering(
"geom::horizontal_symmetry");
176 const I& input = exact(input_);
177 mln_precondition(input.is_valid());
179 mln_concrete(I) output = internal::horizontal_symmetry_dispatch(input);
181 trace::exiting("geom::horizontal_symmetry");
186 # endif // ! MLN_INCLUDE_ONLY
194 #endif // ! MLN_GEOM_HORIZONTAL_SYMMETRY_HH