Program Listing for File fundamental_types.hpp

Return to documentation for file (include/ecl/type_traits/fundamental_types.hpp)

/*****************************************************************************
** Ifdefs
*****************************************************************************/

#ifndef ECL_TYPE_TRAITS_FUNDAMENTAL_TYPES_HPP_
#define ECL_TYPE_TRAITS_FUNDAMENTAL_TYPES_HPP_

/*****************************************************************************
** Includes
*****************************************************************************/

#include <limits>
#include <ecl/mpl/bool.hpp>
#include <ecl/config/ecl.hpp>

/*****************************************************************************
** Namespace
*****************************************************************************/

namespace ecl {

/*****************************************************************************
** Integers
*****************************************************************************/
template <typename T>
class is_integral : public False {};


template <>
class is_integral<char> : public True {};

template <>
class is_integral<unsigned char> : public True {};

template <>
class is_integral<short> : public True {};

template <>
class is_integral<unsigned short> : public True {};

template <>
class is_integral<int> : public True {};

template <>
class is_integral<unsigned int> : public True {};

template <>
class is_integral<long> : public True {};

template <>
class is_integral<unsigned long> : public True {};

template <>
class is_integral<long long> : public True {};

template <>
class is_integral<unsigned long long> : public True {};

/*****************************************************************************
** Unsigned Integers
*****************************************************************************/
template <typename T>
class is_unsigned : public False {};

template <>
class is_unsigned<unsigned char> : public True {};

template <>
class is_unsigned<unsigned short> : public True {};

template <>
class is_unsigned<unsigned int> : public True {};

template <>
class is_unsigned<unsigned long> : public True {};

template <>
class is_unsigned<unsigned long long> : public True {};

/*****************************************************************************
** Signed Integers
*****************************************************************************/
template <typename T>
class is_signed : public False {};

template <>
class is_signed<char> : public True {};

template <>
class is_signed<short> : public True {};

template <>
class is_signed<int> : public True {};

template <>
class is_signed<long> : public True {};

template <>
class is_signed<long long> : public True {};


/*****************************************************************************
** Floats
*****************************************************************************/

template <typename T>
class is_float : public False {};

template <>
class is_float<float> : public True {};

template <>
class is_float<double> : public True {};

template <>
class is_float<long double> : public True {};

/*****************************************************************************
** Bytes
*****************************************************************************/

template <typename T>
class is_signed_byte : public False {};

template <>
class is_signed_byte<signed char> : public True {};

template <>
class is_signed_byte<char> : public Bool<std::numeric_limits<char>::is_signed> {};

template <typename T>
class is_unsigned_byte : public False {};

template <>
class is_unsigned_byte<unsigned char> : public True {};

template <>
class is_unsigned_byte<char> : public Bool<!std::numeric_limits<char>::is_signed> {};

template <typename T>
class is_byte : public False {};

template <>
class is_byte<signed char> : public True {};

template <>
class is_byte<char> : public True {};

template <>
class is_byte<unsigned char> : public True {};

} // namespace ecl

#endif /* ECL_TYPE_TRAITS_FUNDAMENTAL_TYPES_HPP_ */