math.hh

00001 // Copyright (C) 2001, 2002, 2003  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 METALIC_MATH_HH
00029 # define METALIC_MATH_HH
00030 
00031 # include <mlc/bool.hh>
00032 
00033 namespace mlc
00034 {
00035 
00036   namespace internal 
00037   {
00038 
00039     // Helper structs for pow2sup below.
00040 
00041     template<unsigned N> struct is_pow2 { typedef false_type ret; };
00042     template<> struct is_pow2<8>  { typedef true_type ret; };
00043     template<> struct is_pow2<16> { typedef true_type ret; };
00044     template<> struct is_pow2<32> { typedef true_type ret; };
00045     template<> struct is_pow2<64> { typedef true_type ret; };
00046 
00047     template<unsigned N, class> struct find_pow2sup;
00048     template<unsigned N> struct find_pow2sup<N,true_type> {
00049       enum { value = N };
00050     };
00051     template<unsigned N> struct find_pow2sup<N,false_type> {
00052       enum { value = find_pow2sup< N+1,
00053              typename is_pow2<N+1>::ret >::value };
00054     };
00055 
00056   } // end of internal
00057 
00058   // Smaller power of 2 greater than N.
00059 
00060   template<unsigned N>
00061   struct pow2sup {
00062     enum {
00063       value =
00064       internal::find_pow2sup< N,
00065       typename internal::is_pow2<N>::ret >::value
00066     };
00067   private:
00068     typedef typename is_true<N < 32>::ensure_type precondition_type;
00069   };
00070 
00071   // Various tests on N (actually, we tests only oddness.)
00072 
00073   template<unsigned N>
00074   class utest {
00075   public:
00076     typedef typename is_true<N/2 == (N+1)/2>::ensure_type is_odd_type;
00077     static void ensure_odd()   { is_odd_type::is_true(); }
00078   };
00079 
00080 } // end of namespace mlc
00081 
00082 #endif  // METALIC_MATH_HH

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