Chris@102: /* Chris@102: * Distributed under the Boost Software License, Version 1.0. Chris@102: * (See accompanying file LICENSE_1_0.txt or copy at Chris@102: * http://www.boost.org/LICENSE_1_0.txt) Chris@102: * Chris@102: * Copyright (c) 2014 Andrey Semashev Chris@102: */ Chris@102: /*! Chris@102: * \file atomic/detail/int_sizes.hpp Chris@102: * Chris@102: * This header defines macros for testing buitin integer type sizes Chris@102: */ Chris@102: Chris@102: #ifndef BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_ Chris@102: #define BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_ Chris@102: Chris@102: #include Chris@102: Chris@102: #ifdef BOOST_HAS_PRAGMA_ONCE Chris@102: #pragma once Chris@102: #endif Chris@102: Chris@102: // GCC and compatible compilers define internal macros with builtin type traits Chris@102: #if defined(__SIZEOF_SHORT__) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT __SIZEOF_SHORT__ Chris@102: #endif Chris@102: #if defined(__SIZEOF_INT__) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_INT __SIZEOF_INT__ Chris@102: #endif Chris@102: #if defined(__SIZEOF_LONG__) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG __SIZEOF_LONG__ Chris@102: #endif Chris@102: #if defined(__SIZEOF_LONG_LONG__) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG __SIZEOF_LONG_LONG__ Chris@102: #endif Chris@102: #if defined(__SIZEOF_WCHAR_T__) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T __SIZEOF_WCHAR_T__ Chris@102: #endif Chris@102: #if defined(__SIZEOF_POINTER__) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER __SIZEOF_POINTER__ Chris@102: #elif defined(_MSC_VER) Chris@102: #if defined(_M_AMD64) || defined(_M_IA64) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 8 Chris@102: #else Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 4 Chris@102: #endif Chris@102: #endif Chris@102: Chris@102: #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\ Chris@102: !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG) Chris@102: Chris@102: // Try to deduce sizes from limits Chris@102: #include Chris@102: #include Chris@102: Chris@102: #if (USHRT_MAX + 0) == 0xff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 1 Chris@102: #elif (USHRT_MAX + 0) == 0xffff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 2 Chris@102: #elif (USHRT_MAX + 0) == 0xffffffff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 4 Chris@102: #elif (USHRT_MAX + 0) == UINT64_C(0xffffffffffffffff) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 8 Chris@102: #endif Chris@102: Chris@102: #if (UINT_MAX + 0) == 0xff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 1 Chris@102: #elif (UINT_MAX + 0) == 0xffff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 2 Chris@102: #elif (UINT_MAX + 0) == 0xffffffff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 4 Chris@102: #elif (UINT_MAX + 0) == UINT64_C(0xffffffffffffffff) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 8 Chris@102: #endif Chris@102: Chris@102: #if (ULONG_MAX + 0) == 0xff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 1 Chris@102: #elif (ULONG_MAX + 0) == 0xffff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 2 Chris@102: #elif (ULONG_MAX + 0) == 0xffffffff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 4 Chris@102: #elif (ULONG_MAX + 0) == UINT64_C(0xffffffffffffffff) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 8 Chris@102: #endif Chris@102: Chris@102: #if defined(__hpux) // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8 Chris@102: #else Chris@102: Chris@102: // The list of the non-standard macros (the ones except ULLONG_MAX) is taken from cstdint.hpp Chris@102: #if defined(ULLONG_MAX) Chris@102: #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULLONG_MAX Chris@102: #elif defined(ULONG_LONG_MAX) Chris@102: #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONG_LONG_MAX Chris@102: #elif defined(ULONGLONG_MAX) Chris@102: #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONGLONG_MAX Chris@102: #elif defined(_LLONG_MAX) // strangely enough, this one seems to be holding the limit for the unsigned integer Chris@102: #define BOOST_ATOMIC_DETAIL_ULLONG_MAX _LLONG_MAX Chris@102: #endif Chris@102: Chris@102: #if (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 1 Chris@102: #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 2 Chris@102: #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffffffff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 4 Chris@102: #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == UINT64_C(0xffffffffffffffff) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8 Chris@102: #endif Chris@102: Chris@102: #endif // defined(__hpux) Chris@102: Chris@102: #endif Chris@102: Chris@102: #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T) Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: #if defined(_MSC_VER) && _MSC_VER <= 1310 Chris@102: // MSVC 7.1 defines WCHAR_MAX to a value not suitable for constant expressions Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2 Chris@102: #elif (WCHAR_MAX + 0) == 0xff || (WCHAR_MAX + 0) == 0x7f Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 1 Chris@102: #elif (WCHAR_MAX + 0) == 0xffff || (WCHAR_MAX + 0) == 0x7fff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2 Chris@102: #elif (WCHAR_MAX + 0) == 0xffffffff || (WCHAR_MAX + 0) == 0x7fffffff Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 4 Chris@102: #elif (WCHAR_MAX + 0) == UINT64_C(0xffffffffffffffff) || (WCHAR_MAX + 0) == INT64_C(0x7fffffffffffffff) Chris@102: #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 8 Chris@102: #endif Chris@102: #endif Chris@102: Chris@102: #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\ Chris@102: !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG) ||\ Chris@102: !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T) Chris@102: #error Boost.Atomic: Failed to determine builtin integer sizes, the target platform is not supported. Please, report to the developers. Chris@102: #endif Chris@102: Chris@102: #endif // BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_