int_sizes.hpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. /*
  2. * Distributed under the Boost Software License, Version 1.0.
  3. * (See accompanying file LICENSE_1_0.txt or copy at
  4. * http://www.boost.org/LICENSE_1_0.txt)
  5. *
  6. * Copyright (c) 2014 Andrey Semashev
  7. */
  8. /*!
  9. * \file atomic/detail/int_sizes.hpp
  10. *
  11. * This header defines macros for testing buitin integer type sizes
  12. */
  13. #ifndef BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_
  14. #define BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_
  15. #include <boost/atomic/detail/config.hpp>
  16. #ifdef BOOST_HAS_PRAGMA_ONCE
  17. #pragma once
  18. #endif
  19. // GCC and compatible compilers define internal macros with builtin type traits
  20. #if defined(__SIZEOF_SHORT__)
  21. #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT __SIZEOF_SHORT__
  22. #endif
  23. #if defined(__SIZEOF_INT__)
  24. #define BOOST_ATOMIC_DETAIL_SIZEOF_INT __SIZEOF_INT__
  25. #endif
  26. #if defined(__SIZEOF_LONG__)
  27. #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG __SIZEOF_LONG__
  28. #endif
  29. #if defined(__SIZEOF_LONG_LONG__)
  30. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG __SIZEOF_LONG_LONG__
  31. #endif
  32. #if defined(__SIZEOF_WCHAR_T__)
  33. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T __SIZEOF_WCHAR_T__
  34. #endif
  35. #if defined(__SIZEOF_POINTER__)
  36. #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER __SIZEOF_POINTER__
  37. #elif defined(_MSC_VER)
  38. #if defined(_M_AMD64) || defined(_M_ARM64) || defined(_M_ARM64EC) || defined(_M_IA64)
  39. #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 8
  40. #else
  41. #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 4
  42. #endif
  43. #endif
  44. #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\
  45. !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG) ||\
  46. !defined(BOOST_ATOMIC_DETAIL_SIZEOF_POINTER)
  47. // Try to deduce sizes from limits
  48. #include <limits.h>
  49. #include <cstdint>
  50. #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT)
  51. #if (USHRT_MAX == 0xff)
  52. #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 1
  53. #elif (USHRT_MAX == 0xffff)
  54. #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 2
  55. #elif (USHRT_MAX == 0xffffffff)
  56. #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 4
  57. #elif (USHRT_MAX == UINT64_C(0xffffffffffffffff))
  58. #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 8
  59. #endif
  60. #endif // !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT)
  61. #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT)
  62. #if (UINT_MAX == 0xff)
  63. #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 1
  64. #elif (UINT_MAX == 0xffff)
  65. #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 2
  66. #elif (UINT_MAX == 0xffffffff)
  67. #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 4
  68. #elif (UINT_MAX == UINT64_C(0xffffffffffffffff))
  69. #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 8
  70. #endif
  71. #endif // !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT)
  72. #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG)
  73. #if (ULONG_MAX == 0xff)
  74. #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 1
  75. #elif (ULONG_MAX == 0xffff)
  76. #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 2
  77. #elif (ULONG_MAX == 0xffffffff)
  78. #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 4
  79. #elif (ULONG_MAX == UINT64_C(0xffffffffffffffff))
  80. #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 8
  81. #endif
  82. #endif // !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG)
  83. #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG)
  84. #if defined(__hpux) // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
  85. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8
  86. #else
  87. // The list of the non-standard macros (the ones except ULLONG_MAX) is taken from boost/cstdint.hpp
  88. #if defined(ULLONG_MAX)
  89. #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULLONG_MAX
  90. #elif defined(ULONG_LONG_MAX)
  91. #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONG_LONG_MAX
  92. #elif defined(ULONGLONG_MAX)
  93. #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONGLONG_MAX
  94. #elif defined(_LLONG_MAX) // strangely enough, this one seems to be holding the limit for the unsigned integer
  95. #define BOOST_ATOMIC_DETAIL_ULLONG_MAX _LLONG_MAX
  96. #endif
  97. #if (BOOST_ATOMIC_DETAIL_ULLONG_MAX == 0xff)
  98. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 1
  99. #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX == 0xffff)
  100. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 2
  101. #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX == 0xffffffff)
  102. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 4
  103. #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX == UINT64_C(0xffffffffffffffff))
  104. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8
  105. #endif
  106. #endif // defined(__hpux)
  107. #endif // !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG)
  108. #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_POINTER) && defined(UINTPTR_MAX)
  109. #if (UINTPTR_MAX == 0xffff)
  110. #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 2
  111. #elif (UINTPTR_MAX == 0xffffffff)
  112. #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 4
  113. #elif (UINTPTR_MAX == UINT64_C(0xffffffffffffffff))
  114. #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 8
  115. #endif
  116. #endif // !defined(BOOST_ATOMIC_DETAIL_SIZEOF_POINTER) && defined(UINTPTR_MAX)
  117. #endif
  118. #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)
  119. #include <wchar.h>
  120. #if defined(_MSC_VER) && (_MSC_VER <= 1310 || defined(UNDER_CE) && _MSC_VER <= 1500)
  121. // MSVC 7.1 and MSVC 8 (arm) define WCHAR_MAX to a value not suitable for constant expressions
  122. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2
  123. #elif (WCHAR_MAX == 0xff) || (WCHAR_MAX == 0x7f)
  124. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 1
  125. #elif (WCHAR_MAX == 0xffff) || (WCHAR_MAX == 0x7fff)
  126. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2
  127. #elif (WCHAR_MAX == 0xffffffff) || (WCHAR_MAX == 0x7fffffff)
  128. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 4
  129. #elif (WCHAR_MAX == UINT64_C(0xffffffffffffffff)) || (WCHAR_MAX == INT64_C(0x7fffffffffffffff))
  130. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 8
  131. #endif
  132. #endif
  133. #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\
  134. !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG) ||\
  135. !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)
  136. #error Boost.Atomic: Failed to determine builtin integer sizes, the target platform is not supported. Please, report to the developers (patches are welcome).
  137. #endif
  138. #endif // BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_