BWAPI
|
00001 #pragma once 00002 00003 //------------------------------------------------------------------------------ 00004 // Compile-time assertions 00005 //------------------------------------------------------------------------------ 00006 template<bool> struct static_assert; 00007 template<> struct static_assert<true> { }; 00008 00009 //------------------------------------------------------------------------------ 00010 // Unused variable (remove compilation warnings) 00011 //------------------------------------------------------------------------------ 00012 template<class T> void unused(const T&) { } 00013 00014 //------------------------------------------------------------------------------ 00015 // Static selector 00016 //------------------------------------------------------------------------------ 00017 template<bool Cond, class TrueType, class FalseType> struct static_if_else; 00018 00019 template<class TrueType, class FalseType> 00020 struct static_if_else<true,TrueType,FalseType> { typedef TrueType type; }; 00021 00022 template<class TrueType, class FalseType> 00023 struct static_if_else<false,TrueType,FalseType> { typedef FalseType type; }; 00024 00025 //------------------------------------------------------------------------------ 00026 // Boolean type wrappers 00027 //------------------------------------------------------------------------------ 00028 struct true_type { enum { value = true }; }; 00029 struct false_type { enum { value = false }; }; 00030 00031 //------------------------------------------------------------------------------ 00032 // Compare two types (use boost::is_same instead) 00033 //------------------------------------------------------------------------------ 00034 //template<class T, class U> 00035 //struct boost::is_same : false_type { }; 00036 // 00037 //template<class T> 00038 //struct boost::is_same<T,T> : true_type { }; 00039 00040 //------------------------------------------------------------------------------ 00041 // Templated empty class (with a lot of useless generic constructors!) 00042 //------------------------------------------------------------------------------ 00043 template <class T> 00044 struct empty 00045 { 00046 empty(){} 00047 template <class T1> empty(const T1&) {} 00048 template <class T1, class T2> empty(const T1&, const T2&) {} 00049 template <class T1, class T2, class T3> empty(const T1&, const T2&, const T3&) {} 00050 template <class T1, class T2, class T3, class T4> empty(const T1&, const T2&, const T3&, const T4&) {} 00051 template <class T1, class T2, class T3, class T4, class T5> empty(const T1&, const T2&, const T3&, const T4& t4, const T5&) {} 00052 }; 00053 00054 //------------------------------------------------------------------------------ 00055 // Prevents taking the size of a pointer type 00056 //------------------------------------------------------------------------------ 00057 // Use (sizeof array_size(a)) instead of (sizeof a / sizeof *a) 00058 template<typename T, size_t N> size_t array_size(T(&)[N]) 00059 { 00060 return N; 00061 } 00062 00063