]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/atomic/include/boost/atomic/detail/int_sizes.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / atomic / include / boost / atomic / detail / int_sizes.hpp
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
14 #ifndef BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_
15 #define BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_
16
17 #include <boost/atomic/detail/config.hpp>
18
19 #ifdef BOOST_HAS_PRAGMA_ONCE
20 #pragma once
21 #endif
22
23 // GCC and compatible compilers define internal macros with builtin type traits
24 #if defined(__SIZEOF_SHORT__)
25 #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT __SIZEOF_SHORT__
26 #endif
27 #if defined(__SIZEOF_INT__)
28 #define BOOST_ATOMIC_DETAIL_SIZEOF_INT __SIZEOF_INT__
29 #endif
30 #if defined(__SIZEOF_LONG__)
31 #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG __SIZEOF_LONG__
32 #endif
33 #if defined(__SIZEOF_LONG_LONG__)
34 #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG __SIZEOF_LONG_LONG__
35 #endif
36 #if defined(__SIZEOF_WCHAR_T__)
37 #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T __SIZEOF_WCHAR_T__
38 #endif
39 #if defined(__SIZEOF_POINTER__)
40 #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER __SIZEOF_POINTER__
41 #elif defined(_MSC_VER)
42 #if defined(_M_AMD64) || defined(_M_IA64)
43 #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 8
44 #else
45 #define BOOST_ATOMIC_DETAIL_SIZEOF_POINTER 4
46 #endif
47 #endif
48
49 #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\
50 !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG)
51
52 // Try to deduce sizes from limits
53 #include <limits.h>
54 #include <boost/cstdint.hpp>
55
56 #if (USHRT_MAX + 0) == 0xff
57 #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 1
58 #elif (USHRT_MAX + 0) == 0xffff
59 #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 2
60 #elif (USHRT_MAX + 0) == 0xffffffff
61 #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 4
62 #elif (USHRT_MAX + 0) == UINT64_C(0xffffffffffffffff)
63 #define BOOST_ATOMIC_DETAIL_SIZEOF_SHORT 8
64 #endif
65
66 #if (UINT_MAX + 0) == 0xff
67 #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 1
68 #elif (UINT_MAX + 0) == 0xffff
69 #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 2
70 #elif (UINT_MAX + 0) == 0xffffffff
71 #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 4
72 #elif (UINT_MAX + 0) == UINT64_C(0xffffffffffffffff)
73 #define BOOST_ATOMIC_DETAIL_SIZEOF_INT 8
74 #endif
75
76 #if (ULONG_MAX + 0) == 0xff
77 #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 1
78 #elif (ULONG_MAX + 0) == 0xffff
79 #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 2
80 #elif (ULONG_MAX + 0) == 0xffffffff
81 #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 4
82 #elif (ULONG_MAX + 0) == UINT64_C(0xffffffffffffffff)
83 #define BOOST_ATOMIC_DETAIL_SIZEOF_LONG 8
84 #endif
85
86 #if defined(__hpux) // HP-UX's value of ULONG_LONG_MAX is unusable in preprocessor expressions
87 #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8
88 #else
89
90 // The list of the non-standard macros (the ones except ULLONG_MAX) is taken from cstdint.hpp
91 #if defined(ULLONG_MAX)
92 #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULLONG_MAX
93 #elif defined(ULONG_LONG_MAX)
94 #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONG_LONG_MAX
95 #elif defined(ULONGLONG_MAX)
96 #define BOOST_ATOMIC_DETAIL_ULLONG_MAX ULONGLONG_MAX
97 #elif defined(_LLONG_MAX) // strangely enough, this one seems to be holding the limit for the unsigned integer
98 #define BOOST_ATOMIC_DETAIL_ULLONG_MAX _LLONG_MAX
99 #endif
100
101 #if (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xff
102 #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 1
103 #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffff
104 #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 2
105 #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == 0xffffffff
106 #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 4
107 #elif (BOOST_ATOMIC_DETAIL_ULLONG_MAX + 0) == UINT64_C(0xffffffffffffffff)
108 #define BOOST_ATOMIC_DETAIL_SIZEOF_LLONG 8
109 #endif
110
111 #endif // defined(__hpux)
112
113 #endif
114
115 #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)
116
117 #include <wchar.h>
118 #include <boost/cstdint.hpp>
119
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 + 0) == 0xff || (WCHAR_MAX + 0) == 0x7f
124 #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 1
125 #elif (WCHAR_MAX + 0) == 0xffff || (WCHAR_MAX + 0) == 0x7fff
126 #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 2
127 #elif (WCHAR_MAX + 0) == 0xffffffff || (WCHAR_MAX + 0) == 0x7fffffff
128 #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 4
129 #elif (WCHAR_MAX + 0) == UINT64_C(0xffffffffffffffff) || (WCHAR_MAX + 0) == INT64_C(0x7fffffffffffffff)
130 #define BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T 8
131 #endif
132 #endif
133
134 #if !defined(BOOST_ATOMIC_DETAIL_SIZEOF_SHORT) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_INT) ||\
135 !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG) || !defined(BOOST_ATOMIC_DETAIL_SIZEOF_LLONG) ||\
136 !defined(BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T)
137 #error Boost.Atomic: Failed to determine builtin integer sizes, the target platform is not supported. Please, report to the developers.
138 #endif
139
140 #endif // BOOST_ATOMIC_DETAIL_INT_SIZES_HPP_INCLUDED_