static_bin_log.hh

00001 // This file is a part of Aurelia.
00002 // Copyright (C) 2010  Valentin David
00003 // Copyright (C) 2010  University of Bergen
00004 //
00005 // This program is free software: you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License as published by
00007 // the Free Software Foundation, either version 3 of the License, or
00008 // (at your option) any later version.
00009 //
00010 // This program is distributed in the hope that it will be useful,
00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013 // GNU General Public License for more details.
00014 //
00015 // You should have received a copy of the GNU General Public License
00016 // along with this program.  If not, see <http://www.gnu.org/licenses/>.
00017 
00018 #ifndef __STATIC_BIN_LOG_HH
00019 # define __STATIC_BIN_LOG_HH
00020 
00021 # include <type_traits>
00022 
00023 namespace fast {
00024   template <typename integral_type, typename N>
00025   struct static_bin_log_wrapped: public
00026   std::integral_constant<integral_type,
00027                          static_bin_log_wrapped<integral_type,
00028                                                 std::integral_constant<
00029                                                   integral_type,
00030                                                   (N::value>>1)> >
00031     ::value+1> {};
00032 
00033   template <typename integral_type>
00034   struct static_bin_log_wrapped<integral_type,
00035                                 std::integral_constant<integral_type,
00036                                                        1> >:
00037     public std::integral_constant<integral_type, 0> {};
00038 
00039   template <typename integral_type, integral_type N>
00040   struct static_bin_log: public
00041   static_bin_log_wrapped<integral_type,
00042                          std::integral_constant<
00043                            integral_type,
00044                            N> >
00045   {};
00046 }
00047 
00048 #endif