int_sizes.hpp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  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_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. // Try to deduce sizes from limits
  47. #include <limits.h>
  48. #include <boost/cstdint.hpp>
  49. #if (USHRT_MAX + 0) == 0xff
  50. #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 1
  51. #elif (USHRT_MAX + 0) == 0xffff
  52. #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 2
  53. #elif (USHRT_MAX + 0) == 0xffffffff
  54. #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 4
  55. #elif (USHRT_MAX + 0) == UINT64_C(0xffffffffffffffff)
  56. #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 8
  57. #endif
  58. #if (UINT_MAX + 0) == 0xff
  59. #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 1
  60. #elif (UINT_MAX + 0) == 0xffff
  61. #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 2
  62. #elif (UINT_MAX + 0) == 0xffffffff
  63. #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 4
  64. #elif (UINT_MAX + 0) == UINT64_C(0xffffffffffffffff)
  65. #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 8
  66. #endif
  67. #if (ULONG_MAX + 0) == 0xff
  68. #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 1
  69. #elif (ULONG_MAX + 0) == 0xffff
  70. #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 2
  71. #elif (ULONG_MAX + 0) == 0xffffffff
  72. #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 4
  73. #elif (ULONG_MAX + 0) == UINT64_C(0xffffffffffffffff)
  74. #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 8
  75. #endif
  76. #if defined(__hpux) // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
  77. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8
  78. #else
  79. // The list of the non-standard macros (the ones except ULLONG_MAX) is taken from cstdint.hpp
  80. #if defined(ULLONG_MAX)
  81. #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULLONG_MAX
  82. #elif defined(ULONG_LONG_MAX)
  83. #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONG_LONG_MAX
  84. #elif defined(ULONGLONG_MAX)
  85. #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONGLONG_MAX
  86. #elif defined(_LLONG_MAX) // strangely enough, this one seems to be holding the limit for the unsigned integer
  87. #define BOOST_ATOMIC_DETAIL_ULLONG_MAX _LLONG_MAX
  88. #endif
  89. #if (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xff
  90. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 1
  91. #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffff
  92. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 2
  93. #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffffffff
  94. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 4
  95. #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == UINT64_C(0xffffffffffffffff)
  96. #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8
  97. #endif
  98. #endif // defined(__hpux)
  99. #endif
  100. #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)
  101. #include <wchar.h>
  102. #include <boost/cstdint.hpp>
  103. #if defined(_MSC_VER) && (_MSC_VER <= 1310 || defined(UNDER_CE) && _MSC_VER <= 1500)
  104. // MSVC 7.1 and MSVC 8 (arm) define WCHAR_MAX to a value not suitable for constant expressions
  105. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2
  106. #elif (WCHAR_MAX + 0) == 0xff || (WCHAR_MAX + 0) == 0x7f
  107. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 1
  108. #elif (WCHAR_MAX + 0) == 0xffff || (WCHAR_MAX + 0) == 0x7fff
  109. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2
  110. #elif (WCHAR_MAX + 0) == 0xffffffff || (WCHAR_MAX + 0) == 0x7fffffff
  111. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 4
  112. #elif (WCHAR_MAX + 0) == UINT64_C(0xffffffffffffffff) || (WCHAR_MAX + 0) == INT64_C(0x7fffffffffffffff)
  113. #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 8
  114. #endif
  115. #endif
  116. #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\
  117. !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG) ||\
  118. !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)
  119. #error Boost.Atomic: Failed to determine builtin integer sizes, the target platform is not supported. Please, report to the developers (patches are welcome).
  120. #endif
  121. #endif // BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_