summaryrefslogtreecommitdiff
path: root/libs/lua
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-08-26 18:25:15 +0200
committerRobin Gareus <robin@gareus.org>2016-08-26 18:25:15 +0200
commit1d7c144967b9cd24f4fd53270c340a8accc61cab (patch)
tree53c794a2d20ee7b2dd7ea40ccd50f092ce91ce33 /libs/lua
parentddc4e61b57803ae99b472e97f2000a9e04b55aff (diff)
add "sameinstance()" lua binding for all shared/weak ptrs
Diffstat (limited to 'libs/lua')
-rw-r--r--libs/lua/LuaBridge/detail/CFunctions.h33
-rw-r--r--libs/lua/LuaBridge/detail/Namespace.h18
2 files changed, 49 insertions, 2 deletions
diff --git a/libs/lua/LuaBridge/detail/CFunctions.h b/libs/lua/LuaBridge/detail/CFunctions.h
index 9f1712995a..fafad5d0a7 100644
--- a/libs/lua/LuaBridge/detail/CFunctions.h
+++ b/libs/lua/LuaBridge/detail/CFunctions.h
@@ -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
diff --git a/libs/lua/LuaBridge/detail/Namespace.h b/libs/lua/LuaBridge/detail/Namespace.h
index 07963f47db..7774b9f873 100644
--- a/libs/lua/LuaBridge/detail/Namespace.h
+++ b/libs/lua/LuaBridge/detail/Namespace.h
@@ -1298,6 +1298,21 @@ private:
return *this;
}
+ WSPtrClass <T>& addEqualCheck ()
+ {
+ PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name <T>() + ")"))
+ set_weak_class ();
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, &CFunc::WPtrEqualCheck <T>::f, 0);
+ rawsetfield (L, -3, "isnil"); // class table
+
+ set_shared_class ();
+ assert (lua_istable (L, -1));
+ lua_pushcclosure (L, &CFunc::PtrEqualCheck <T>::f, 0);
+ rawsetfield (L, -3, "isnil"); // class table
+
+ return *this;
+ }
Namespace endClass ()
{
@@ -1652,7 +1667,8 @@ public:
WSPtrClass <T> beginWSPtrClass (char const* name)
{
return WSPtrClass <T> (name, this)
- .addNullCheck();
+ .addNullCheck()
+ .addEqualCheck();
}
//----------------------------------------------------------------------------