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