1
2// (C) Copyright Steve Cleary, Beman Dawes, Howard Hinnant & John Maddock 2000.
3// Use, modification and distribution are subject to the Boost Software License,
4// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt).
6//
7// See http://www.boost.org/libs/type_traits for most recent version including documentation.
8
9#ifndef BOOST_TT_IS_INTEGRAL_HPP_INCLUDED
10#define BOOST_TT_IS_INTEGRAL_HPP_INCLUDED
11
12#include <boost/config.hpp>
13#include <boost/type_traits/integral_constant.hpp>
14
15namespace boost {
16
17#if defined( __CODEGEARC__ )
18 template <class T>
19 struct is_integral : public integral_constant<bool, __is_integral(T)> {};
20#else
21
22template <class T> struct is_integral : public false_type {};
23template <class T> struct is_integral<const T> : public is_integral<T> {};
24template <class T> struct is_integral<volatile const T> : public is_integral<T>{};
25template <class T> struct is_integral<volatile T> : public is_integral<T>{};
26
27//* is a type T an [cv-qualified-] integral type described in the standard (3.9.1p3)
28// as an extension we include long long, as this is likely to be added to the
29// standard at a later date
30template<> struct is_integral<unsigned char> : public true_type {};
31template<> struct is_integral<unsigned short> : public true_type{};
32template<> struct is_integral<unsigned int> : public true_type{};
33template<> struct is_integral<unsigned long> : public true_type{};
34
35template<> struct is_integral<signed char> : public true_type{};
36template<> struct is_integral<short> : public true_type{};
37template<> struct is_integral<int> : public true_type{};
38template<> struct is_integral<long> : public true_type{};
39
40template<> struct is_integral<char> : public true_type{};
41template<> struct is_integral<bool> : public true_type{};
42
43#ifndef BOOST_NO_INTRINSIC_WCHAR_T
44// If the following line fails to compile and you're using the Intel
45// compiler, see http://lists.boost.org/MailArchives/boost-users/msg06567.php,
46// and define BOOST_NO_INTRINSIC_WCHAR_T on the command line.
47template<> struct is_integral<wchar_t> : public true_type{};
48#endif
49
50// Same set of integral types as in boost/type_traits/integral_promotion.hpp.
51// Please, keep in sync. -- Alexander Nasonov
52#if (defined(BOOST_INTEL_CXX_VERSION) && defined(_MSC_VER) && (BOOST_INTEL_CXX_VERSION <= 600)) \
53 || (defined(__BORLANDC__) && (__BORLANDC__ == 0x600) && (_MSC_VER < 1300))
54template<> struct is_integral<unsigned __int8> : public true_type{};
55template<> struct is_integral<unsigned __int16> : public true_type{};
56template<> struct is_integral<unsigned __int32> : public true_type{};
57template<> struct is_integral<__int8> : public true_type{};
58template<> struct is_integral<__int16> : public true_type{};
59template<> struct is_integral<__int32> : public true_type{};
60#ifdef __BORLANDC__
61template<> struct is_integral<unsigned __int64> : public true_type{};
62template<> struct is_integral<__int64> : public true_type{};
63#endif
64#endif
65
66# if defined(BOOST_HAS_LONG_LONG)
67template<> struct is_integral< ::boost::ulong_long_type> : public true_type{};
68template<> struct is_integral< ::boost::long_long_type> : public true_type{};
69#elif defined(BOOST_HAS_MS_INT64)
70template<> struct is_integral<unsigned __int64> : public true_type{};
71template<> struct is_integral<__int64> : public true_type{};
72#endif
73
74#ifdef BOOST_HAS_INT128
75template<> struct is_integral<boost::int128_type> : public true_type{};
76template<> struct is_integral<boost::uint128_type> : public true_type{};
77#endif
78#ifndef BOOST_NO_CXX11_CHAR16_T
79template<> struct is_integral<char16_t> : public true_type{};
80#endif
81#ifndef BOOST_NO_CXX11_CHAR32_T
82template<> struct is_integral<char32_t> : public true_type{};
83#endif
84
85#endif // non-CodeGear implementation
86
87} // namespace boost
88
89#endif // BOOST_TT_IS_INTEGRAL_HPP_INCLUDED
90