add "sameinstance()" lua binding for all shared/weak ptrs
[ardour.git] / libs / lua / LuaBridge / detail / CFunctions.h
index 9f1712995a89f68a39f7b5263b55c5e7064064a4..fafad5d0a79d932ec3e41794f534aa59ee9d66d0 100644 (file)
@@ -401,7 +401,6 @@ struct CFunc
     }
   };
 
-
   template <class T>
   struct PtrNullCheck
   {
@@ -430,6 +429,38 @@ struct CFunc
     }
   };
 
+  template <class T>
+  struct PtrEqualCheck
+  {
+    static int f (lua_State* L)
+    {
+      boost::shared_ptr<T> t0 = luabridge::Stack<boost::shared_ptr<T> >::get (L, 1);
+      boost::shared_ptr<T> t1 = luabridge::Stack<boost::shared_ptr<T> >::get (L, 2);
+      Stack <bool>::push (L, t0 == t1);
+      return 1;
+    }
+  };
+
+  template <class T>
+  struct WPtrEqualCheck
+  {
+    static int f (lua_State* L)
+    {
+      bool rv = false;
+      boost::weak_ptr<T> tw0 = luabridge::Stack<boost::weak_ptr<T> >::get (L, 1);
+      boost::weak_ptr<T> tw1 = luabridge::Stack<boost::weak_ptr<T> >::get (L, 2);
+      boost::shared_ptr<T> const t0 = tw0.lock();
+      boost::shared_ptr<T> const t1 = tw1.lock();
+      if (t0 && t1) {
+        T* const tt0 = t0.get();
+        T* const tt1 = t1.get();
+        rv = (tt0 == tt1);
+      }
+      Stack <bool>::push (L, rv);
+      return 1;
+    }
+  };
+
   template <class MemFnPtr, class T,
            class ReturnType = typename FuncTraits <MemFnPtr>::ReturnType>
   struct CallMemberWPtr