]> git.tdb.fi Git - libs/game.git/commitdiff
Add a dynamic cast function for Owned
authorMikko Rasa <tdb@tdb.fi>
Sat, 17 Jun 2023 21:58:32 +0000 (00:58 +0300)
committerMikko Rasa <tdb@tdb.fi>
Sat, 17 Jun 2023 21:58:32 +0000 (00:58 +0300)
source/game/owned.h

index 9b9d99cdedcca02d59975f2f62a4dc737dbceba4..e51244dfd4284763eaa569d9a8a44529e626191d 100644 (file)
@@ -18,6 +18,9 @@ class Owned: public Handle<T>
        template<typename U>
        friend class Owned;
 
+       template<typename R, typename S>
+       friend Owned<R> dynamic_owned_cast(Owned<S> &&);
+
 public:
        Owned() = default;
 
@@ -141,6 +144,20 @@ void Owned<T>::destroy()
        pool.destroy(this->ptr);
 }
 
+
+template<typename T, typename S>
+Owned<T> dynamic_owned_cast(Owned<S> &&src)
+{
+       T *ptr = dynamic_cast<T *>(src.get());
+       if(!ptr)
+               return Owned<T>();
+
+       Owned<T> result;
+       result.ptr = ptr;
+       src.ptr = nullptr;
+       return result;
+}
+
 } // namespace Msp::Game
 
 #endif