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