20 CallbackList callbacks;
21 size_t lastValidCallbackCount = 1u;
25 Q_ASSERT(!cb.expired());
28 if (callbacks.size() > lastValidCallbackCount * 2) {
29 q20::erase_if(callbacks, [](
const auto &cb) {
32 lastValidCallbackCount = callbacks.size() + 1;
35 callbacks.push_back(cb);
43 auto [rhiIt, added] = m_rhiToCallbackItems.try_emplace(&rhi, CallbacksItem{});
45 rhi.addCleanupCallback([instance = shared_from_this()](QRhi *rhi) {
46 for (
auto &weakCb : instance->extractCallbacks(rhi))
47 if (
auto cb = weakCb.lock())
48 cb->onRhiCleanup(*rhi);
51 rhiIt->second.addCallback(cb);
55 CallbackList extractCallbacks(QRhi *rhi)
58 auto it = m_rhiToCallbackItems.find(rhi);
59 Q_ASSERT(it != m_rhiToCallbackItems.end());
61 CallbackList result =
std::move(it->second.callbacks);
62 m_rhiToCallbackItems.erase(it);
67 std::unordered_map<QRhi *, CallbacksItem> m_rhiToCallbackItems;