78template <
typename _Tp>
82 typedef typename std::atomic<_Tp> base_type;
83 typedef _Tp value_type;
86 using mem_ord = std::memory_order;
90 explicit G4atomic(mem_ord mo = std::memory_order_acq_rel)
93 atomics::set(&fvalue, value_type());
96 explicit G4atomic(
const value_type& _init,
97 mem_ord mo = std::memory_order_acq_rel)
100 atomics::set(&fvalue, _init);
104 explicit G4atomic(
const base_type& rhs,
105 mem_ord mo = std::memory_order_acq_rel)
108 atomics::set(&fvalue, rhs);
113 : fMemOrder(rhs.fMemOrder)
115 atomics::set(&fvalue, rhs.base());
122 atomics::set(&fvalue, rhs.fvalue);
126 G4atomic& operator=(
const value_type& rhs)
128 atomics::set(&fvalue, rhs);
132 G4atomic& operator=(
const base_type& rhs)
134 atomics::set(&fvalue, rhs);
142 base_type& base() {
return fvalue; }
143 const base_type& base()
const {
return fvalue; }
144 base_type& base()
volatile {
return fvalue; }
145 const base_type& base()
const volatile {
return fvalue; }
148 bool is_lock_free()
const {
return fvalue.is_lock_free(); }
149 bool is_lock_free()
const volatile {
return fvalue.is_lock_free(); }
152 void store(_Tp _desired, mem_ord mo = std::memory_order_seq_cst)
154 atomics::set(fvalue, _desired, mo);
156 void store(_Tp _desired, mem_ord mo = std::memory_order_seq_cst)
volatile
158 atomics::set(fvalue, _desired, mo);
162 _Tp load(mem_ord mo = std::memory_order_seq_cst)
const
164 return atomics::get(fvalue, mo);
166 _Tp load(mem_ord mo = std::memory_order_seq_cst)
const volatile
168 return atomics::get(fvalue, mo);
172 operator _Tp()
const {
return this->load(); }
173 operator _Tp()
const volatile {
return this->load(); }
175 operator base_type&()
const {
return fvalue; }
178 bool compare_exchange_weak(_Tp& _expected, _Tp _desired, mem_ord _success,
181 return fvalue.compare_exchange_weak(_expected, _desired, _success,
184 bool compare_exchange_weak(_Tp& _expected, _Tp _desired, mem_ord _success,
185 mem_ord _failure)
volatile
187 return fvalue.compare_exchange_weak(_expected, _desired, _success,
191 bool compare_exchange_weak(_Tp& _expected, _Tp _desired, mem_ord _order)
193 return fvalue.compare_exchange_weak(_expected, _desired, _order);
195 bool compare_exchange_weak(_Tp& _expected, _Tp _desired,
196 mem_ord _order)
volatile
198 return fvalue.compare_exchange_weak(_expected, _desired, _order);
201 bool compare_exchange_strong(_Tp& _expected, _Tp _desired, mem_ord _success,
204 return fvalue.compare_exchange_weak(_expected, _desired, _success,
207 bool compare_exchange_strong(_Tp& _expected, _Tp _desired, mem_ord _success,
208 mem_ord _failure)
volatile
210 return fvalue.compare_exchange_weak(_expected, _desired, _success,
214 bool compare_exchange_strong(_Tp& _expected, _Tp _desired, mem_ord _order)
216 return fvalue.compare_exchange_weak(_expected, _desired, _order);
218 bool compare_exchange_strong(_Tp& _expected, _Tp _desired,
219 mem_ord _order)
volatile
221 return fvalue.compare_exchange_weak(_expected, _desired, _order);
225 G4atomic& operator+=(
const value_type& rhs)
227 atomics::increment(&fvalue, rhs, fMemOrder);
230 G4atomic& operator-=(
const value_type& rhs)
232 atomics::decrement(&fvalue, rhs, fMemOrder);
235 G4atomic& operator*=(
const value_type& rhs)
237 atomics::multiply(&fvalue, rhs, fMemOrder);
240 G4atomic& operator/=(
const value_type& rhs)
242 atomics::divide(&fvalue, rhs, fMemOrder);
249 atomics::increment(&fvalue, rhs.fvalue);
254 atomics::decrement(&fvalue, rhs.fvalue);
259 atomics::multiply(&fvalue, rhs.fvalue);
264 atomics::divide(&fvalue, rhs.fvalue);
270 atomics::increment(&fvalue, rhs.fvalue);
275 atomics::decrement(&fvalue, rhs.fvalue);
280 atomics::multiply(&fvalue, rhs.fvalue);
285 atomics::divide(&fvalue, rhs.fvalue);
290 G4atomic& operator+=(
const std::atomic<_Tp>& rhs)
292 atomics::increment(&fvalue, rhs, fMemOrder);
295 G4atomic& operator-=(
const std::atomic<_Tp>& rhs)
297 atomics::decrement(&fvalue, rhs, fMemOrder);
300 G4atomic& operator*=(
const std::atomic<_Tp>& rhs)
302 atomics::multiply(&fvalue, rhs, fMemOrder);
305 G4atomic& operator/=(
const std::atomic<_Tp>& rhs)
307 atomics::divide(&fvalue, rhs, fMemOrder);
311 G4atomic& operator+=(
const std::atomic<_Tp>& rhs)
volatile
313 atomics::increment(&fvalue, rhs, fMemOrder);
316 G4atomic& operator-=(
const std::atomic<_Tp>& rhs)
volatile
318 atomics::decrement(&fvalue, rhs, fMemOrder);
321 G4atomic& operator*=(
const std::atomic<_Tp>& rhs)
volatile
323 atomics::multiply(&fvalue, rhs, fMemOrder);
326 G4atomic& operator/=(
const std::atomic<_Tp>& rhs)
volatile
328 atomics::divide(&fvalue, rhs, fMemOrder);
333 value_type operator++()
335 value_type _tmp = ++fvalue;
338 value_type operator++(
int)
340 value_type _tmp = fvalue++;
344 value_type operator--()
346 value_type _tmp = --fvalue;
349 value_type operator--(
int)
351 value_type _tmp = fvalue--;
364template <
typename _Tp>
Definition of the G4atomic_defines class.