00001 00008 /***************************************************************************** 00009 ** Ifdefs 00010 *****************************************************************************/ 00011 00012 #ifndef ECL_TYPE_TRAITS_FUNDAMENTAL_TYPES_HPP_ 00013 #define ECL_TYPE_TRAITS_FUNDAMENTAL_TYPES_HPP_ 00014 00015 /***************************************************************************** 00016 ** Includes 00017 *****************************************************************************/ 00018 00019 #include <limits> 00020 #include <ecl/mpl/bool.hpp> 00021 #include <ecl/config/ecl.hpp> 00022 00023 /***************************************************************************** 00024 ** Namespace 00025 *****************************************************************************/ 00026 00027 namespace ecl { 00028 00029 /***************************************************************************** 00030 ** Integers 00031 *****************************************************************************/ 00040 template <typename T> 00041 class is_integral : public False {}; 00042 00043 00049 template <> 00050 class is_integral<char> : public True {}; 00051 00057 template <> 00058 class is_integral<unsigned char> : public True {}; 00059 00065 template <> 00066 class is_integral<short> : public True {}; 00067 00073 template <> 00074 class is_integral<unsigned short> : public True {}; 00075 00081 template <> 00082 class is_integral<int> : public True {}; 00083 00089 template <> 00090 class is_integral<unsigned int> : public True {}; 00091 00097 template <> 00098 class is_integral<long> : public True {}; 00099 00105 template <> 00106 class is_integral<unsigned long> : public True {}; 00107 00113 template <> 00114 class is_integral<long long> : public True {}; 00115 00121 template <> 00122 class is_integral<unsigned long long> : public True {}; 00123 00124 /***************************************************************************** 00125 ** Unsigned Integers 00126 *****************************************************************************/ 00135 template <typename T> 00136 class is_unsigned : public False {}; 00137 00141 template <> 00142 class is_unsigned<unsigned char> : public True {}; 00143 00147 template <> 00148 class is_unsigned<unsigned short> : public True {}; 00149 00153 template <> 00154 class is_unsigned<unsigned int> : public True {}; 00155 00159 template <> 00160 class is_unsigned<unsigned long> : public True {}; 00161 00165 template <> 00166 class is_unsigned<unsigned long long> : public True {}; 00167 00168 /***************************************************************************** 00169 ** Signed Integers 00170 *****************************************************************************/ 00179 template <typename T> 00180 class is_signed : public False {}; 00181 00185 template <> 00186 class is_signed<char> : public True {}; 00187 00191 template <> 00192 class is_signed<short> : public True {}; 00193 00197 template <> 00198 class is_signed<int> : public True {}; 00199 00203 template <> 00204 class is_signed<long> : public True {}; 00205 00209 template <> 00210 class is_signed<long long> : public True {}; 00211 00212 00213 /***************************************************************************** 00214 ** Floats 00215 *****************************************************************************/ 00216 00225 template <typename T> 00226 class is_float : public False {}; 00227 00233 template <> 00234 class is_float<float> : public True {}; 00235 00241 template <> 00242 class is_float<double> : public True {}; 00243 00249 template <> 00250 class is_float<long double> : public True {}; 00251 00252 /***************************************************************************** 00253 ** Bytes 00254 *****************************************************************************/ 00255 00264 template <typename T> 00265 class is_signed_byte : public False {}; 00266 00272 template <> 00273 class is_signed_byte<signed char> : public True {}; 00274 00282 template <> 00283 class is_signed_byte<char> : public Bool<std::numeric_limits<char>::is_signed> {}; 00284 00293 template <typename T> 00294 class is_unsigned_byte : public False {}; 00295 00301 template <> 00302 class is_unsigned_byte<unsigned char> : public True {}; 00303 00311 template <> 00312 class is_unsigned_byte<char> : public Bool<!std::numeric_limits<char>::is_signed> {}; 00313 00322 template <typename T> 00323 class is_byte : public False {}; 00324 00330 template <> 00331 class is_byte<signed char> : public True {}; 00332 00338 template <> 00339 class is_byte<char> : public True {}; 00340 00346 template <> 00347 class is_byte<unsigned char> : public True {}; 00348 00349 } // namespace ecl 00350 00351 #endif /* ECL_TYPE_TRAITS_FUNDAMENTAL_TYPES_HPP_ */