• Main Page
  • Related Pages
  • Modules
  • Namespaces
  • Classes
  • Files
  • File List

like_ero_fun.hh

00001 // Copyright (C) 2008, 2009 EPITA Research and Development Laboratory (LRDE)
00002 //
00003 // This file is part of Olena.
00004 //
00005 // Olena is free software: you can redistribute it and/or modify it under
00006 // the terms of the GNU General Public License as published by the Free
00007 // Software Foundation, version 2 of the License.
00008 //
00009 // Olena is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License
00015 // along with Olena.  If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 // As a special exception, you may use this file as part of a free
00018 // software project without restriction.  Specifically, if other files
00019 // instantiate templates or use macros or inline functions from this
00020 // file, or you compile this file and link it with other files to produce
00021 // an executable, this file does not by itself cause the resulting
00022 // executable to be covered by the GNU General Public License.  This
00023 // exception does not however invalidate any other reasons why the
00024 // executable file might be covered by the GNU General Public License.
00025 
00026 #ifndef MLN_MORPHO_ELEMENTARY_LIKE_ERO_FUN_HH
00027 # define MLN_MORPHO_ELEMENTARY_LIKE_ERO_FUN_HH
00028 
00032 
00033 
00034 # include <mln/morpho/includes.hh>
00035 
00036 
00037 namespace mln
00038 {
00039 
00040   namespace morpho
00041   {
00042 
00043     namespace elementary
00044     {
00045 
00046       template <typename A, typename F,
00047                 typename I, typename N>
00048       mln_concrete(I)
00049       like_ero_fun(const Meta_Accumulator<A>& a, const F& f,
00050                    const Image<I>& input, const Neighborhood<N>& nbh);
00051 
00052 
00053 
00054 # ifndef MLN_INCLUDE_ONLY
00055 
00056       namespace internal
00057       {
00058 
00059         struct f_accu
00060         {
00061           template <typename V, typename A>
00062           V operator()(const V& /*input_p*/, const A& a) const
00063           {
00064             return a.to_result();
00065           }
00066         };
00067 
00068       } // end of namespace mln::morpho::elementary::internal
00069 
00070 
00071       namespace impl
00072       {
00073 
00074         namespace generic
00075         {
00076 
00077           template <typename A, typename F,
00078                     typename I, typename N>
00079           mln_concrete(I)
00080           like_ero_fun(const Meta_Accumulator<A>& a_, const F& f,
00081                        const Image<I>& input_, const Neighborhood<N>& nbh_)
00082           {
00083             trace::entering("morpho::elementary::impl::generic::like_ero_fun");
00084 
00085             const I& input = exact(input_);
00086             const N& nbh   = exact(nbh_);
00087 
00088             mln_accu_with(A, mln_value(I)) a = accu::unmeta(exact(a_), mln_value(I)());
00089             extension::adjust_fill(input, nbh, a);
00090 
00091             mln_concrete(I) output;
00092             initialize(output, input);
00093 
00094             mln_piter(I) p(input.domain());
00095             mln_niter(N) n(nbh, p);
00096             for_all(p)
00097               {
00098                 a.take_as_init(input(p));
00099                 for_all(n) if (input.has(n))
00100                   a.take(input(n));
00101                 output(p) = f(input(p), a);
00102               }
00103 
00104             trace::exiting("morpho::elementary::impl::generic::like_ero_fun");
00105             return output;
00106           }
00107 
00108         } // end of namespace mln::morpho::elementary::impl::generic
00109 
00110 
00111         template <typename A, typename F,
00112                   typename I, typename N>
00113         mln_concrete(I)
00114         like_ero_fun_fastest(const Meta_Accumulator<A>& a_, const F& f,
00115                              const Image<I>& input_, const Neighborhood<N>& nbh_)
00116         {
00117           trace::entering("morpho::elementary::impl::like_ero_fun_fastest");
00118 
00119           const I& input = exact(input_);
00120           const N& nbh   = exact(nbh_);
00121 
00122           mln_accu_with(A, mln_value(I)) a = accu::unmeta(exact(a_), mln_value(I)());
00123           extension::adjust_fill(input, nbh, a);
00124 
00125           mln_concrete(I) output;
00126           initialize(output, input);
00127 
00128           mln_pixter(const I) p_in(input);
00129           mln_pixter(I) p_out(output);
00130           mln_nixter(const I, N) n(p_in, nbh);
00131           for_all_2(p_in, p_out)
00132             {
00133               a.take_as_init(p_in.val());
00134               for_all(n)
00135                 a.take(n.val());
00136               p_out.val() = f(p_in.val(), a);
00137             }
00138 
00139           trace::exiting("morpho::elementary::impl::like_ero_fun_fastest");
00140           return output;
00141         }
00142 
00143       } // end of namespace mln::morpho::elementary::impl
00144 
00145 
00146       namespace internal
00147       {
00148 
00149         template <typename A, typename F,
00150                   typename I, typename N>
00151         mln_concrete(I)
00152         like_ero_fun_dispatch(metal::false_,
00153                               const A& a, const F& f,
00154                               const I& input, const N& nbh)
00155         {
00156           return impl::generic::like_ero_fun(a, f, input, nbh);
00157         }
00158 
00159         template <typename A, typename F,
00160                   typename I, typename N>
00161         mln_concrete(I)
00162         like_ero_fun_dispatch(metal::true_,
00163                               const A& a, const F& f,
00164                               const I& input, const N& nbh)
00165         {
00166           return impl::like_ero_fun_fastest(a, f, input, nbh);
00167         }
00168 
00169         template <typename A, typename F,
00170                   typename I, typename N>
00171         mln_concrete(I)
00172         like_ero_fun_dispatch(const A& a, const F& f,
00173                               const I& input, const N& nbh)
00174         {
00175           typedef mlc_equal(mln_trait_image_speed(I),
00176                             trait::image::speed::fastest) I_fastest;
00177           typedef mln_window(N) W;
00178           typedef mln_is_simple_window(W) N_simple;
00179 
00180           return like_ero_fun_dispatch(mlc_and(I_fastest, N_simple)(),
00181                                        a, f, input, nbh);
00182         }
00183 
00184       } // end of namespace mln::morpho::elementary::internal
00185 
00186 
00187       // Facade.
00188 
00189       template <typename A, typename F,
00190                 typename I, typename N>
00191       mln_concrete(I)
00192       like_ero_fun(const Meta_Accumulator<A>& a, const F& f,
00193                    const Image<I>& input, const Neighborhood<N>& nbh)
00194       {
00195         return internal::like_ero_fun_dispatch(a, f,
00196                                                exact(input), exact(nbh));
00197       }
00198 
00199 # endif // ! MLN_INCLUDE_ONLY
00200 
00201     } // end of namespace mln::morpho::elementary
00202 
00203   } // end of namespace mln::morpho
00204 
00205 } // end of namespace mln
00206 
00207 
00208 #endif // ! MLN_MORPHO_ELEMENTARY_LIKE_ERO_FUN_HH

Generated on Tue Oct 4 2011 15:24:01 for Milena (Olena) by  doxygen 1.7.1