4#ifndef QRHIVALUEMAPPER_P_H
5#define QRHIVALUEMAPPER_P_H
18#include <QtMultimedia/qtmultimediaglobal.h>
20#include <qreadwritelock.h>
30
31
32
33
34
35class Q_MULTIMEDIA_EXPORT
QRhiCallback :
public std::enable_shared_from_this<QRhiCallback>
41 virtual ~QRhiCallback();
43 void registerCallback(QRhi &rhi);
46 virtual void onRhiCleanup(QRhi &rhi) = 0;
49 std::shared_ptr<Manager> m_manager;
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67template <
typename Value>
70 struct Data : QRhiCallback
75 std::map<QRhi *, Value> storage;
77 void onRhiCleanup(QRhi &rhi) override
79 QWriteLocker locker(&lock);
98 std::pair<Value *,
bool>
tryMap(QRhi &rhi, V &&value)
100 QWriteLocker locker(&m_data->lock);
102 auto [rhiIt, rhiAdded] = m_data->storage.try_emplace(&rhi,
std::forward<V>(value));
105 m_data->registerCallback(rhi);
107 return { &rhiIt->second, rhiAdded };
110 Value *
get(QRhi *rhi)
const
112 QReadLocker locker(&m_data->lock);
113 auto rhiIt = m_data->storage.find(rhi);
114 return rhiIt == m_data->storage.end() ?
nullptr : &rhiIt->second;
131 QWriteLocker locker(&m_data->lock);
132 m_data->storage.clear();
135 template <
typename Predicate>
138 QReadLocker locker(&m_data->lock);
139 auto &storage = m_data->storage;
141 auto it = std::find_if(storage.begin(), storage.end(),
142 [&p](
auto &rhiItem) {
return p(*rhiItem.first); });
143 return it == storage.end() ?
nullptr : it->first;
147 std::shared_ptr<Data> m_data;
void registerCallback(QRhi &rhi, const std::weak_ptr< QRhiCallback > &cb)
The QRhiCallback class implements a thread-safe wrapper around QRhi cleanup callbacks....
The class associates values of the specified type with different QRhi. One instance of QRhiValueMappe...
QRhiValueMapper & operator=(QRhiValueMapper &&) noexcept=default
QRhiValueMapper(QRhiValueMapper &&) noexcept=default
QRhi * findRhi(Predicate &&p) const
std::pair< Value *, bool > tryMap(QRhi &rhi, V &&value)
Value * get(QRhi *rhi) const
Q_GLOBAL_STATIC(const QTzTimeZoneHash, tzZones, loadTzTimeZones())