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