From ac9ba463c7b9a1345a3c1a948f0f32a1ba146b19 Mon Sep 17 00:00:00 2001
From: EndrII <EndrIIMail@gmail.com>
Date: Wed, 19 Feb 2025 16:03:29 +0100
Subject: [PATCH] simple fix

---
 src/public/asyncrenderloop.h | 32 ++++++++++++++++++++++++++++++++
 1 file changed, 32 insertions(+)

diff --git a/src/public/asyncrenderloop.h b/src/public/asyncrenderloop.h
index 0b61b58..ab91232 100644
--- a/src/public/asyncrenderloop.h
+++ b/src/public/asyncrenderloop.h
@@ -49,6 +49,7 @@ namespace QH {
  * int main (int argc, char* argv[]) {
  *   auto loop = QSharedPointer<MyRenderLoop>(new MyRenderLoop(new QThread())); // wrong! it will be broken
  *   auto loop = MyRenderLoop::MainSharedPtr<QSharedPointer<MyRenderLoop>>(QSharedPointer<MyRenderLoop>::create(new QThread())); // right!
+ *   auto loop = MyRenderLoop::createMainPtr<MyRenderLoop>(new QThread()); // this is short version of initialization Main pointer
  *  ...
  *  return app.exec();
  *  }
@@ -69,6 +70,11 @@ public:
     template<typename T>
     class MainSharedPtr {
     public:
+        MainSharedPtr() {
+            static_assert(std::is_base_of_v<AsyncRenderLoop, typename T::element_type>,
+                          "T must be derived from QSharedPointer<AsyncRender>");
+        }
+
         MainSharedPtr(const T& ptr): _ptr(ptr) {
             static_assert(std::is_base_of_v<AsyncRenderLoop, typename T::element_type>,
                           "T must be derived from QSharedPointer<AsyncRender>");
@@ -83,14 +89,27 @@ public:
             return _ptr.operator->();
         }
 
+        /**
+         * @brief get This is a alias of the QSharedPointer::get method.
+         * @return pointer to the object.
+         */
         typename T::element_type* get() const {
             return _ptr.get();
         }
 
+        /**
+         * @brief getShared This method return child shared pointer. You can use them as a general shared pointer of the object.
+         * @return reference to the object.
+         */
+        const T& getShared() const {
+            return _ptr;
+        }
+
     private:
         T _ptr;
     };
 
+
     AsyncRenderLoop(QThread* thread, QObject* ptr = nullptr);
     ~AsyncRenderLoop();
 
@@ -110,6 +129,18 @@ public:
      */
     bool isRun() const;
 
+    /**
+     * @brief createMainPtr This method creates a shared pointer to the render loop.
+     * @tparam Type type of the render loop object.
+     * @tparam Args arguments for the constructor of the render loop object.
+     * @param arguments arguments for the constructor of the render loop object.
+     * @return shared pointer to the render loop.
+     */
+    template<typename Type, typename... Args>
+    static MainSharedPtr<QSharedPointer<Type>> createMainPtr(Args && ...arguments) {
+        return MainSharedPtr<QSharedPointer<Type>>(QSharedPointer<Type>::create(std::forward<Args>(arguments)...));
+    };
+
 protected:
 
     /**
@@ -130,4 +161,5 @@ private:
 
 };
 }
+
 #endif // ASYNCRENDERLOOP_H