allow to bind functions with reference args in global lua namespace
[ardour.git] / libs / lua / LuaBridge / detail / CFunctions.h
index fa78b78fd6dd1012e8daf44a67c4613550168de3..29b361b69085730662e04c708966c40ae9e16136 100644 (file)
@@ -246,6 +246,48 @@ struct CFunc
     }
   };
 
+  //----------------------------------------------------------------------------
+  /**
+      lua_CFunction to call a function with references as arguments.
+  */
+  template <class FnPtr,
+            class ReturnType = typename FuncTraits <FnPtr>::ReturnType>
+  struct CallRef
+  {
+    typedef typename FuncTraits <FnPtr>::Params Params;
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      FnPtr const& fnptr = *static_cast <FnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 1> args (L);
+      Stack <typename FuncTraits <FnPtr>::ReturnType>::push (L, FuncTraits <FnPtr>::call (fnptr, args));
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 2;
+    }
+  };
+
+  template <class FnPtr>
+  struct CallRef <FnPtr, void>
+  {
+    typedef typename FuncTraits <FnPtr>::Params Params;
+    static int f (lua_State* L)
+    {
+      assert (isfulluserdata (L, lua_upvalueindex (1)));
+      FnPtr const& fnptr = *static_cast <FnPtr const*> (lua_touserdata (L, lua_upvalueindex (1)));
+      assert (fnptr != 0);
+      ArgList <Params, 1> args (L);
+      FuncTraits <FnPtr>::call (fnptr, args);
+      LuaRef v (newTable (L));
+      FuncArgs <Params, 0>::refs (v, args);
+      v.push(L);
+      return 1;
+    }
+  };
+
+
   //----------------------------------------------------------------------------
   /**
       lua_CFunction to call a class member function with a return value.