Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qatomicscopedvaluerollback_p.h
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QATOMICSCOPEDVALUEROLLBACK_P_H
5#define QATOMICSCOPEDVALUEROLLBACK_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists for the convenience
12// of qapplication_*.cpp, qwidget*.cpp and qfiledialog.cpp. This header
13// file may change from version to version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/qglobal.h>
19#include <QtCore/qatomic.h>
20
21#include <atomic>
22
24
25template <typename T>
27{
28 std::atomic<T> &m_atomic;
29 T m_value;
30 std::memory_order m_mo;
31
32 Q_DISABLE_COPY_MOVE(QAtomicScopedValueRollback)
33
34 constexpr std::memory_order store_part(std::memory_order mo) noexcept
35 {
36 switch (mo) {
37 case std::memory_order_relaxed:
38 case std::memory_order_consume:
39 case std::memory_order_acquire: return std::memory_order_relaxed;
40 case std::memory_order_release:
41 case std::memory_order_acq_rel: return std::memory_order_release;
42 case std::memory_order_seq_cst: return std::memory_order_seq_cst;
43 }
44 // GCC 8.x does not tread __builtin_unreachable() as constexpr
45#if !defined(Q_CC_GNU_ONLY) || (Q_CC_GNU >= 900)
46 // NOLINTNEXTLINE(qt-use-unreachable-return): Triggers on Clang, breaking GCC 8
47 Q_UNREACHABLE();
48#endif
49 return std::memory_order_seq_cst;
50 }
51public:
52 //
53 // std::atomic:
54 //
56 explicit constexpr
58 std::memory_order mo = std::memory_order_seq_cst)
59 : m_atomic(var), m_value(var.load(mo)), m_mo(mo) {}
60
62 explicit constexpr
64 std::memory_order mo = std::memory_order_seq_cst)
65 : m_atomic(var), m_value(var.exchange(value, mo)), m_mo(mo) {}
66
67 //
68 // Q(Basic)AtomicInteger:
69 //
71 explicit constexpr
73 std::memory_order mo = std::memory_order_seq_cst)
74 : QAtomicScopedValueRollback(var._q_value, mo) {}
75
77 explicit constexpr
79 std::memory_order mo = std::memory_order_seq_cst)
80 : QAtomicScopedValueRollback(var._q_value, value, mo) {}
81
82 //
83 // Q(Basic)AtomicPointer:
84 //
86 explicit constexpr
88 std::memory_order mo = std::memory_order_seq_cst)
89 : QAtomicScopedValueRollback(var._q_value, mo) {}
90
92 explicit constexpr
94 std::memory_order mo = std::memory_order_seq_cst)
95 : QAtomicScopedValueRollback(var._q_value, value, mo) {}
96
97#if __cpp_constexpr >= 201907L
98 constexpr
99#endif
101 {
102 m_atomic.store(m_value, store_part(m_mo));
103 }
104
105 constexpr void commit()
106 {
107 m_value = m_atomic.load(m_mo);
108 }
109};
110
112
113#endif // QATOMICASCOPEDVALUEROLLBACK_P_H
Q_NODISCARD_CTOR constexpr QAtomicScopedValueRollback(QBasicAtomicPointer< std::remove_pointer_t< T > > &var, T value, std::memory_order mo=std::memory_order_seq_cst)
Q_NODISCARD_CTOR constexpr QAtomicScopedValueRollback(std::atomic< T > &var, T value, std::memory_order mo=std::memory_order_seq_cst)
Q_NODISCARD_CTOR constexpr QAtomicScopedValueRollback(QBasicAtomicInteger< T > &var, std::memory_order mo=std::memory_order_seq_cst)
Q_NODISCARD_CTOR constexpr QAtomicScopedValueRollback(std::atomic< T > &var, std::memory_order mo=std::memory_order_seq_cst)
Q_NODISCARD_CTOR constexpr QAtomicScopedValueRollback(QBasicAtomicInteger< T > &var, T value, std::memory_order mo=std::memory_order_seq_cst)
Q_NODISCARD_CTOR constexpr QAtomicScopedValueRollback(QBasicAtomicPointer< std::remove_pointer_t< T > > &var, std::memory_order mo=std::memory_order_seq_cst)
p1 load("image.bmp")
auto mo
[7]
Combined button and popup list for selecting options.
#define Q_NODISCARD_CTOR
EGLOutputLayerEXT EGLint EGLAttrib value
[5]