stat.hh

00001 // Copyright (C) 2001, 2002, 2003, 2004  EPITA Research and Development Laboratory
00002 //
00003 // This file is part of the Olena Library.  This library is free
00004 // software; you can redistribute it and/or modify it under the terms
00005 // of the GNU General Public License version 2 as published by the
00006 // Free Software Foundation.
00007 //
00008 // This library is distributed in the hope that it will be useful,
00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00011 // General Public License for more details.
00012 //
00013 // You should have received a copy of the GNU General Public License
00014 // along with this library; see the file COPYING.  If not, write to
00015 // the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
00016 // MA 02111-1307, USA.
00017 //
00018 // As a special exception, you may use this file as part of a free
00019 // software library without restriction.  Specifically, if other files
00020 // instantiate templates or use macros or inline functions from this
00021 // file, or you compile this file and link it with other files to
00022 // produce an executable, this file does not by itself cause the
00023 // resulting executable to be covered by the GNU General Public
00024 // License.  This exception does not however invalidate any other
00025 // reasons why the executable file might be covered by the GNU General
00026 // Public License.
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       /* Binary specialization.  */
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     } // internal
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         //               const mlc_exact_type(I)::iter_type& p,
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   } // end of namespace morpho
00180 
00181 } // end of namespace oln
00182 
00183 
00184 #endif // ! OLENA_MORPHO_STAT_HH

Generated on Thu Apr 15 20:13:14 2004 for Olena by doxygen 1.3.6-20040222