00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef MORE_METANUMERIC_H
00032 #define MORE_METANUMERIC_H
00033
00034 namespace more {
00035
00036 template<int N> struct pow_;
00037 template<int N, int Selector>
00038 struct pow_helper_ {
00039 template<typename T>
00040 static T eval(T const& x) { return T(1)/pow_<-N>::eval(x); }
00041 };
00042 template<int N>
00043 struct pow_helper_<N, 1> {
00044 template<typename T>
00045 static T eval(T const& x) { return x*pow2(pow_<N/2>::eval(x)); }
00046 };
00047 template<int N>
00048 struct pow_helper_<N, 0> {
00049 template<typename T>
00050 static T eval(T const& x) { return pow2(pow_<N/2>::eval(x)); }
00051 };
00052 template<int N> struct pow_ : pow_helper_<N, (N%2 - (N<0)*2)> {};
00053 template<> struct pow_<0>
00054 { template<typename T> static T eval(T const& x) { return one; } };
00055 template<> struct pow_<1>
00056 { template<typename T> static T eval(T const& x) { return x; } };
00057
00058
00059
00060 template<int X, int Y> struct power_
00061 { static int const eval = X*power_<X, Y-1>::eval; };
00062 template<int X> struct power_<X, 0> { static int const eval = 1; };
00063
00064
00065
00066 template<int X, int Y=0> struct factorial_
00067 { static int const eval = X*factorial_<X-1, Y>::eval; };
00068 template<int X> struct factorial_<X, X> { static int const eval = 1; };
00069
00070
00071
00072 template<int N, int M> struct binominal_ {
00073 static int const eval
00074 = binominal_<N-1, M-1>::eval + binominal_<N-1, M>::eval;
00075 };
00076 template<int N> struct binominal_<N, 0> { static int const eval = 1; };
00077 template<int N> struct binominal_<N, N> { static int const eval = 1; };
00078 template<> struct binominal_<0, 0> { static int const eval = 1; };
00079
00080
00081 }
00082
00083 #endif