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