Home | History | Annotate | Download | only in atomics.types.generic
      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 // <atomic>
     11 
     12 // template <class T>
     13 // struct atomic
     14 // {
     15 //     bool is_lock_free() const volatile;
     16 //     bool is_lock_free() const;
     17 //     void store(T desr, memory_order m = memory_order_seq_cst) volatile;
     18 //     void store(T desr, memory_order m = memory_order_seq_cst);
     19 //     T load(memory_order m = memory_order_seq_cst) const volatile;
     20 //     T load(memory_order m = memory_order_seq_cst) const;
     21 //     operator T() const volatile;
     22 //     operator T() const;
     23 //     T exchange(T desr, memory_order m = memory_order_seq_cst) volatile;
     24 //     T exchange(T desr, memory_order m = memory_order_seq_cst);
     25 //     bool compare_exchange_weak(T& expc, T desr,
     26 //                                memory_order s, memory_order f) volatile;
     27 //     bool compare_exchange_weak(T& expc, T desr, memory_order s, memory_order f);
     28 //     bool compare_exchange_strong(T& expc, T desr,
     29 //                                  memory_order s, memory_order f) volatile;
     30 //     bool compare_exchange_strong(T& expc, T desr,
     31 //                                  memory_order s, memory_order f);
     32 //     bool compare_exchange_weak(T& expc, T desr,
     33 //                                memory_order m = memory_order_seq_cst) volatile;
     34 //     bool compare_exchange_weak(T& expc, T desr,
     35 //                                memory_order m = memory_order_seq_cst);
     36 //     bool compare_exchange_strong(T& expc, T desr,
     37 //                                 memory_order m = memory_order_seq_cst) volatile;
     38 //     bool compare_exchange_strong(T& expc, T desr,
     39 //                                  memory_order m = memory_order_seq_cst);
     40 //
     41 //     atomic() = default;
     42 //     constexpr atomic(T desr);
     43 //     atomic(const atomic&) = delete;
     44 //     atomic& operator=(const atomic&) = delete;
     45 //     atomic& operator=(const atomic&) volatile = delete;
     46 //     T operator=(T) volatile;
     47 //     T operator=(T);
     48 // };
     49 //
     50 // typedef atomic<bool> atomic_bool;
     51 
     52 #include <atomic>
     53 #include <cassert>
     54 
     55 int main()
     56 {
     57     {
     58         volatile std::atomic<bool> _;
     59         volatile std::atomic<bool> obj(true);
     60         assert(obj == true);
     61         std::atomic_init(&obj, false);
     62         assert(obj == false);
     63         std::atomic_init(&obj, true);
     64         assert(obj == true);
     65         bool b0 = obj.is_lock_free();
     66         obj.store(false);
     67         assert(obj == false);
     68         obj.store(true, std::memory_order_release);
     69         assert(obj == true);
     70         assert(obj.load() == true);
     71         assert(obj.load(std::memory_order_acquire) == true);
     72         assert(obj.exchange(false) == true);
     73         assert(obj == false);
     74         assert(obj.exchange(true, std::memory_order_relaxed) == false);
     75         assert(obj == true);
     76         bool x = obj;
     77         assert(obj.compare_exchange_weak(x, false) == true);
     78         assert(obj == false);
     79         assert(x == true);
     80         assert(obj.compare_exchange_weak(x, true,
     81                                          std::memory_order_seq_cst) == false);
     82         assert(obj == false);
     83         assert(x == false);
     84         obj.store(true);
     85         x = true;
     86         assert(obj.compare_exchange_weak(x, false,
     87                                          std::memory_order_seq_cst,
     88                                          std::memory_order_seq_cst) == true);
     89         assert(obj == false);
     90         assert(x == true);
     91         x = true;
     92         obj.store(true);
     93         assert(obj.compare_exchange_strong(x, false) == true);
     94         assert(obj == false);
     95         assert(x == true);
     96         assert(obj.compare_exchange_strong(x, true,
     97                                          std::memory_order_seq_cst) == false);
     98         assert(obj == false);
     99         assert(x == false);
    100         x = true;
    101         obj.store(true);
    102         assert(obj.compare_exchange_strong(x, false,
    103                                            std::memory_order_seq_cst,
    104                                            std::memory_order_seq_cst) == true);
    105         assert(obj == false);
    106         assert(x == true);
    107         assert((obj = false) == false);
    108         assert(obj == false);
    109         assert((obj = true) == true);
    110         assert(obj == true);
    111     }
    112     {
    113         std::atomic<bool> _;
    114         std::atomic<bool> obj(true);
    115         assert(obj == true);
    116         std::atomic_init(&obj, false);
    117         assert(obj == false);
    118         std::atomic_init(&obj, true);
    119         assert(obj == true);
    120         bool b0 = obj.is_lock_free();
    121         obj.store(false);
    122         assert(obj == false);
    123         obj.store(true, std::memory_order_release);
    124         assert(obj == true);
    125         assert(obj.load() == true);
    126         assert(obj.load(std::memory_order_acquire) == true);
    127         assert(obj.exchange(false) == true);
    128         assert(obj == false);
    129         assert(obj.exchange(true, std::memory_order_relaxed) == false);
    130         assert(obj == true);
    131         bool x = obj;
    132         assert(obj.compare_exchange_weak(x, false) == true);
    133         assert(obj == false);
    134         assert(x == true);
    135         assert(obj.compare_exchange_weak(x, true,
    136                                          std::memory_order_seq_cst) == false);
    137         assert(obj == false);
    138         assert(x == false);
    139         obj.store(true);
    140         x = true;
    141         assert(obj.compare_exchange_weak(x, false,
    142                                          std::memory_order_seq_cst,
    143                                          std::memory_order_seq_cst) == true);
    144         assert(obj == false);
    145         assert(x == true);
    146         x = true;
    147         obj.store(true);
    148         assert(obj.compare_exchange_strong(x, false) == true);
    149         assert(obj == false);
    150         assert(x == true);
    151         assert(obj.compare_exchange_strong(x, true,
    152                                          std::memory_order_seq_cst) == false);
    153         assert(obj == false);
    154         assert(x == false);
    155         x = true;
    156         obj.store(true);
    157         assert(obj.compare_exchange_strong(x, false,
    158                                            std::memory_order_seq_cst,
    159                                            std::memory_order_seq_cst) == true);
    160         assert(obj == false);
    161         assert(x == true);
    162         assert((obj = false) == false);
    163         assert(obj == false);
    164         assert((obj = true) == true);
    165         assert(obj == true);
    166     }
    167     {
    168         std::atomic_bool _;
    169         std::atomic_bool obj(true);
    170         assert(obj == true);
    171         std::atomic_init(&obj, false);
    172         assert(obj == false);
    173         std::atomic_init(&obj, true);
    174         assert(obj == true);
    175         bool b0 = obj.is_lock_free();
    176         obj.store(false);
    177         assert(obj == false);
    178         obj.store(true, std::memory_order_release);
    179         assert(obj == true);
    180         assert(obj.load() == true);
    181         assert(obj.load(std::memory_order_acquire) == true);
    182         assert(obj.exchange(false) == true);
    183         assert(obj == false);
    184         assert(obj.exchange(true, std::memory_order_relaxed) == false);
    185         assert(obj == true);
    186         bool x = obj;
    187         assert(obj.compare_exchange_weak(x, false) == true);
    188         assert(obj == false);
    189         assert(x == true);
    190         assert(obj.compare_exchange_weak(x, true,
    191                                          std::memory_order_seq_cst) == false);
    192         assert(obj == false);
    193         assert(x == false);
    194         obj.store(true);
    195         x = true;
    196         assert(obj.compare_exchange_weak(x, false,
    197                                          std::memory_order_seq_cst,
    198                                          std::memory_order_seq_cst) == true);
    199         assert(obj == false);
    200         assert(x == true);
    201         x = true;
    202         obj.store(true);
    203         assert(obj.compare_exchange_strong(x, false) == true);
    204         assert(obj == false);
    205         assert(x == true);
    206         assert(obj.compare_exchange_strong(x, true,
    207                                          std::memory_order_seq_cst) == false);
    208         assert(obj == false);
    209         assert(x == false);
    210         x = true;
    211         obj.store(true);
    212         assert(obj.compare_exchange_strong(x, false,
    213                                            std::memory_order_seq_cst,
    214                                            std::memory_order_seq_cst) == true);
    215         assert(obj == false);
    216         assert(x == true);
    217         assert((obj = false) == false);
    218         assert(obj == false);
    219         assert((obj = true) == true);
    220         assert(obj == true);
    221     }
    222 }
    223