blob: 5c7434d9bd0fd4b96f72c7c2bac723d585d8574e [file] [log] [blame]
Brian Silverman7e171022018-08-05 00:17:49 -07001/*
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_