31 #ifndef MLN_GEOM_HORIZONTAL_SYMMETRY_HH
32 # define MLN_GEOM_HORIZONTAL_SYMMETRY_HH
34 # include <mln/core/concept/image.hh>
35 # include <mln/core/box_runend_piter.hh>
36 # include <mln/core/box_runstart_piter.hh>
53 # ifndef MLN_INCLUDE_ONLY
68 const I& input =
exact(input_);
69 mln_precondition(input.is_valid());
71 mln_concrete(I) output(input.domain());
73 typedef mln_site(I) P;
74 box_runstart_piter<P>
pi(input.domain());
75 box_runend_piter<P> po(output.domain());
81 mln_site(I) idi = pi, ido = po;
83 for (
unsigned n = 0; n < ncols; ++n, ++idi[1], ++ido[1])
84 output(ido) = input(idi);
95 horizontal_symmetry_fastest(const Image<I>& input_)
97 const I& input =
exact(input_);
98 mln_precondition(input.is_valid());
100 mln_concrete(I) output(input.domain());
102 typedef mln_site(I) P;
103 box_runstart_piter<P> pi(input.domain());
104 box_runend_piter<P> po(output.domain());
106 unsigned ncols = input.ncols();
108 typedef mln_value(I)* ptr_t;
112 const mln_value(I)* ptr_in = & input(pi);
113 ptr_t ptr_out = (& output(po)) - ncols + 1;
115 for (
unsigned n = 0; n <
ncols; ++n)
116 *ptr_out++ = *ptr_in++;
132 template <
typename I>
134 horizontal_symmetry_dispatch(
135 trait::image::value_alignment::any,
136 trait::image::value_storage::any,
137 trait::image::value_access::any,
138 const Image<I>& input)
144 template <
typename I>
146 horizontal_symmetry_dispatch(
147 trait::image::value_alignment::with_grid,
148 trait::image::value_storage::one_block,
149 trait::image::value_access::direct,
150 const Image<I>& input)
152 return impl::horizontal_symmetry_fastest(input);
156 template <
typename I>
158 horizontal_symmetry_dispatch(const Image<I>& input)
160 return horizontal_symmetry_dispatch(
161 mln_trait_image_value_alignment(I)(),
162 mln_trait_image_value_storage(I)(),
163 mln_trait_image_value_access(I)(),
173 template <
typename I>
177 mln_trace(
"geom::horizontal_symmetry");
179 const I& input =
exact(input_);
180 mln_precondition(input.is_valid());
182 mln_concrete(I) output = internal::horizontal_symmetry_dispatch(input);
188 # endif // ! MLN_INCLUDE_ONLY
196 #endif // ! MLN_GEOM_HORIZONTAL_SYMMETRY_HH