00001 #ifndef __LDK_TEMPLATEMETA_H__
00002 #define __LDK_TEMPLATEMETA_H__
00003
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00028
00033
00034 namespace LDK
00035 {
00038 namespace Meta
00039 {
00040
00045
00053 template<bool test, class TCase, class FCase> struct If;
00054
00057 template<class TCase, class FCase>
00058 struct If<true, TCase, FCase>
00059 {
00061 typedef TCase result;
00062 };
00063
00066 template<class TCase, class FCase>
00067 struct If<false, TCase, FCase>
00068 {
00070 typedef FCase result;
00071 };
00072
00077 struct LDK_API True
00078 {
00079 enum { value = 1 };
00080 };
00081
00086 struct LDK_API False
00087 {
00088 enum { value = 0 };
00089 };
00090
00091
00092 template <bool x> struct CTAssert;
00093 template <> struct LDK_API CTAssert<true> {};
00099 #define CTASSERT(expr,msg) LDK::Meta::CTAssert<((expr) != false)> ERROR_##msg;
00100
00109 template <int N>
00110 struct PowerOf2
00111 {
00112 enum
00113 {
00114 value = !(N%2) ? PowerOf2<(int)((N/2.0)+0.5)>::value : false
00115 };
00116 };
00117
00118 template <>
00119 struct LDK_API PowerOf2<2>
00120 {
00121 enum { value = true };
00122 };
00123
00124 template <>
00125 struct LDK_API PowerOf2<0>
00126 {
00127 enum { value = false };
00128 };
00129
00139 template <int Size>
00140 struct HalfwayPowerOf2
00141 {
00142 enum
00143 {
00144 value = PowerOf2<Size>::value ? false :\
00145 PowerOf2<(int)(Size+((Size/3.0)+0.5))>::value
00146 };
00147 };
00149 }
00150
00151 }
00152
00153 #endif //__LDK_TEMPLATEMETA_H__