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/capabilities.hpp
10  *
11  * This header defines feature capabilities macros.
12  */
13 
14 #ifndef BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_
15 #define BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_
16 
17 #include <boost/atomic/detail/config.hpp>
18 #include <boost/atomic/detail/platform.hpp>
19 #include <boost/atomic/detail/int_sizes.hpp>
20 #if !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
21 #include <boost/atomic/detail/float_sizes.hpp>
22 #endif
23 
24 #if !defined(BOOST_ATOMIC_EMULATED)
25 #include BOOST_ATOMIC_DETAIL_BACKEND_HEADER(boost/atomic/detail/caps_)
26 #endif
27 
28 #ifdef BOOST_HAS_PRAGMA_ONCE
29 #pragma once
30 #endif
31 
32 #ifndef BOOST_ATOMIC_INT8_LOCK_FREE
33 #define BOOST_ATOMIC_INT8_LOCK_FREE 0
34 #endif
35 
36 #ifndef BOOST_ATOMIC_INT16_LOCK_FREE
37 #define BOOST_ATOMIC_INT16_LOCK_FREE 0
38 #endif
39 
40 #ifndef BOOST_ATOMIC_INT32_LOCK_FREE
41 #define BOOST_ATOMIC_INT32_LOCK_FREE 0
42 #endif
43 
44 #ifndef BOOST_ATOMIC_INT64_LOCK_FREE
45 #define BOOST_ATOMIC_INT64_LOCK_FREE 0
46 #endif
47 
48 #ifndef BOOST_ATOMIC_INT128_LOCK_FREE
49 #define BOOST_ATOMIC_INT128_LOCK_FREE 0
50 #endif
51 
52 
53 #ifndef BOOST_ATOMIC_CHAR_LOCK_FREE
54 #define BOOST_ATOMIC_CHAR_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
55 #endif
56 
57 #ifndef BOOST_ATOMIC_CHAR16_T_LOCK_FREE
58 #define BOOST_ATOMIC_CHAR16_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
59 #endif
60 
61 #ifndef BOOST_ATOMIC_CHAR32_T_LOCK_FREE
62 #define BOOST_ATOMIC_CHAR32_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
63 #endif
64 
65 #ifndef BOOST_ATOMIC_WCHAR_T_LOCK_FREE
66 #if BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 1
67 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
68 #elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 2
69 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
70 #elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 4
71 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
72 #elif BOOST_ATOMIC_DETAIL_SIZEOF_WCHAR_T == 8
73 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
74 #else
75 #define BOOST_ATOMIC_WCHAR_T_LOCK_FREE 0
76 #endif
77 #endif
78 
79 #ifndef BOOST_ATOMIC_SHORT_LOCK_FREE
80 #if BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 1
81 #define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
82 #elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 2
83 #define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
84 #elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 4
85 #define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
86 #elif BOOST_ATOMIC_DETAIL_SIZEOF_SHORT == 8
87 #define BOOST_ATOMIC_SHORT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
88 #else
89 #define BOOST_ATOMIC_SHORT_LOCK_FREE 0
90 #endif
91 #endif
92 
93 #ifndef BOOST_ATOMIC_INT_LOCK_FREE
94 #if BOOST_ATOMIC_DETAIL_SIZEOF_INT == 1
95 #define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
96 #elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 2
97 #define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
98 #elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 4
99 #define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
100 #elif BOOST_ATOMIC_DETAIL_SIZEOF_INT == 8
101 #define BOOST_ATOMIC_INT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
102 #else
103 #define BOOST_ATOMIC_INT_LOCK_FREE 0
104 #endif
105 #endif
106 
107 #ifndef BOOST_ATOMIC_LONG_LOCK_FREE
108 #if BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 1
109 #define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
110 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 2
111 #define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
112 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 4
113 #define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
114 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG == 8
115 #define BOOST_ATOMIC_LONG_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
116 #else
117 #define BOOST_ATOMIC_LONG_LOCK_FREE 0
118 #endif
119 #endif
120 
121 #ifndef BOOST_ATOMIC_LLONG_LOCK_FREE
122 #if BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 1
123 #define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
124 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 2
125 #define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
126 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 4
127 #define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
128 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LLONG == 8
129 #define BOOST_ATOMIC_LLONG_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
130 #else
131 #define BOOST_ATOMIC_LLONG_LOCK_FREE 0
132 #endif
133 #endif
134 
135 #ifndef BOOST_ATOMIC_POINTER_LOCK_FREE
136 #if (BOOST_ATOMIC_DETAIL_SIZEOF_POINTER + 0) == 8
137 #define BOOST_ATOMIC_POINTER_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
138 #elif (BOOST_ATOMIC_DETAIL_SIZEOF_POINTER + 0) == 4
139 #define BOOST_ATOMIC_POINTER_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
140 #else
141 #define BOOST_ATOMIC_POINTER_LOCK_FREE 0
142 #endif
143 #endif
144 
145 #define BOOST_ATOMIC_ADDRESS_LOCK_FREE BOOST_ATOMIC_POINTER_LOCK_FREE
146 
147 #ifndef BOOST_ATOMIC_BOOL_LOCK_FREE
148 // We store bools in 1-byte storage in all backends
149 #define BOOST_ATOMIC_BOOL_LOCK_FREE BOOST_ATOMIC_INT8_LOCK_FREE
150 #endif
151 
152 #ifndef BOOST_ATOMIC_FLAG_LOCK_FREE
153 #define BOOST_ATOMIC_FLAG_LOCK_FREE BOOST_ATOMIC_BOOL_LOCK_FREE
154 #endif
155 
156 #if !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
157 
158 #if !defined(BOOST_ATOMIC_FLOAT_LOCK_FREE) && defined(BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT)
159 #if BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 2
160 #define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
161 #elif BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 4
162 #define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
163 #elif BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 8
164 #define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
165 #elif BOOST_ATOMIC_DETAIL_SIZEOF_FLOAT == 16
166 #define BOOST_ATOMIC_FLOAT_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE
167 #else
168 #define BOOST_ATOMIC_FLOAT_LOCK_FREE 0
169 #endif
170 #endif
171 
172 #if !defined(BOOST_ATOMIC_DOUBLE_LOCK_FREE) && defined(BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE)
173 #if BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 2
174 #define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
175 #elif BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 4
176 #define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
177 #elif BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 8
178 #define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
179 #elif BOOST_ATOMIC_DETAIL_SIZEOF_DOUBLE == 16
180 #define BOOST_ATOMIC_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE
181 #else
182 #define BOOST_ATOMIC_DOUBLE_LOCK_FREE 0
183 #endif
184 #endif
185 
186 #if !defined(BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE) && defined(BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE)
187 #if BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 2
188 #define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT16_LOCK_FREE
189 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 4
190 #define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT32_LOCK_FREE
191 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 8
192 #define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT64_LOCK_FREE
193 #elif BOOST_ATOMIC_DETAIL_SIZEOF_LONG_DOUBLE == 16
194 #define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE BOOST_ATOMIC_INT128_LOCK_FREE
195 #else
196 #define BOOST_ATOMIC_LONG_DOUBLE_LOCK_FREE 0
197 #endif
198 #endif
199 
200 #endif // !defined(BOOST_ATOMIC_NO_FLOATING_POINT)
201 
202 #ifndef BOOST_ATOMIC_THREAD_FENCE
203 #define BOOST_ATOMIC_THREAD_FENCE 0
204 #endif
205 
206 #ifndef BOOST_ATOMIC_SIGNAL_FENCE
207 #define BOOST_ATOMIC_SIGNAL_FENCE 0
208 #endif
209 
210 #endif // BOOST_ATOMIC_CAPABILITIES_HPP_INCLUDED_
211