diff options
author | Petr Mrázek <peterix@gmail.com> | 2021-07-25 19:11:59 +0200 |
---|---|---|
committer | Petr Mrázek <peterix@gmail.com> | 2021-07-25 19:50:44 +0200 |
commit | 20b9f2b42a3b58b6081af271774fbcc34025dccb (patch) | |
tree | 064fa59facb3357139b47bd4e60bfc8edb35ca11 /launcher/QObjectPtr.h | |
parent | dd133680858351e3e07690e286882327a4f42ba5 (diff) | |
download | PrismLauncher-20b9f2b42a3b58b6081af271774fbcc34025dccb.tar.gz PrismLauncher-20b9f2b42a3b58b6081af271774fbcc34025dccb.tar.bz2 PrismLauncher-20b9f2b42a3b58b6081af271774fbcc34025dccb.zip |
NOISSUE Flatten gui and logic libraries into MultiMC
Diffstat (limited to 'launcher/QObjectPtr.h')
-rw-r--r-- | launcher/QObjectPtr.h | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/launcher/QObjectPtr.h b/launcher/QObjectPtr.h new file mode 100644 index 00000000..0ff51136 --- /dev/null +++ b/launcher/QObjectPtr.h @@ -0,0 +1,83 @@ +#pragma once + +#include <functional> +#include <memory> +#include <QObject> + +namespace details +{ +struct DeleteQObjectLater +{ + void operator()(QObject *obj) const + { + obj->deleteLater(); + } +}; +} +/** + * A unique pointer class with unique pointer semantics intended for derivates of QObject + * Calls deleteLater() instead of destroying the contained object immediately + */ +template<typename T> using unique_qobject_ptr = std::unique_ptr<T, details::DeleteQObjectLater>; + +/** + * A shared pointer class with shared pointer semantics intended for derivates of QObject + * Calls deleteLater() instead of destroying the contained object immediately + */ +template <typename T> +class shared_qobject_ptr +{ +public: + shared_qobject_ptr(){} + shared_qobject_ptr(T * wrap) + { + reset(wrap); + } + shared_qobject_ptr(const shared_qobject_ptr<T>& other) + { + m_ptr = other.m_ptr; + } + template<typename Derived> + shared_qobject_ptr(const shared_qobject_ptr<Derived> &other) + { + m_ptr = other.unwrap(); + } + +public: + void reset(T * wrap) + { + using namespace std::placeholders; + m_ptr.reset(wrap, std::bind(&QObject::deleteLater, _1)); + } + void reset(const shared_qobject_ptr<T> &other) + { + m_ptr = other.m_ptr; + } + void reset() + { + m_ptr.reset(); + } + T * get() const + { + return m_ptr.get(); + } + T * operator->() const + { + return m_ptr.get(); + } + T & operator*() const + { + return *m_ptr.get(); + } + operator bool() const + { + return m_ptr.get() != nullptr; + } + const std::shared_ptr <T> unwrap() const + { + return m_ptr; + } + +private: + std::shared_ptr <T> m_ptr; +}; |