18class QAtomicScopedValueRollback
20 std::atomic<T> &m_atomic;
22 std::memory_order m_mo;
24 Q_DISABLE_COPY_MOVE(QAtomicScopedValueRollback)
26 static constexpr std::memory_order store_part(std::memory_order mo)
noexcept
29 case std::memory_order_relaxed:
30 case std::memory_order_consume:
31 case std::memory_order_acquire:
return std::memory_order_relaxed;
32 case std::memory_order_release:
33 case std::memory_order_acq_rel:
return std::memory_order_release;
34 case std::memory_order_seq_cst:
return std::memory_order_seq_cst;
37#if !defined(Q_CC_GNU_ONLY) || (Q_CC_GNU >= 900
)
41 return std::memory_order_seq_cst;
44 static constexpr std::memory_order load_part(std::memory_order mo)
noexcept
47 case std::memory_order_relaxed:
48 case std::memory_order_release:
return std::memory_order_relaxed;
49 case std::memory_order_consume:
return std::memory_order_consume;
50 case std::memory_order_acquire:
51 case std::memory_order_acq_rel:
return std::memory_order_acquire;
52 case std::memory_order_seq_cst:
return std::memory_order_seq_cst;
55#if !defined(Q_CC_GNU_ONLY) || (Q_CC_GNU >= 900
)
59 return std::memory_order_seq_cst;
67 QAtomicScopedValueRollback(std::atomic<T> &var,
68 std::memory_order mo = std::memory_order_seq_cst)
69 : m_atomic(var), m_value(var.load(load_part(mo))), m_mo(mo) {}
73 QAtomicScopedValueRollback(std::atomic<T> &var, T value,
74 std::memory_order mo = std::memory_order_seq_cst)
75 : m_atomic(var), m_value(var.exchange(value, mo)), m_mo(mo) {}
82 QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var,
83 std::memory_order mo = std::memory_order_seq_cst)
84 : QAtomicScopedValueRollback(var._q_value, mo) {}
88 QAtomicScopedValueRollback(QBasicAtomicInteger<T> &var, T value,
89 std::memory_order mo = std::memory_order_seq_cst)
90 : QAtomicScopedValueRollback(var._q_value, value, mo) {}
97 QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var,
98 std::memory_order mo = std::memory_order_seq_cst)
99 : QAtomicScopedValueRollback(var._q_value, mo) {}
103 QAtomicScopedValueRollback(QBasicAtomicPointer<std::remove_pointer_t<T>> &var, T value,
104 std::memory_order mo = std::memory_order_seq_cst)
105 : QAtomicScopedValueRollback(var._q_value, value, mo) {}
107 ~QAtomicScopedValueRollback()
109 m_atomic.store(m_value, store_part(m_mo));
114 m_value = m_atomic.load(load_part(m_mo));