From 204c8016c70ea0e91534e30bc5b879da5540e1de Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Thu, 14 Apr 2016 03:08:02 +0200 Subject: [PATCH] allow to compare C class instances from lua --- libs/ardour/luabindings.cc | 3 +++ libs/lua/LuaBridge/detail/CFunctions.h | 13 +++++++++++++ libs/lua/LuaBridge/detail/Namespace.h | 15 +++++++++++++++ 3 files changed, 31 insertions(+) diff --git a/libs/ardour/luabindings.cc b/libs/ardour/luabindings.cc index 5dcd0964cd..2fa6fa0604 100644 --- a/libs/ardour/luabindings.cc +++ b/libs/ardour/luabindings.cc @@ -1005,6 +1005,7 @@ LuaBindings::dsp (lua_State* L) .beginNamespace ("ARDOUR") .beginClass ("AudioBuffer") + .addEqualCheck () .addFunction ("data", (Sample*(AudioBuffer::*)(framecnt_t))&AudioBuffer::data) .addFunction ("silence", &AudioBuffer::silence) .addFunction ("apply_gain", &AudioBuffer::apply_gain) @@ -1013,12 +1014,14 @@ LuaBindings::dsp (lua_State* L) .endClass() .beginClass ("MidiBuffer") + .addEqualCheck () .addFunction ("silence", &MidiBuffer::silence) .addFunction ("empty", &MidiBuffer::empty) // TODO iterators.. .endClass() .beginClass ("BufferSet") + .addEqualCheck () .addFunction ("get_audio", static_cast(&BufferSet::get_audio)) .addFunction ("count", static_cast(&BufferSet::count)) .endClass() diff --git a/libs/lua/LuaBridge/detail/CFunctions.h b/libs/lua/LuaBridge/detail/CFunctions.h index 29b361b690..6f43919216 100644 --- a/libs/lua/LuaBridge/detail/CFunctions.h +++ b/libs/lua/LuaBridge/detail/CFunctions.h @@ -366,6 +366,19 @@ struct CFunc } }; + template + struct ClassEqualCheck + { + static int f (lua_State* L) + { + T const* const t0 = Userdata::get (L, 1, true); + T const* const t1 = Userdata::get (L, 2, true); + Stack ::push (L, t0 == t1); + return 1; + } + }; + + template struct PtrNullCheck { diff --git a/libs/lua/LuaBridge/detail/Namespace.h b/libs/lua/LuaBridge/detail/Namespace.h index 722d02e4a7..c859d8d151 100644 --- a/libs/lua/LuaBridge/detail/Namespace.h +++ b/libs/lua/LuaBridge/detail/Namespace.h @@ -1039,6 +1039,15 @@ private: return addConstructor (); } + Class & addEqualCheck () + { + PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name () + ")")) + assert (lua_istable (L, -1)); + lua_pushcclosure (L, &CFunc::ClassEqualCheck ::f, 0); + rawsetfield (L, -3, "sameinstance"); + return *this; + } + }; /** C Array to/from table */ @@ -1060,6 +1069,8 @@ private: std::string(""), "int (*)(lua_State*)") PRINTDOC ("Ext C Function", _name << "set_table", std::string(""), "int (*)(lua_State*)") + PRINTDOC("Member Function", _name << "sameinstance", + std::string("bool"), std::string("void (*)(" + type_name () + "*)")) m_stackSize = parent->m_stackSize + 3; parent->m_stackSize = 0; @@ -1117,6 +1128,10 @@ private: lua_pushcclosure (L, &CFunc::setTable , 0); rawsetfield (L, -3, "set_table"); // class table + + lua_pushcclosure (L, &CFunc::ClassEqualCheck ::f, 0); + rawsetfield (L, -3, "sameinstance"); + } else {