Nugget
atomic_flag.h
1 // Copyright (c) Electronic Arts Inc. All rights reserved.
4 
5 
6 #ifndef EASTL_ATOMIC_INTERNA_ATOMIC_FLAG_H
7 #define EASTL_ATOMIC_INTERNA_ATOMIC_FLAG_H
8 
9 #if defined(EA_PRAGMA_ONCE_SUPPORTED)
10  #pragma once
11 #endif
12 
13 
14 #include "atomic_push_compiler_options.h"
15 
16 
17 namespace eastl
18 {
19 
20 
22 {
23 public: /* ctors */
24 
25  EA_CONSTEXPR atomic_flag(bool desired) EA_NOEXCEPT
26  : mFlag{ desired }
27  {
28  }
29 
30  EA_CONSTEXPR atomic_flag() EA_NOEXCEPT
31  : mFlag{ false }
32  {
33  }
34 
35 public: /* deleted ctors && assignment operators */
36 
37  atomic_flag(const atomic_flag&) EA_NOEXCEPT = delete;
38 
39  atomic_flag& operator=(const atomic_flag&) EA_NOEXCEPT = delete;
40  atomic_flag& operator=(const atomic_flag&) volatile EA_NOEXCEPT = delete;
41 
42 public: /* clear */
43 
44  template <typename Order>
45  void clear(Order /*order*/) volatile EA_NOEXCEPT
46  {
47  EASTL_ATOMIC_STATIC_ASSERT_VOLATILE_MEM_FN(Order);
48  }
49 
50  template <typename Order>
51  void clear(Order /*order*/) EA_NOEXCEPT
52  {
53  EASTL_ATOMIC_STATIC_ASSERT_INVALID_MEMORY_ORDER(Order);
54  }
55 
56  void clear(eastl::internal::memory_order_relaxed_s) EA_NOEXCEPT
57  {
58  mFlag.store(false, eastl::memory_order_relaxed);
59  }
60 
61  void clear(eastl::internal::memory_order_release_s) EA_NOEXCEPT
62  {
63  mFlag.store(false, eastl::memory_order_release);
64  }
65 
66  void clear(eastl::internal::memory_order_seq_cst_s) EA_NOEXCEPT
67  {
68  mFlag.store(false, eastl::memory_order_seq_cst);
69  }
70 
71  void clear() EA_NOEXCEPT
72  {
73  mFlag.store(false, eastl::memory_order_seq_cst);
74  }
75 
76 public: /* test_and_set */
77 
78  template <typename Order>
79  bool test_and_set(Order /*order*/) volatile EA_NOEXCEPT
80  {
81  EASTL_ATOMIC_STATIC_ASSERT_VOLATILE_MEM_FN(Order);
82  return false;
83  }
84 
85  template <typename Order>
86  bool test_and_set(Order /*order*/) EA_NOEXCEPT
87  {
88  EASTL_ATOMIC_STATIC_ASSERT_INVALID_MEMORY_ORDER(Order);
89  return false;
90  }
91 
92  bool test_and_set(eastl::internal::memory_order_relaxed_s) EA_NOEXCEPT
93  {
94  return mFlag.exchange(true, eastl::memory_order_relaxed);
95  }
96 
97  bool test_and_set(eastl::internal::memory_order_acquire_s) EA_NOEXCEPT
98  {
99  return mFlag.exchange(true, eastl::memory_order_acquire);
100  }
101 
102  bool test_and_set(eastl::internal::memory_order_release_s) EA_NOEXCEPT
103  {
104  return mFlag.exchange(true, eastl::memory_order_release);
105  }
106 
107  bool test_and_set(eastl::internal::memory_order_acq_rel_s) EA_NOEXCEPT
108  {
109  return mFlag.exchange(true, eastl::memory_order_acq_rel);
110  }
111 
112  bool test_and_set(eastl::internal::memory_order_seq_cst_s) EA_NOEXCEPT
113  {
114  return mFlag.exchange(true, eastl::memory_order_seq_cst);
115  }
116 
117  bool test_and_set() EA_NOEXCEPT
118  {
119  return mFlag.exchange(true, eastl::memory_order_seq_cst);
120  }
121 
122 public: /* test */
123 
124  template <typename Order>
125  bool test(Order /*order*/) const volatile EA_NOEXCEPT
126  {
127  EASTL_ATOMIC_STATIC_ASSERT_VOLATILE_MEM_FN(Order);
128  return false;
129  }
130 
131  template <typename Order>
132  bool test(Order /*order*/) const EA_NOEXCEPT
133  {
134  EASTL_ATOMIC_STATIC_ASSERT_INVALID_MEMORY_ORDER(Order);
135  return false;
136  }
137 
138  bool test(eastl::internal::memory_order_relaxed_s) const EA_NOEXCEPT
139  {
140  return mFlag.load(eastl::memory_order_relaxed);
141  }
142 
143  bool test(eastl::internal::memory_order_acquire_s) const EA_NOEXCEPT
144  {
145  return mFlag.load(eastl::memory_order_acquire);
146  }
147 
148  bool test(eastl::internal::memory_order_seq_cst_s) const EA_NOEXCEPT
149  {
150  return mFlag.load(eastl::memory_order_seq_cst);
151  }
152 
153  bool test() const EA_NOEXCEPT
154  {
155  return mFlag.load(eastl::memory_order_seq_cst);
156  }
157 
158 private:
159 
160  eastl::atomic<bool> mFlag;
161 };
162 
163 
164 } // namespace eastl
165 
166 
167 #include "atomic_pop_compiler_options.h"
168 
169 
170 #endif /* EASTL_ATOMIC_INTERNA_ATOMIC_FLAG_H */
Definition: atomic_flag.h:22
EA Standard Template Library.
Definition: algorithm.h:288
Definition: atomic_memory_order.h:26
Definition: atomic_memory_order.h:24
Definition: atomic_memory_order.h:22
Definition: atomic_memory_order.h:25
Definition: atomic_memory_order.h:27