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_UTIL_LEMMINGS_HH
00027 # define MLN_UTIL_LEMMINGS_HH
00028
00032
00033 # include <mln/core/concept/image.hh>
00034
00035
00036 namespace mln
00037 {
00038
00039 namespace util
00040 {
00041
00045 template <typename I>
00046 struct lemmings_ : public Object< lemmings_<I> >
00047 {
00048 lemmings_(const Image<I>& ima, const mln_psite(I)& pt,
00049 const mln_deduce(I, psite, delta)& dpt, const mln_value(I)& val);
00050
00051 mln_psite(I) operator()();
00052
00053 const I& ima_;
00054 mln_psite(I) pt_;
00055 const mln_deduce(I, psite, delta)& dpt_;
00056 const mln_value(I)& val_;
00057 };
00058
00072 template <typename I>
00073 mln_psite(I)
00074 lemmings(const Image<I>& ima, const mln_psite(I)& pt,
00075 const mln_deduce(I, psite, delta)& dpt, const mln_value(I)& val);
00076
00077
00078 # ifndef MLN_INCLUDE_ONLY
00079
00080
00081
00082 template <typename I>
00083 inline
00084 lemmings_<I>::lemmings_(const Image<I>& ima, const mln_psite(I)& pt,
00085 const mln_deduce(I, psite, delta)& dpt, const mln_value(I)& val)
00086 : ima_(exact(ima)),
00087 pt_(pt),
00088 dpt_(dpt),
00089 val_(val)
00090 {
00091 }
00092
00093 template <typename I>
00094 mln_psite(I)
00095 lemmings_<I>::operator()()
00096 {
00097 while (ima_.domain().has(pt_) && ima_(pt_) == val_)
00098 pt_ += dpt_;
00099 return pt_;
00100 }
00101
00102 template <typename I>
00103 mln_psite(I)
00104 lemmings(const Image<I>& ima, const mln_psite(I)& pt,
00105 const mln_deduce(I, psite, delta)& dpt, const mln_value(I)& val)
00106 {
00107 lemmings_<I> lm(ima, pt, dpt, val);
00108 return lm();
00109 }
00110
00111 # endif // ! MLN_INCLUDE_ONLY
00112
00113 }
00114
00115 }
00116
00117
00118 #endif // ! MLN_UTIL_LEMMINGS_HH