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

gradient_external.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_GRADIENT_EXTERNAL_HH
00027 # define MLN_MORPHO_ELEMENTARY_GRADIENT_EXTERNAL_HH
00028 
00032 
00033 # include <mln/morpho/elementary/like_ero_fun.hh>
00034 # include <mln/morpho/elementary/like_ero_set.hh>
00035 
00036 
00037 namespace mln
00038 {
00039 
00040   namespace morpho
00041   {
00042 
00043     namespace elementary
00044     {
00045 
00046 
00047       template <typename I, typename N>
00048       mln_concrete(I)
00049       gradient_external(const Image<I>& input, const Neighborhood<N>& nbh);
00050 
00051 
00052 # ifndef MLN_INCLUDE_ONLY
00053 
00054       namespace internal
00055       {
00056 
00057         struct f_grad_ext
00058         {
00059           template <typename V, typename A>
00060           V operator()(const V& input_p, const A& a) const
00061           {
00062             return a.to_result() - input_p;
00063           }
00064         };
00065 
00066         // Dispatch.
00067 
00068         template <typename I, typename N>
00069         mln_concrete(I)
00070         gradient_external_dispatch(trait::image::kind::any,
00071                          const Image<I>& input, const Neighborhood<N>& nbh)
00072         {
00073           return like_ero_fun(accu::meta::stat::max(), f_grad_ext(), input, nbh);
00074         }
00075 
00076         template <typename I, typename N>
00077         mln_concrete(I)
00078         gradient_external_dispatch(trait::image::kind::logic,
00079                                    const Image<I>& input, const Neighborhood<N>& nbh)
00080         {
00081           bool val[] =
00082             {
00083               0, // ext_value
00084               0, // do_duplicate
00085               0, // on_input_p
00086               1, // on_input_n
00087               1, // output_p
00088             };
00089           return like_ero_set(val, input, nbh);
00090         }
00091 
00092         template <typename I, typename N>
00093         mln_concrete(I)
00094         gradient_external_dispatch(const Image<I>& input, const Neighborhood<N>& nbh)
00095         {
00096           return gradient_external_dispatch(mln_trait_image_kind(I)(),
00097                                             input, nbh);
00098         }
00099 
00100       } // end of namespace mln::morpho::elementary::internal
00101 
00102 
00103       // Facade.
00104 
00105       template <typename I, typename N>
00106       mln_concrete(I)
00107       gradient_external(const Image<I>& input, const Neighborhood<N>& nbh)
00108       {
00109         trace::entering("morpho::elementary::gradient_external");
00110 
00111         mln_precondition(exact(input).is_valid());
00112         mln_precondition(exact(nbh).is_valid());
00113 
00114         mln_concrete(I) output = internal::gradient_external_dispatch(input, nbh);
00115 
00116         trace::exiting("morpho::elementary::gradient_external");
00117         return output;
00118       }
00119 
00120 # endif // ! MLN_INCLUDE_ONLY
00121 
00122     } // end of namespace mln::morpho::elementary
00123 
00124   } // end of namespace mln::morpho
00125 
00126 } // end of namespace mln
00127 
00128 
00129 #endif // ! MLN_MORPHO_ELEMENTARY_GRADIENT_EXTERNAL_HH

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