00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_MORPHO_INTERNAL_ELEMENTARY_HH
00027 # define MLN_MORPHO_INTERNAL_ELEMENTARY_HH
00028
00033
00034 # include <mln/core/concept/image.hh>
00035 # include <mln/core/concept/neighborhood.hh>
00036 # include <mln/core/concept/accumulator.hh>
00037 # include <mln/core/concept/meta_accumulator.hh>
00038
00039
00040 namespace mln
00041 {
00042
00043 namespace morpho
00044 {
00045
00046 namespace internal
00047 {
00048
00050 template <typename A, typename I, typename N, typename O>
00051 mln_concrete(I)
00052 elementary(const I& input, const N& nbh, O oper);
00053
00054
00055 # ifndef MLN_INCLUDE_ONLY
00056
00057 namespace impl
00058 {
00059
00060
00061
00062 template <typename I, typename N, typename A, typename O>
00063 mln_concrete(I)
00064 elementary_(mln::trait::image::speed::any,
00065 const I& input, const N& nbh, A accu, O oper)
00066 {
00067 mln_concrete(I) output;
00068 initialize(output, input);
00069
00070 mln_piter(I) p(input.domain());
00071 mln_niter(N) n(nbh, p);
00072 for_all(p)
00073 {
00074 accu.take_as_init(input(p));
00075 for_all(n) if (input.has(n))
00076 accu.take(input(n));
00077 output(p) = oper(accu, input(p));
00078 }
00079
00080 return output;
00081 }
00082
00083
00084
00085 template <typename A, typename I, typename N, typename O>
00086 mln_concrete(I)
00087 elementary_selector_(const I& input, const N& nbh, O oper)
00088 {
00089 mln_accu_with(A, mln_value(I)) accu;
00090 return elementary_(mln_trait_image_speed(I)(),
00091 input, nbh,
00092 accu, oper);
00093 }
00094
00095 }
00096
00097
00098
00099
00100 template <typename A, typename I, typename N, typename O>
00101 mln_concrete(I)
00102 elementary(const I& input, const N& nbh, O oper)
00103 {
00104 return impl::elementary_selector_<A>(exact(input), exact(nbh), oper);
00105 }
00106
00107 # endif // ! MLN_INCLUDE_ONLY
00108
00109 }
00110
00111 }
00112
00113 }
00114
00115
00116 #endif // ! MLN_MORPHO_INTERNAL_ELEMENTARY_HH