00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef VCSN_MISC_STATIC_HH
00018 # define VCSN_MISC_STATIC_HH
00019
00025 # include <cstddef>
00026
00027 namespace utility {
00028
00032
00033
00034
00035
00037
00038 template<typename T>
00039 struct remove_reference
00040 {
00041 typedef T t;
00042 };
00043
00044 template<typename T>
00045 struct remove_reference<T&>
00046 {
00047 typedef T t;
00048 };
00049
00050 template<typename T>
00051 struct remove_reference<const T&>
00052 {
00053 typedef const T t;
00054 };
00057
00058
00059
00060
00062
00063 template<typename T>
00064 struct remove_const
00065 {
00066 typedef T t;
00067 };
00068
00069 template<typename T>
00070 struct remove_const<const T>
00071 {
00072 typedef T t;
00073 };
00076
00077
00078
00079
00087 template<bool b, typename T, typename U>
00088 struct static_if
00089 {
00090 typedef T t;
00091
00092 typedef typename remove_const<typename remove_reference<T>::t>::t bare_t1;
00093 typedef typename remove_const<typename remove_reference<U>::t>::t bare_t2;
00094
00095 static bare_t1&
00096 choose(bare_t1& p1,
00097 bare_t2& )
00098 { return p1; }
00099 static const bare_t1&
00100 choose(const bare_t1& p1,
00101 const bare_t2& )
00102 { return p1; }
00103 };
00104
00105 template<typename T, typename U>
00106 struct static_if<false, T, U>
00107 {
00108 typedef U t;
00109
00110 typedef typename remove_const<typename remove_reference<T>::t>::t bare_t1;
00111 typedef typename remove_const<typename remove_reference<U>::t>::t bare_t2;
00112
00113 static bare_t2&
00114 choose(bare_t1& ,
00115 bare_t2& p2)
00116 { return p2; }
00117 static const bare_t2&
00118 choose(const bare_t1& ,
00119 const bare_t2& p2)
00120 { return p2; }
00121 };
00124
00125
00126
00127
00140 template<bool b, typename T, typename U>
00141 struct static_if_simple
00142 {
00143 typedef T t;
00144 };
00145
00146 template<typename T, typename U>
00147 struct static_if_simple<false, T, U>
00148 {
00149 typedef U t;
00150 };
00153
00154
00155
00156
00158
00159 template<typename T, typename U>
00160 struct static_eq
00161 {
00162 static const bool value = false;
00163 };
00164
00165 template<typename T>
00166 struct static_eq<T, T>
00167 {
00168 static const bool value = true;
00169 };
00172
00173
00174
00175
00177
00178 template<size_t N, size_t P, bool pair_p = false>
00179 struct static_pow_compute
00180 {
00181 static const size_t value =
00182 N * static_pow_compute<N, P-1, (((P-1) % 2) == 0)>::value ;
00183 };
00184
00185 template<size_t N, size_t P>
00186 struct static_pow_compute<N, P, true>
00187 {
00188 static const size_t temp =
00189 static_pow_compute<N, P/2, (((P/2) % 2) == 0)>::value;
00190 static const size_t value = temp * temp;
00191 };
00192
00193 template<size_t N>
00194 struct static_pow_compute<N, 0, true>
00195 {
00196 static const size_t value = 1;
00197 };
00204 template<size_t N, size_t P>
00205 struct static_pow
00206 {
00207 static const size_t value =
00208 static_pow_compute<N, P, ((P % 2) == 0)>::value ;
00209 };
00210
00211
00212
00213
00214
00216 template<size_t N, size_t P>
00217 struct static_pow_minus_one
00218 {
00219 static const size_t value =
00220 static_pow_compute<N, P, ((P % 2) == 0)>::value - 1;
00221 };
00222
00225 }
00226
00227 #endif // ! VCSN_MISC_STATIC_HH