xref: /freebsd/contrib/llvm-project/libcxx/include/__cxx03/atomic (revision 700637cbb5e582861067a11aaca4d053546871d2)
1*700637cbSDimitry Andric// -*- C++ -*-
2*700637cbSDimitry Andric//===----------------------------------------------------------------------===//
3*700637cbSDimitry Andric//
4*700637cbSDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5*700637cbSDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
6*700637cbSDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7*700637cbSDimitry Andric//
8*700637cbSDimitry Andric//===----------------------------------------------------------------------===//
9*700637cbSDimitry Andric
10*700637cbSDimitry Andric#ifndef _LIBCPP___CXX03_ATOMIC
11*700637cbSDimitry Andric#define _LIBCPP___CXX03_ATOMIC
12*700637cbSDimitry Andric
13*700637cbSDimitry Andric/*
14*700637cbSDimitry Andric    atomic synopsis
15*700637cbSDimitry Andric
16*700637cbSDimitry Andricnamespace std
17*700637cbSDimitry Andric{
18*700637cbSDimitry Andric
19*700637cbSDimitry Andric// feature test macro [version.syn]
20*700637cbSDimitry Andric
21*700637cbSDimitry Andric#define __cpp_lib_atomic_is_always_lock_free
22*700637cbSDimitry Andric#define __cpp_lib_atomic_flag_test
23*700637cbSDimitry Andric#define __cpp_lib_atomic_lock_free_type_aliases
24*700637cbSDimitry Andric#define __cpp_lib_atomic_wait
25*700637cbSDimitry Andric
26*700637cbSDimitry Andric // order and consistency
27*700637cbSDimitry Andric
28*700637cbSDimitry Andric enum memory_order: unspecified // enum class in C++20
29*700637cbSDimitry Andric {
30*700637cbSDimitry Andric    relaxed,
31*700637cbSDimitry Andric    consume, // load-consume
32*700637cbSDimitry Andric    acquire, // load-acquire
33*700637cbSDimitry Andric    release, // store-release
34*700637cbSDimitry Andric    acq_rel, // store-release load-acquire
35*700637cbSDimitry Andric    seq_cst // store-release load-acquire
36*700637cbSDimitry Andric };
37*700637cbSDimitry Andric
38*700637cbSDimitry Andric inline constexpr auto memory_order_relaxed = memory_order::relaxed;
39*700637cbSDimitry Andric inline constexpr auto memory_order_consume = memory_order::consume;
40*700637cbSDimitry Andric inline constexpr auto memory_order_acquire = memory_order::acquire;
41*700637cbSDimitry Andric inline constexpr auto memory_order_release = memory_order::release;
42*700637cbSDimitry Andric inline constexpr auto memory_order_acq_rel = memory_order::acq_rel;
43*700637cbSDimitry Andric inline constexpr auto memory_order_seq_cst = memory_order::seq_cst;
44*700637cbSDimitry Andric
45*700637cbSDimitry Andrictemplate <class T> T kill_dependency(T y) noexcept;
46*700637cbSDimitry Andric
47*700637cbSDimitry Andric// lock-free property
48*700637cbSDimitry Andric
49*700637cbSDimitry Andric#define ATOMIC_BOOL_LOCK_FREE unspecified
50*700637cbSDimitry Andric#define ATOMIC_CHAR_LOCK_FREE unspecified
51*700637cbSDimitry Andric#define ATOMIC_CHAR8_T_LOCK_FREE unspecified // C++20
52*700637cbSDimitry Andric#define ATOMIC_CHAR16_T_LOCK_FREE unspecified
53*700637cbSDimitry Andric#define ATOMIC_CHAR32_T_LOCK_FREE unspecified
54*700637cbSDimitry Andric#define ATOMIC_WCHAR_T_LOCK_FREE unspecified
55*700637cbSDimitry Andric#define ATOMIC_SHORT_LOCK_FREE unspecified
56*700637cbSDimitry Andric#define ATOMIC_INT_LOCK_FREE unspecified
57*700637cbSDimitry Andric#define ATOMIC_LONG_LOCK_FREE unspecified
58*700637cbSDimitry Andric#define ATOMIC_LLONG_LOCK_FREE unspecified
59*700637cbSDimitry Andric#define ATOMIC_POINTER_LOCK_FREE unspecified
60*700637cbSDimitry Andric
61*700637cbSDimitry Andrictemplate <class T>
62*700637cbSDimitry Andricstruct atomic
63*700637cbSDimitry Andric{
64*700637cbSDimitry Andric    using value_type = T;
65*700637cbSDimitry Andric
66*700637cbSDimitry Andric    static constexpr bool is_always_lock_free;
67*700637cbSDimitry Andric    bool is_lock_free() const volatile noexcept;
68*700637cbSDimitry Andric    bool is_lock_free() const noexcept;
69*700637cbSDimitry Andric
70*700637cbSDimitry Andric    atomic() noexcept = default; // until C++20
71*700637cbSDimitry Andric    constexpr atomic() noexcept(is_nothrow_default_constructible_v<T>); // since C++20
72*700637cbSDimitry Andric    constexpr atomic(T desr) noexcept;
73*700637cbSDimitry Andric    atomic(const atomic&) = delete;
74*700637cbSDimitry Andric    atomic& operator=(const atomic&) = delete;
75*700637cbSDimitry Andric    atomic& operator=(const atomic&) volatile = delete;
76*700637cbSDimitry Andric
77*700637cbSDimitry Andric    T load(memory_order m = memory_order_seq_cst) const volatile noexcept;
78*700637cbSDimitry Andric    T load(memory_order m = memory_order_seq_cst) const noexcept;
79*700637cbSDimitry Andric    operator T() const volatile noexcept;
80*700637cbSDimitry Andric    operator T() const noexcept;
81*700637cbSDimitry Andric    void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;
82*700637cbSDimitry Andric    void store(T desr, memory_order m = memory_order_seq_cst) noexcept;
83*700637cbSDimitry Andric    T operator=(T) volatile noexcept;
84*700637cbSDimitry Andric    T operator=(T) noexcept;
85*700637cbSDimitry Andric
86*700637cbSDimitry Andric    T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept;
87*700637cbSDimitry Andric    T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept;
88*700637cbSDimitry Andric    bool compare_exchange_weak(T& expc, T desr,
89*700637cbSDimitry Andric                               memory_order s, memory_order f) volatile noexcept;
90*700637cbSDimitry Andric    bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f) noexcept;
91*700637cbSDimitry Andric    bool compare_exchange_strong(T& expc, T desr,
92*700637cbSDimitry Andric                                 memory_order s, memory_order f) volatile noexcept;
93*700637cbSDimitry Andric    bool compare_exchange_strong(T& expc, T desr,
94*700637cbSDimitry Andric                                 memory_order s, memory_order f) noexcept;
95*700637cbSDimitry Andric    bool compare_exchange_weak(T& expc, T desr,
96*700637cbSDimitry Andric                               memory_order m = memory_order_seq_cst) volatile noexcept;
97*700637cbSDimitry Andric    bool compare_exchange_weak(T& expc, T desr,
98*700637cbSDimitry Andric                               memory_order m = memory_order_seq_cst) noexcept;
99*700637cbSDimitry Andric    bool compare_exchange_strong(T& expc, T desr,
100*700637cbSDimitry Andric                                memory_order m = memory_order_seq_cst) volatile noexcept;
101*700637cbSDimitry Andric    bool compare_exchange_strong(T& expc, T desr,
102*700637cbSDimitry Andric                                 memory_order m = memory_order_seq_cst) noexcept;
103*700637cbSDimitry Andric
104*700637cbSDimitry Andric    void wait(T, memory_order = memory_order::seq_cst) const volatile noexcept;
105*700637cbSDimitry Andric    void wait(T, memory_order = memory_order::seq_cst) const noexcept;
106*700637cbSDimitry Andric    void notify_one() volatile noexcept;
107*700637cbSDimitry Andric    void notify_one() noexcept;
108*700637cbSDimitry Andric    void notify_all() volatile noexcept;
109*700637cbSDimitry Andric    void notify_all() noexcept;
110*700637cbSDimitry Andric};
111*700637cbSDimitry Andric
112*700637cbSDimitry Andrictemplate <>
113*700637cbSDimitry Andricstruct atomic<integral>
114*700637cbSDimitry Andric{
115*700637cbSDimitry Andric    using value_type = integral;
116*700637cbSDimitry Andric    using difference_type = value_type;
117*700637cbSDimitry Andric
118*700637cbSDimitry Andric    static constexpr bool is_always_lock_free;
119*700637cbSDimitry Andric    bool is_lock_free() const volatile noexcept;
120*700637cbSDimitry Andric    bool is_lock_free() const noexcept;
121*700637cbSDimitry Andric
122*700637cbSDimitry Andric    atomic() noexcept = default;
123*700637cbSDimitry Andric    constexpr atomic(integral desr) noexcept;
124*700637cbSDimitry Andric    atomic(const atomic&) = delete;
125*700637cbSDimitry Andric    atomic& operator=(const atomic&) = delete;
126*700637cbSDimitry Andric    atomic& operator=(const atomic&) volatile = delete;
127*700637cbSDimitry Andric
128*700637cbSDimitry Andric    integral load(memory_order m = memory_order_seq_cst) const volatile noexcept;
129*700637cbSDimitry Andric    integral load(memory_order m = memory_order_seq_cst) const noexcept;
130*700637cbSDimitry Andric    operator integral() const volatile noexcept;
131*700637cbSDimitry Andric    operator integral() const noexcept;
132*700637cbSDimitry Andric    void store(integral desr, memory_order m = memory_order_seq_cst) volatile noexcept;
133*700637cbSDimitry Andric    void store(integral desr, memory_order m = memory_order_seq_cst) noexcept;
134*700637cbSDimitry Andric    integral operator=(integral desr) volatile noexcept;
135*700637cbSDimitry Andric    integral operator=(integral desr) noexcept;
136*700637cbSDimitry Andric
137*700637cbSDimitry Andric    integral exchange(integral desr,
138*700637cbSDimitry Andric                      memory_order m = memory_order_seq_cst) volatile noexcept;
139*700637cbSDimitry Andric    integral exchange(integral desr, memory_order m = memory_order_seq_cst) noexcept;
140*700637cbSDimitry Andric    bool compare_exchange_weak(integral& expc, integral desr,
141*700637cbSDimitry Andric                               memory_order s, memory_order f) volatile noexcept;
142*700637cbSDimitry Andric    bool compare_exchange_weak(integral& expc, integral desr,
143*700637cbSDimitry Andric                               memory_order s, memory_order f) noexcept;
144*700637cbSDimitry Andric    bool compare_exchange_strong(integral& expc, integral desr,
145*700637cbSDimitry Andric                                 memory_order s, memory_order f) volatile noexcept;
146*700637cbSDimitry Andric    bool compare_exchange_strong(integral& expc, integral desr,
147*700637cbSDimitry Andric                                 memory_order s, memory_order f) noexcept;
148*700637cbSDimitry Andric    bool compare_exchange_weak(integral& expc, integral desr,
149*700637cbSDimitry Andric                               memory_order m = memory_order_seq_cst) volatile noexcept;
150*700637cbSDimitry Andric    bool compare_exchange_weak(integral& expc, integral desr,
151*700637cbSDimitry Andric                               memory_order m = memory_order_seq_cst) noexcept;
152*700637cbSDimitry Andric    bool compare_exchange_strong(integral& expc, integral desr,
153*700637cbSDimitry Andric                                memory_order m = memory_order_seq_cst) volatile noexcept;
154*700637cbSDimitry Andric    bool compare_exchange_strong(integral& expc, integral desr,
155*700637cbSDimitry Andric                                 memory_order m = memory_order_seq_cst) noexcept;
156*700637cbSDimitry Andric
157*700637cbSDimitry Andric    integral fetch_add(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
158*700637cbSDimitry Andric    integral fetch_add(integral op, memory_order m = memory_order_seq_cst) noexcept;
159*700637cbSDimitry Andric    integral fetch_sub(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
160*700637cbSDimitry Andric    integral fetch_sub(integral op, memory_order m = memory_order_seq_cst) noexcept;
161*700637cbSDimitry Andric    integral fetch_and(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
162*700637cbSDimitry Andric    integral fetch_and(integral op, memory_order m = memory_order_seq_cst) noexcept;
163*700637cbSDimitry Andric    integral fetch_or(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
164*700637cbSDimitry Andric    integral fetch_or(integral op, memory_order m = memory_order_seq_cst) noexcept;
165*700637cbSDimitry Andric    integral fetch_xor(integral op, memory_order m = memory_order_seq_cst) volatile noexcept;
166*700637cbSDimitry Andric    integral fetch_xor(integral op, memory_order m = memory_order_seq_cst) noexcept;
167*700637cbSDimitry Andric
168*700637cbSDimitry Andric    integral operator++(int) volatile noexcept;
169*700637cbSDimitry Andric    integral operator++(int) noexcept;
170*700637cbSDimitry Andric    integral operator--(int) volatile noexcept;
171*700637cbSDimitry Andric    integral operator--(int) noexcept;
172*700637cbSDimitry Andric    integral operator++() volatile noexcept;
173*700637cbSDimitry Andric    integral operator++() noexcept;
174*700637cbSDimitry Andric    integral operator--() volatile noexcept;
175*700637cbSDimitry Andric    integral operator--() noexcept;
176*700637cbSDimitry Andric    integral operator+=(integral op) volatile noexcept;
177*700637cbSDimitry Andric    integral operator+=(integral op) noexcept;
178*700637cbSDimitry Andric    integral operator-=(integral op) volatile noexcept;
179*700637cbSDimitry Andric    integral operator-=(integral op) noexcept;
180*700637cbSDimitry Andric    integral operator&=(integral op) volatile noexcept;
181*700637cbSDimitry Andric    integral operator&=(integral op) noexcept;
182*700637cbSDimitry Andric    integral operator|=(integral op) volatile noexcept;
183*700637cbSDimitry Andric    integral operator|=(integral op) noexcept;
184*700637cbSDimitry Andric    integral operator^=(integral op) volatile noexcept;
185*700637cbSDimitry Andric    integral operator^=(integral op) noexcept;
186*700637cbSDimitry Andric
187*700637cbSDimitry Andric    void wait(integral, memory_order = memory_order::seq_cst) const volatile noexcept;
188*700637cbSDimitry Andric    void wait(integral, memory_order = memory_order::seq_cst) const noexcept;
189*700637cbSDimitry Andric    void notify_one() volatile noexcept;
190*700637cbSDimitry Andric    void notify_one() noexcept;
191*700637cbSDimitry Andric    void notify_all() volatile noexcept;
192*700637cbSDimitry Andric    void notify_all() noexcept;
193*700637cbSDimitry Andric};
194*700637cbSDimitry Andric
195*700637cbSDimitry Andrictemplate <class T>
196*700637cbSDimitry Andricstruct atomic<T*>
197*700637cbSDimitry Andric{
198*700637cbSDimitry Andric    using value_type = T*;
199*700637cbSDimitry Andric    using difference_type = ptrdiff_t;
200*700637cbSDimitry Andric
201*700637cbSDimitry Andric    static constexpr bool is_always_lock_free;
202*700637cbSDimitry Andric    bool is_lock_free() const volatile noexcept;
203*700637cbSDimitry Andric    bool is_lock_free() const noexcept;
204*700637cbSDimitry Andric
205*700637cbSDimitry Andric    atomic() noexcept = default; // until C++20
206*700637cbSDimitry Andric    constexpr atomic() noexcept; // since C++20
207*700637cbSDimitry Andric    constexpr atomic(T* desr) noexcept;
208*700637cbSDimitry Andric    atomic(const atomic&) = delete;
209*700637cbSDimitry Andric    atomic& operator=(const atomic&) = delete;
210*700637cbSDimitry Andric    atomic& operator=(const atomic&) volatile = delete;
211*700637cbSDimitry Andric
212*700637cbSDimitry Andric    T* load(memory_order m = memory_order_seq_cst) const volatile noexcept;
213*700637cbSDimitry Andric    T* load(memory_order m = memory_order_seq_cst) const noexcept;
214*700637cbSDimitry Andric    operator T*() const volatile noexcept;
215*700637cbSDimitry Andric    operator T*() const noexcept;
216*700637cbSDimitry Andric    void store(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept;
217*700637cbSDimitry Andric    void store(T* desr, memory_order m = memory_order_seq_cst) noexcept;
218*700637cbSDimitry Andric    T* operator=(T*) volatile noexcept;
219*700637cbSDimitry Andric    T* operator=(T*) noexcept;
220*700637cbSDimitry Andric
221*700637cbSDimitry Andric    T* exchange(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept;
222*700637cbSDimitry Andric    T* exchange(T* desr, memory_order m = memory_order_seq_cst) noexcept;
223*700637cbSDimitry Andric    bool compare_exchange_weak(T*& expc, T* desr,
224*700637cbSDimitry Andric                               memory_order s, memory_order f) volatile noexcept;
225*700637cbSDimitry Andric    bool compare_exchange_weak(T*& expc, T* desr,
226*700637cbSDimitry Andric                               memory_order s, memory_order f) noexcept;
227*700637cbSDimitry Andric    bool compare_exchange_strong(T*& expc, T* desr,
228*700637cbSDimitry Andric                                 memory_order s, memory_order f) volatile noexcept;
229*700637cbSDimitry Andric    bool compare_exchange_strong(T*& expc, T* desr,
230*700637cbSDimitry Andric                                 memory_order s, memory_order f) noexcept;
231*700637cbSDimitry Andric    bool compare_exchange_weak(T*& expc, T* desr,
232*700637cbSDimitry Andric                               memory_order m = memory_order_seq_cst) volatile noexcept;
233*700637cbSDimitry Andric    bool compare_exchange_weak(T*& expc, T* desr,
234*700637cbSDimitry Andric                               memory_order m = memory_order_seq_cst) noexcept;
235*700637cbSDimitry Andric    bool compare_exchange_strong(T*& expc, T* desr,
236*700637cbSDimitry Andric                                memory_order m = memory_order_seq_cst) volatile noexcept;
237*700637cbSDimitry Andric    bool compare_exchange_strong(T*& expc, T* desr,
238*700637cbSDimitry Andric                                 memory_order m = memory_order_seq_cst) noexcept;
239*700637cbSDimitry Andric    T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept;
240*700637cbSDimitry Andric    T* fetch_add(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept;
241*700637cbSDimitry Andric    T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept;
242*700637cbSDimitry Andric    T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept;
243*700637cbSDimitry Andric
244*700637cbSDimitry Andric    T* operator++(int) volatile noexcept;
245*700637cbSDimitry Andric    T* operator++(int) noexcept;
246*700637cbSDimitry Andric    T* operator--(int) volatile noexcept;
247*700637cbSDimitry Andric    T* operator--(int) noexcept;
248*700637cbSDimitry Andric    T* operator++() volatile noexcept;
249*700637cbSDimitry Andric    T* operator++() noexcept;
250*700637cbSDimitry Andric    T* operator--() volatile noexcept;
251*700637cbSDimitry Andric    T* operator--() noexcept;
252*700637cbSDimitry Andric    T* operator+=(ptrdiff_t op) volatile noexcept;
253*700637cbSDimitry Andric    T* operator+=(ptrdiff_t op) noexcept;
254*700637cbSDimitry Andric    T* operator-=(ptrdiff_t op) volatile noexcept;
255*700637cbSDimitry Andric    T* operator-=(ptrdiff_t op) noexcept;
256*700637cbSDimitry Andric
257*700637cbSDimitry Andric    void wait(T*, memory_order = memory_order::seq_cst) const volatile noexcept;
258*700637cbSDimitry Andric    void wait(T*, memory_order = memory_order::seq_cst) const noexcept;
259*700637cbSDimitry Andric    void notify_one() volatile noexcept;
260*700637cbSDimitry Andric    void notify_one() noexcept;
261*700637cbSDimitry Andric    void notify_all() volatile noexcept;
262*700637cbSDimitry Andric    void notify_all() noexcept;
263*700637cbSDimitry Andric};
264*700637cbSDimitry Andric
265*700637cbSDimitry Andrictemplate<>
266*700637cbSDimitry Andricstruct atomic<floating-point-type> {  // since C++20
267*700637cbSDimitry Andric  using value_type = floating-point-type;
268*700637cbSDimitry Andric  using difference_type = value_type;
269*700637cbSDimitry Andric
270*700637cbSDimitry Andric  static constexpr bool is_always_lock_free = implementation-defined;
271*700637cbSDimitry Andric  bool is_lock_free() const volatile noexcept;
272*700637cbSDimitry Andric  bool is_lock_free() const noexcept;
273*700637cbSDimitry Andric
274*700637cbSDimitry Andric  constexpr atomic() noexcept;
275*700637cbSDimitry Andric  constexpr atomic(floating-point-type) noexcept;
276*700637cbSDimitry Andric  atomic(const atomic&) = delete;
277*700637cbSDimitry Andric  atomic& operator=(const atomic&) = delete;
278*700637cbSDimitry Andric  atomic& operator=(const atomic&) volatile = delete;
279*700637cbSDimitry Andric
280*700637cbSDimitry Andric  void store(floating-point-type, memory_order = memory_order::seq_cst) volatile noexcept;
281*700637cbSDimitry Andric  void store(floating-point-type, memory_order = memory_order::seq_cst) noexcept;
282*700637cbSDimitry Andric  floating-point-type operator=(floating-point-type) volatile noexcept;
283*700637cbSDimitry Andric  floating-point-type operator=(floating-point-type) noexcept;
284*700637cbSDimitry Andric  floating-point-type load(memory_order = memory_order::seq_cst) volatile noexcept;
285*700637cbSDimitry Andric  floating-point-type load(memory_order = memory_order::seq_cst) noexcept;
286*700637cbSDimitry Andric  operator floating-point-type() volatile noexcept;
287*700637cbSDimitry Andric  operator floating-point-type() noexcept;
288*700637cbSDimitry Andric
289*700637cbSDimitry Andric  floating-point-type exchange(floating-point-type,
290*700637cbSDimitry Andric                               memory_order = memory_order::seq_cst) volatile noexcept;
291*700637cbSDimitry Andric  floating-point-type exchange(floating-point-type,
292*700637cbSDimitry Andric                               memory_order = memory_order::seq_cst) noexcept;
293*700637cbSDimitry Andric  bool compare_exchange_weak(floating-point-type&, floating-point-type,
294*700637cbSDimitry Andric                             memory_order, memory_order) volatile noexcept;
295*700637cbSDimitry Andric  bool compare_exchange_weak(floating-point-type&, floating-point-type,
296*700637cbSDimitry Andric                             memory_order, memory_order) noexcept;
297*700637cbSDimitry Andric  bool compare_exchange_strong(floating-point-type&, floating-point-type,
298*700637cbSDimitry Andric                               memory_order, memory_order) volatile noexcept;
299*700637cbSDimitry Andric  bool compare_exchange_strong(floating-point-type&, floating-point-type,
300*700637cbSDimitry Andric                               memory_order, memory_order) noexcept;
301*700637cbSDimitry Andric  bool compare_exchange_weak(floating-point-type&, floating-point-type,
302*700637cbSDimitry Andric                             memory_order = memory_order::seq_cst) volatile noexcept;
303*700637cbSDimitry Andric  bool compare_exchange_weak(floating-point-type&, floating-point-type,
304*700637cbSDimitry Andric                             memory_order = memory_order::seq_cst) noexcept;
305*700637cbSDimitry Andric  bool compare_exchange_strong(floating-point-type&, floating-point-type,
306*700637cbSDimitry Andric                               memory_order = memory_order::seq_cst) volatile noexcept;
307*700637cbSDimitry Andric  bool compare_exchange_strong(floating-point-type&, floating-point-type,
308*700637cbSDimitry Andric                               memory_order = memory_order::seq_cst) noexcept;
309*700637cbSDimitry Andric
310*700637cbSDimitry Andric  floating-point-type fetch_add(floating-point-type,
311*700637cbSDimitry Andric                                memory_order = memory_order::seq_cst) volatile noexcept;
312*700637cbSDimitry Andric  floating-point-type fetch_add(floating-point-type,
313*700637cbSDimitry Andric                                memory_order = memory_order::seq_cst) noexcept;
314*700637cbSDimitry Andric  floating-point-type fetch_sub(floating-point-type,
315*700637cbSDimitry Andric                                memory_order = memory_order::seq_cst) volatile noexcept;
316*700637cbSDimitry Andric  floating-point-type fetch_sub(floating-point-type,
317*700637cbSDimitry Andric                                memory_order = memory_order::seq_cst) noexcept;
318*700637cbSDimitry Andric
319*700637cbSDimitry Andric  floating-point-type operator+=(floating-point-type) volatile noexcept;
320*700637cbSDimitry Andric  floating-point-type operator+=(floating-point-type) noexcept;
321*700637cbSDimitry Andric  floating-point-type operator-=(floating-point-type) volatile noexcept;
322*700637cbSDimitry Andric  floating-point-type operator-=(floating-point-type) noexcept;
323*700637cbSDimitry Andric
324*700637cbSDimitry Andric  void wait(floating-point-type, memory_order = memory_order::seq_cst) const volatile noexcept;
325*700637cbSDimitry Andric  void wait(floating-point-type, memory_order = memory_order::seq_cst) const noexcept;
326*700637cbSDimitry Andric  void notify_one() volatile noexcept;
327*700637cbSDimitry Andric  void notify_one() noexcept;
328*700637cbSDimitry Andric  void notify_all() volatile noexcept;
329*700637cbSDimitry Andric  void notify_all() noexcept;
330*700637cbSDimitry Andric};
331*700637cbSDimitry Andric
332*700637cbSDimitry Andric// [atomics.nonmembers], non-member functions
333*700637cbSDimitry Andrictemplate<class T>
334*700637cbSDimitry Andric  bool atomic_is_lock_free(const volatile atomic<T>*) noexcept;
335*700637cbSDimitry Andrictemplate<class T>
336*700637cbSDimitry Andric  bool atomic_is_lock_free(const atomic<T>*) noexcept;
337*700637cbSDimitry Andrictemplate<class T>
338*700637cbSDimitry Andric  void atomic_store(volatile atomic<T>*, atomic<T>::value_type) noexcept;
339*700637cbSDimitry Andrictemplate<class T>
340*700637cbSDimitry Andric  void atomic_store(atomic<T>*, atomic<T>::value_type) noexcept;
341*700637cbSDimitry Andrictemplate<class T>
342*700637cbSDimitry Andric  void atomic_store_explicit(volatile atomic<T>*, atomic<T>::value_type,
343*700637cbSDimitry Andric                             memory_order) noexcept;
344*700637cbSDimitry Andrictemplate<class T>
345*700637cbSDimitry Andric  void atomic_store_explicit(atomic<T>*, atomic<T>::value_type,
346*700637cbSDimitry Andric                             memory_order) noexcept;
347*700637cbSDimitry Andrictemplate<class T>
348*700637cbSDimitry Andric  T atomic_load(const volatile atomic<T>*) noexcept;
349*700637cbSDimitry Andrictemplate<class T>
350*700637cbSDimitry Andric  T atomic_load(const atomic<T>*) noexcept;
351*700637cbSDimitry Andrictemplate<class T>
352*700637cbSDimitry Andric  T atomic_load_explicit(const volatile atomic<T>*, memory_order) noexcept;
353*700637cbSDimitry Andrictemplate<class T>
354*700637cbSDimitry Andric  T atomic_load_explicit(const atomic<T>*, memory_order) noexcept;
355*700637cbSDimitry Andrictemplate<class T>
356*700637cbSDimitry Andric  T atomic_exchange(volatile atomic<T>*, atomic<T>::value_type) noexcept;
357*700637cbSDimitry Andrictemplate<class T>
358*700637cbSDimitry Andric  T atomic_exchange(atomic<T>*, atomic<T>::value_type) noexcept;
359*700637cbSDimitry Andrictemplate<class T>
360*700637cbSDimitry Andric  T atomic_exchange_explicit(volatile atomic<T>*, atomic<T>::value_type,
361*700637cbSDimitry Andric                             memory_order) noexcept;
362*700637cbSDimitry Andrictemplate<class T>
363*700637cbSDimitry Andric  T atomic_exchange_explicit(atomic<T>*, atomic<T>::value_type,
364*700637cbSDimitry Andric                             memory_order) noexcept;
365*700637cbSDimitry Andrictemplate<class T>
366*700637cbSDimitry Andric  bool atomic_compare_exchange_weak(volatile atomic<T>*, atomic<T>::value_type*,
367*700637cbSDimitry Andric                                    atomic<T>::value_type) noexcept;
368*700637cbSDimitry Andrictemplate<class T>
369*700637cbSDimitry Andric  bool atomic_compare_exchange_weak(atomic<T>*, atomic<T>::value_type*,
370*700637cbSDimitry Andric                                    atomic<T>::value_type) noexcept;
371*700637cbSDimitry Andrictemplate<class T>
372*700637cbSDimitry Andric  bool atomic_compare_exchange_strong(volatile atomic<T>*, atomic<T>::value_type*,
373*700637cbSDimitry Andric                                      atomic<T>::value_type) noexcept;
374*700637cbSDimitry Andrictemplate<class T>
375*700637cbSDimitry Andric  bool atomic_compare_exchange_strong(atomic<T>*, atomic<T>::value_type*,
376*700637cbSDimitry Andric                                      atomic<T>::value_type) noexcept;
377*700637cbSDimitry Andrictemplate<class T>
378*700637cbSDimitry Andric  bool atomic_compare_exchange_weak_explicit(volatile atomic<T>*, atomic<T>::value_type*,
379*700637cbSDimitry Andric                                             atomic<T>::value_type,
380*700637cbSDimitry Andric                                             memory_order, memory_order) noexcept;
381*700637cbSDimitry Andrictemplate<class T>
382*700637cbSDimitry Andric  bool atomic_compare_exchange_weak_explicit(atomic<T>*, atomic<T>::value_type*,
383*700637cbSDimitry Andric                                             atomic<T>::value_type,
384*700637cbSDimitry Andric                                             memory_order, memory_order) noexcept;
385*700637cbSDimitry Andrictemplate<class T>
386*700637cbSDimitry Andric  bool atomic_compare_exchange_strong_explicit(volatile atomic<T>*, atomic<T>::value_type*,
387*700637cbSDimitry Andric                                               atomic<T>::value_type,
388*700637cbSDimitry Andric                                               memory_order, memory_order) noexcept;
389*700637cbSDimitry Andrictemplate<class T>
390*700637cbSDimitry Andric  bool atomic_compare_exchange_strong_explicit(atomic<T>*, atomic<T>::value_type*,
391*700637cbSDimitry Andric                                               atomic<T>::value_type,
392*700637cbSDimitry Andric                                               memory_order, memory_order) noexcept;
393*700637cbSDimitry Andric
394*700637cbSDimitry Andrictemplate<class T>
395*700637cbSDimitry Andric  T atomic_fetch_add(volatile atomic<T>*, atomic<T>::difference_type) noexcept;
396*700637cbSDimitry Andrictemplate<class T>
397*700637cbSDimitry Andric  T atomic_fetch_add(atomic<T>*, atomic<T>::difference_type) noexcept;
398*700637cbSDimitry Andrictemplate<class T>
399*700637cbSDimitry Andric  T atomic_fetch_add_explicit(volatile atomic<T>*, atomic<T>::difference_type,
400*700637cbSDimitry Andric                              memory_order) noexcept;
401*700637cbSDimitry Andrictemplate<class T>
402*700637cbSDimitry Andric  T atomic_fetch_add_explicit(atomic<T>*, atomic<T>::difference_type,
403*700637cbSDimitry Andric                              memory_order) noexcept;
404*700637cbSDimitry Andrictemplate<class T>
405*700637cbSDimitry Andric  T atomic_fetch_sub(volatile atomic<T>*, atomic<T>::difference_type) noexcept;
406*700637cbSDimitry Andrictemplate<class T>
407*700637cbSDimitry Andric  T atomic_fetch_sub(atomic<T>*, atomic<T>::difference_type) noexcept;
408*700637cbSDimitry Andrictemplate<class T>
409*700637cbSDimitry Andric  T atomic_fetch_sub_explicit(volatile atomic<T>*, atomic<T>::difference_type,
410*700637cbSDimitry Andric                              memory_order) noexcept;
411*700637cbSDimitry Andrictemplate<class T>
412*700637cbSDimitry Andric  T atomic_fetch_sub_explicit(atomic<T>*, atomic<T>::difference_type,
413*700637cbSDimitry Andric                              memory_order) noexcept;
414*700637cbSDimitry Andrictemplate<class T>
415*700637cbSDimitry Andric  T atomic_fetch_and(volatile atomic<T>*, atomic<T>::value_type) noexcept;
416*700637cbSDimitry Andrictemplate<class T>
417*700637cbSDimitry Andric  T atomic_fetch_and(atomic<T>*, atomic<T>::value_type) noexcept;
418*700637cbSDimitry Andrictemplate<class T>
419*700637cbSDimitry Andric  T atomic_fetch_and_explicit(volatile atomic<T>*, atomic<T>::value_type,
420*700637cbSDimitry Andric                              memory_order) noexcept;
421*700637cbSDimitry Andrictemplate<class T>
422*700637cbSDimitry Andric  T atomic_fetch_and_explicit(atomic<T>*, atomic<T>::value_type,
423*700637cbSDimitry Andric                              memory_order) noexcept;
424*700637cbSDimitry Andrictemplate<class T>
425*700637cbSDimitry Andric  T atomic_fetch_or(volatile atomic<T>*, atomic<T>::value_type) noexcept;
426*700637cbSDimitry Andrictemplate<class T>
427*700637cbSDimitry Andric  T atomic_fetch_or(atomic<T>*, atomic<T>::value_type) noexcept;
428*700637cbSDimitry Andrictemplate<class T>
429*700637cbSDimitry Andric  T atomic_fetch_or_explicit(volatile atomic<T>*, atomic<T>::value_type,
430*700637cbSDimitry Andric                             memory_order) noexcept;
431*700637cbSDimitry Andrictemplate<class T>
432*700637cbSDimitry Andric  T atomic_fetch_or_explicit(atomic<T>*, atomic<T>::value_type,
433*700637cbSDimitry Andric                             memory_order) noexcept;
434*700637cbSDimitry Andrictemplate<class T>
435*700637cbSDimitry Andric  T atomic_fetch_xor(volatile atomic<T>*, atomic<T>::value_type) noexcept;
436*700637cbSDimitry Andrictemplate<class T>
437*700637cbSDimitry Andric  T atomic_fetch_xor(atomic<T>*, atomic<T>::value_type) noexcept;
438*700637cbSDimitry Andrictemplate<class T>
439*700637cbSDimitry Andric  T atomic_fetch_xor_explicit(volatile atomic<T>*, atomic<T>::value_type,
440*700637cbSDimitry Andric                              memory_order) noexcept;
441*700637cbSDimitry Andrictemplate<class T>
442*700637cbSDimitry Andric  T atomic_fetch_xor_explicit(atomic<T>*, atomic<T>::value_type,
443*700637cbSDimitry Andric                              memory_order) noexcept;
444*700637cbSDimitry Andric
445*700637cbSDimitry Andrictemplate<class T>
446*700637cbSDimitry Andric  void atomic_wait(const volatile atomic<T>*, atomic<T>::value_type) noexcept;
447*700637cbSDimitry Andrictemplate<class T>
448*700637cbSDimitry Andric  void atomic_wait(const atomic<T>*, atomic<T>::value_type) noexcept;
449*700637cbSDimitry Andrictemplate<class T>
450*700637cbSDimitry Andric  void atomic_wait_explicit(const volatile atomic<T>*, atomic<T>::value_type,
451*700637cbSDimitry Andric                            memory_order) noexcept;
452*700637cbSDimitry Andrictemplate<class T>
453*700637cbSDimitry Andric  void atomic_wait_explicit(const atomic<T>*, atomic<T>::value_type,
454*700637cbSDimitry Andric                            memory_order) noexcept;
455*700637cbSDimitry Andrictemplate<class T>
456*700637cbSDimitry Andric  void atomic_notify_one(volatile atomic<T>*) noexcept;
457*700637cbSDimitry Andrictemplate<class T>
458*700637cbSDimitry Andric  void atomic_notify_one(atomic<T>*) noexcept;
459*700637cbSDimitry Andrictemplate<class T>
460*700637cbSDimitry Andric  void atomic_notify_all(volatile atomic<T>*) noexcept;
461*700637cbSDimitry Andrictemplate<class T>
462*700637cbSDimitry Andric  void atomic_notify_all(atomic<T>*) noexcept;
463*700637cbSDimitry Andric
464*700637cbSDimitry Andric// Atomics for standard typedef types
465*700637cbSDimitry Andric
466*700637cbSDimitry Andrictypedef atomic<bool>               atomic_bool;
467*700637cbSDimitry Andrictypedef atomic<char>               atomic_char;
468*700637cbSDimitry Andrictypedef atomic<signed char>        atomic_schar;
469*700637cbSDimitry Andrictypedef atomic<unsigned char>      atomic_uchar;
470*700637cbSDimitry Andrictypedef atomic<short>              atomic_short;
471*700637cbSDimitry Andrictypedef atomic<unsigned short>     atomic_ushort;
472*700637cbSDimitry Andrictypedef atomic<int>                atomic_int;
473*700637cbSDimitry Andrictypedef atomic<unsigned int>       atomic_uint;
474*700637cbSDimitry Andrictypedef atomic<long>               atomic_long;
475*700637cbSDimitry Andrictypedef atomic<unsigned long>      atomic_ulong;
476*700637cbSDimitry Andrictypedef atomic<long long>          atomic_llong;
477*700637cbSDimitry Andrictypedef atomic<unsigned long long> atomic_ullong;
478*700637cbSDimitry Andrictypedef atomic<char8_t>            atomic_char8_t; // C++20
479*700637cbSDimitry Andrictypedef atomic<char16_t>           atomic_char16_t;
480*700637cbSDimitry Andrictypedef atomic<char32_t>           atomic_char32_t;
481*700637cbSDimitry Andrictypedef atomic<wchar_t>            atomic_wchar_t;
482*700637cbSDimitry Andric
483*700637cbSDimitry Andrictypedef atomic<int_least8_t>   atomic_int_least8_t;
484*700637cbSDimitry Andrictypedef atomic<uint_least8_t>  atomic_uint_least8_t;
485*700637cbSDimitry Andrictypedef atomic<int_least16_t>  atomic_int_least16_t;
486*700637cbSDimitry Andrictypedef atomic<uint_least16_t> atomic_uint_least16_t;
487*700637cbSDimitry Andrictypedef atomic<int_least32_t>  atomic_int_least32_t;
488*700637cbSDimitry Andrictypedef atomic<uint_least32_t> atomic_uint_least32_t;
489*700637cbSDimitry Andrictypedef atomic<int_least64_t>  atomic_int_least64_t;
490*700637cbSDimitry Andrictypedef atomic<uint_least64_t> atomic_uint_least64_t;
491*700637cbSDimitry Andric
492*700637cbSDimitry Andrictypedef atomic<int_fast8_t>   atomic_int_fast8_t;
493*700637cbSDimitry Andrictypedef atomic<uint_fast8_t>  atomic_uint_fast8_t;
494*700637cbSDimitry Andrictypedef atomic<int_fast16_t>  atomic_int_fast16_t;
495*700637cbSDimitry Andrictypedef atomic<uint_fast16_t> atomic_uint_fast16_t;
496*700637cbSDimitry Andrictypedef atomic<int_fast32_t>  atomic_int_fast32_t;
497*700637cbSDimitry Andrictypedef atomic<uint_fast32_t> atomic_uint_fast32_t;
498*700637cbSDimitry Andrictypedef atomic<int_fast64_t>  atomic_int_fast64_t;
499*700637cbSDimitry Andrictypedef atomic<uint_fast64_t> atomic_uint_fast64_t;
500*700637cbSDimitry Andric
501*700637cbSDimitry Andrictypedef atomic<int8_t>   atomic_int8_t;
502*700637cbSDimitry Andrictypedef atomic<uint8_t>  atomic_uint8_t;
503*700637cbSDimitry Andrictypedef atomic<int16_t>  atomic_int16_t;
504*700637cbSDimitry Andrictypedef atomic<uint16_t> atomic_uint16_t;
505*700637cbSDimitry Andrictypedef atomic<int32_t>  atomic_int32_t;
506*700637cbSDimitry Andrictypedef atomic<uint32_t> atomic_uint32_t;
507*700637cbSDimitry Andrictypedef atomic<int64_t>  atomic_int64_t;
508*700637cbSDimitry Andrictypedef atomic<uint64_t> atomic_uint64_t;
509*700637cbSDimitry Andric
510*700637cbSDimitry Andrictypedef atomic<intptr_t>  atomic_intptr_t;
511*700637cbSDimitry Andrictypedef atomic<uintptr_t> atomic_uintptr_t;
512*700637cbSDimitry Andrictypedef atomic<size_t>    atomic_size_t;
513*700637cbSDimitry Andrictypedef atomic<ptrdiff_t> atomic_ptrdiff_t;
514*700637cbSDimitry Andrictypedef atomic<intmax_t>  atomic_intmax_t;
515*700637cbSDimitry Andrictypedef atomic<uintmax_t> atomic_uintmax_t;
516*700637cbSDimitry Andric
517*700637cbSDimitry Andrictypedef see-below         atomic_signed_lock_free;   // since C++20
518*700637cbSDimitry Andrictypedef see-below         atomic_unsigned_lock_free; // since C++20
519*700637cbSDimitry Andric
520*700637cbSDimitry Andric// flag type and operations
521*700637cbSDimitry Andric
522*700637cbSDimitry Andrictypedef struct atomic_flag
523*700637cbSDimitry Andric{
524*700637cbSDimitry Andric    atomic_flag() noexcept = default; // until C++20
525*700637cbSDimitry Andric    constexpr atomic_flag() noexcept; // since C++20
526*700637cbSDimitry Andric    atomic_flag(const atomic_flag&) = delete;
527*700637cbSDimitry Andric    atomic_flag& operator=(const atomic_flag&) = delete;
528*700637cbSDimitry Andric    atomic_flag& operator=(const atomic_flag&) volatile = delete;
529*700637cbSDimitry Andric
530*700637cbSDimitry Andric    bool test(memory_order m = memory_order_seq_cst) volatile noexcept;
531*700637cbSDimitry Andric    bool test(memory_order m = memory_order_seq_cst) noexcept;
532*700637cbSDimitry Andric    bool test_and_set(memory_order m = memory_order_seq_cst) volatile noexcept;
533*700637cbSDimitry Andric    bool test_and_set(memory_order m = memory_order_seq_cst) noexcept;
534*700637cbSDimitry Andric    void clear(memory_order m = memory_order_seq_cst) volatile noexcept;
535*700637cbSDimitry Andric    void clear(memory_order m = memory_order_seq_cst) noexcept;
536*700637cbSDimitry Andric
537*700637cbSDimitry Andric    void wait(bool, memory_order = memory_order::seq_cst) const volatile noexcept;
538*700637cbSDimitry Andric    void wait(bool, memory_order = memory_order::seq_cst) const noexcept;
539*700637cbSDimitry Andric    void notify_one() volatile noexcept;
540*700637cbSDimitry Andric    void notify_one() noexcept;
541*700637cbSDimitry Andric    void notify_all() volatile noexcept;
542*700637cbSDimitry Andric    void notify_all() noexcept;
543*700637cbSDimitry Andric} atomic_flag;
544*700637cbSDimitry Andric
545*700637cbSDimitry Andricbool atomic_flag_test(volatile atomic_flag* obj) noexcept;
546*700637cbSDimitry Andricbool atomic_flag_test(atomic_flag* obj) noexcept;
547*700637cbSDimitry Andricbool atomic_flag_test_explicit(volatile atomic_flag* obj,
548*700637cbSDimitry Andric                               memory_order m) noexcept;
549*700637cbSDimitry Andricbool atomic_flag_test_explicit(atomic_flag* obj, memory_order m) noexcept;
550*700637cbSDimitry Andricbool atomic_flag_test_and_set(volatile atomic_flag* obj) noexcept;
551*700637cbSDimitry Andricbool atomic_flag_test_and_set(atomic_flag* obj) noexcept;
552*700637cbSDimitry Andricbool atomic_flag_test_and_set_explicit(volatile atomic_flag* obj,
553*700637cbSDimitry Andric                                       memory_order m) noexcept;
554*700637cbSDimitry Andricbool atomic_flag_test_and_set_explicit(atomic_flag* obj, memory_order m) noexcept;
555*700637cbSDimitry Andricvoid atomic_flag_clear(volatile atomic_flag* obj) noexcept;
556*700637cbSDimitry Andricvoid atomic_flag_clear(atomic_flag* obj) noexcept;
557*700637cbSDimitry Andricvoid atomic_flag_clear_explicit(volatile atomic_flag* obj, memory_order m) noexcept;
558*700637cbSDimitry Andricvoid atomic_flag_clear_explicit(atomic_flag* obj, memory_order m) noexcept;
559*700637cbSDimitry Andric
560*700637cbSDimitry Andricvoid atomic_wait(const volatile atomic_flag* obj, T old) noexcept;
561*700637cbSDimitry Andricvoid atomic_wait(const atomic_flag* obj, T old) noexcept;
562*700637cbSDimitry Andricvoid atomic_wait_explicit(const volatile atomic_flag* obj, T old, memory_order m) noexcept;
563*700637cbSDimitry Andricvoid atomic_wait_explicit(const atomic_flag* obj, T old, memory_order m) noexcept;
564*700637cbSDimitry Andricvoid atomic_one(volatile atomic_flag* obj) noexcept;
565*700637cbSDimitry Andricvoid atomic_one(atomic_flag* obj) noexcept;
566*700637cbSDimitry Andricvoid atomic_all(volatile atomic_flag* obj) noexcept;
567*700637cbSDimitry Andricvoid atomic_all(atomic_flag* obj) noexcept;
568*700637cbSDimitry Andric
569*700637cbSDimitry Andric// fences
570*700637cbSDimitry Andric
571*700637cbSDimitry Andricvoid atomic_thread_fence(memory_order m) noexcept;
572*700637cbSDimitry Andricvoid atomic_signal_fence(memory_order m) noexcept;
573*700637cbSDimitry Andric
574*700637cbSDimitry Andric// deprecated
575*700637cbSDimitry Andric
576*700637cbSDimitry Andrictemplate <class T>
577*700637cbSDimitry Andric  void atomic_init(volatile atomic<T>* obj, atomic<T>::value_type desr) noexcept;
578*700637cbSDimitry Andric
579*700637cbSDimitry Andrictemplate <class T>
580*700637cbSDimitry Andric  void atomic_init(atomic<T>* obj, atomic<T>::value_type desr) noexcept;
581*700637cbSDimitry Andric
582*700637cbSDimitry Andric#define ATOMIC_VAR_INIT(value) see below
583*700637cbSDimitry Andric
584*700637cbSDimitry Andric#define ATOMIC_FLAG_INIT see below
585*700637cbSDimitry Andric
586*700637cbSDimitry Andric}  // std
587*700637cbSDimitry Andric
588*700637cbSDimitry Andric*/
589*700637cbSDimitry Andric
590*700637cbSDimitry Andric#include <__cxx03/__config>
591*700637cbSDimitry Andric
592*700637cbSDimitry Andric#if defined(_LIBCPP___CXX03_STDATOMIC_H)
593*700637cbSDimitry Andric#  error <atomic> is incompatible with <stdatomic.h> before C++23. Please compile with -std=c++23.
594*700637cbSDimitry Andric#endif
595*700637cbSDimitry Andric
596*700637cbSDimitry Andric#include <__cxx03/__atomic/aliases.h>
597*700637cbSDimitry Andric#include <__cxx03/__atomic/atomic.h>
598*700637cbSDimitry Andric#include <__cxx03/__atomic/atomic_base.h>
599*700637cbSDimitry Andric#include <__cxx03/__atomic/atomic_flag.h>
600*700637cbSDimitry Andric#include <__cxx03/__atomic/atomic_init.h>
601*700637cbSDimitry Andric#include <__cxx03/__atomic/atomic_lock_free.h>
602*700637cbSDimitry Andric#include <__cxx03/__atomic/atomic_sync.h>
603*700637cbSDimitry Andric#include <__cxx03/__atomic/check_memory_order.h>
604*700637cbSDimitry Andric#include <__cxx03/__atomic/contention_t.h>
605*700637cbSDimitry Andric#include <__cxx03/__atomic/cxx_atomic_impl.h>
606*700637cbSDimitry Andric#include <__cxx03/__atomic/fence.h>
607*700637cbSDimitry Andric#include <__cxx03/__atomic/is_always_lock_free.h>
608*700637cbSDimitry Andric#include <__cxx03/__atomic/kill_dependency.h>
609*700637cbSDimitry Andric#include <__cxx03/__atomic/memory_order.h>
610*700637cbSDimitry Andric#include <__cxx03/version>
611*700637cbSDimitry Andric
612*700637cbSDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
613*700637cbSDimitry Andric#  pragma GCC system_header
614*700637cbSDimitry Andric#endif
615*700637cbSDimitry Andric
616*700637cbSDimitry Andric#ifdef _LIBCPP_HAS_NO_ATOMIC_HEADER
617*700637cbSDimitry Andric#  error <atomic> is not implemented
618*700637cbSDimitry Andric#endif
619*700637cbSDimitry Andric
620*700637cbSDimitry Andric#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES)
621*700637cbSDimitry Andric#  include <__cxx03/cmath>
622*700637cbSDimitry Andric#  include <__cxx03/cstdlib>
623*700637cbSDimitry Andric#  include <__cxx03/cstring>
624*700637cbSDimitry Andric#  include <__cxx03/type_traits>
625*700637cbSDimitry Andric#endif
626*700637cbSDimitry Andric
627*700637cbSDimitry Andric#endif // _LIBCPP___CXX03_ATOMIC
628