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_HISTO_COMPUTE_HH
00027 # define MLN_HISTO_COMPUTE_HH
00028
00032
00033 # include <mln/core/concept/image.hh>
00034 # include <mln/histo/array.hh>
00035
00036
00037
00038 # include <mln/histo/compute.spe.hh>
00039
00040
00041 namespace mln
00042 {
00043
00044 namespace histo
00045 {
00046
00048 template <typename I>
00049 array<mln_value(I)> compute(const Image<I>& input);
00050
00051
00052 # ifndef MLN_INCLUDE_ONLY
00053
00054 namespace impl
00055 {
00056
00057 namespace generic
00058 {
00059
00060 template <typename I>
00061 inline
00062 array<mln_value(I)> compute_(const I& input)
00063 {
00064 array<mln_value(I)> h;
00065 mln_piter(I) p(input.domain());
00066 for_all(p)
00067 ++h(input(p));
00068 return h;
00069 }
00070
00071 }
00072
00073 }
00074
00075
00076 template <typename I>
00077 inline
00078 array<mln_value(I)> compute(const Image<I>& input)
00079 {
00080 trace::entering("histo::compute");
00081 mlc_equal(mln_trait_image_quant(I), mln::trait::image::quant::low)::check();
00082 mln_precondition(exact(input).is_valid());
00083
00084 array<mln_value(I)> h = impl::compute_(mln_trait_image_speed(I)(),
00085 exact(input));
00086
00087 trace::exiting("histo::compute");
00088 return h;
00089 }
00090
00091 # endif // ! MLN_INCLUDE_ONLY
00092
00093 }
00094
00095 }
00096
00097
00098 #endif // ! MLN_HISTO_COMPUTE_HH