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

root.hh

00001 // Copyright (C) 2007, 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_METAL_MATH_ROOT_HH
00027 # define MLN_METAL_MATH_ROOT_HH
00028 
00036 # include <mln/metal/math/pow.hh>
00037 
00038 
00039 # define mlc_root(N,X) mln::metal::math::root<( N ),( X )>
00040 
00041 
00042 namespace mln
00043 {
00044 
00045   namespace metal
00046   {
00047 
00048     namespace math
00049     {
00050 
00051       namespace impl
00052       {
00053 
00054         template <unsigned n, unsigned x,
00055                   unsigned lo = 1, unsigned hi = x>
00056         struct root
00057         {
00058           enum {
00059             mid = (lo + hi + 1) / 2,
00060             val_lo = root<n, x, lo, mid-1>::value,
00061             val_hi = root<n, x, mid, hi>::value
00062           };
00063           enum { value = x < mlc_pow_int(mid, n) ? val_lo : val_hi };
00064         };
00065 
00066         template<unsigned n, unsigned x, unsigned m>
00067         struct root<n, x, m, m>
00068         {
00069           enum { value = m }; // Found.
00070         };
00071 
00072       } // end of namespace mln::metal::math::impl
00073 
00074       template <unsigned n, unsigned x>
00075       struct root : bool_<(n != 0)>::check_t
00076       {
00077         enum { value    = impl::root<n,x>::value,
00078                reminder = x - mlc_pow_int(value, n) };
00079       };
00080 
00081       template <unsigned n>
00082       struct root<n, 0> : bool_<(n != 0)>::check_t
00083       {
00084         enum { value = 0,
00085                reminder = 0};
00086       };
00087 
00088     } // end of namespace mln::metal::math
00089 
00090   } // end of namespace mln::metal
00091 
00092 } // end of namespace mln
00093 
00094 
00095 #endif // ! MLN_METAL_MATH_ROOT_HH

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