// Copyright (C) 2016 Jochen Becher // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 #pragma once #include "uid.h" #include "qmtassert.h" namespace qmt { template class Handle { public: Handle() = default; explicit Handle(const Uid &uid) : m_uid(uid) { } explicit Handle(T *t) : m_uid(t ? t->uid() : Uid()), m_target(t) { } Handle(const Handle &rhs) : m_uid(rhs.m_uid), m_target(rhs.m_target) { } template Handle(const Handle &rhs) : m_uid(rhs.uid()), m_target(rhs.target()) { } Handle &operator=(const Handle &) = default; bool isNull() const { return !m_uid.isValid(); } bool hasTarget() const { return m_target != nullptr; } Uid uid() const { return m_uid; } T *target() const { return m_target; } void setUid(const Uid &uid) { QMT_CHECK(m_target ? (m_target->uid() == uid) : true); m_uid = uid; } void setTarget(T *t) { m_uid = t ? t->uid() : Uid(); m_target = t; } void clear() { m_uid = Uid(); m_target = nullptr; } void clearTarget() { m_target = nullptr; } friend auto qHash(const Handle &handle) { return qHash(handle.uid()); } private: Uid m_uid; T *m_target = nullptr; }; template bool operator==(const Handle &lhs, const Handle &rhs) { return lhs.uid() == rhs.uid(); } template Handle makeHandle(T *t) { return Handle(t); } template Handle handle_dynamic_cast(const Handle &handle) { if (!handle.hasTarget()) return Handle(handle.uid()); return Handle(dynamic_cast(handle.target())); } } // namespace qmt