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
00027
00028 #ifndef OLENA_MORPHO_STAT_HH
00029 # define OLENA_MORPHO_STAT_HH
00030
00031 # include <oln/basics.hh>
00032 # include <ntg/bin.hh>
00033
00034 namespace oln {
00035
00036 namespace morpho {
00037
00038 namespace internal {
00039
00050 template <class I, class E, class V =oln_value_type(I)>
00051 struct stat_
00052 {
00063 static V
00064 max(const I& input, const oln_point_type(I)& p, const E& se)
00065 {
00066 mlc::eq<I::dim, E::dim>::ensure();
00067
00068 oln_iter_type(E) dp(se);
00069 dp = begin;
00070 V val = input[p + dp];
00071 for_all_remaining (dp)
00072 if (val < input[p + dp])
00073 val = input[p + dp];
00074 return val;
00075 }
00076
00087 static V
00088 min(const I& input, const oln_point_type(I)& p, const E& se)
00089 {
00090 mlc::eq<I::dim, E::dim>::ensure();
00091 oln_iter_type(E) dp(se);
00092 dp = begin;
00093 V val = input[p + dp];
00094 for_all_remaining (dp)
00095 if (val > input[p + dp])
00096 val = input[p + dp];
00097 return val;
00098 }
00099
00100 };
00101
00102
00103
00104 template <class I, class E>
00105 struct stat_<I, E, ntg::bin>
00106 {
00107 static ntg::bin
00108 max(const I& input, const oln_point_type(I)& p, const E& se)
00109 {
00110 mlc::eq<I::dim, E::dim>::ensure();
00111 oln_iter_type(E) dp(se);
00112 for_all (dp)
00113 if (input[p + dp] == true)
00114 return true;
00115 return false;
00116 }
00117
00118 static ntg::bin
00119 min(const I& input, const oln_point_type(I)& p, const E& se)
00120 {
00121 mlc::eq<I::dim, E::dim>::ensure();
00122 oln_iter_type(E) dp(se);
00123 for_all (dp)
00124 if (input[p + dp] == false)
00125 return false;
00126 return true;
00127 }
00128
00129 };
00130
00131 }
00132
00146 template<class I, class E>
00147 oln_value_type(I)
00148 max(const abstract::non_vectorial_image<I>& input,
00149 const mlc_exact_type(I)::point_type& p,
00150 const abstract::struct_elt<E>& se)
00151 {
00152 mlc::eq<I::dim, E::dim>::ensure();
00153 return internal::stat_<I, E>::max(input.exact(), p, se.exact());
00154 }
00155
00168 template<class I, class E>
00169 oln_value_type(I)
00170 min(const abstract::non_vectorial_image<I>& input,
00171 const mlc_exact_type(I)::point_type& p,
00172
00173 const abstract::struct_elt<E>& se)
00174 {
00175 mlc::eq<I::dim, E::dim>::ensure();
00176 return internal::stat_<I, E>::min(input.exact(), p, se.exact());
00177 }
00178
00179 }
00180
00181 }
00182
00183
00184 #endif // ! OLENA_MORPHO_STAT_HH