yet another multi-ABI bundle installer fix
[ardour.git] / libs / lua / LuaBridge / detail / Namespace.h
index ef571be7e79887791f8265e297b0649e76fa5b96..92aed815305aa1f4cf68532dd769cf6f6ddbd06d 100644 (file)
@@ -29,6 +29,7 @@
 //==============================================================================
 
 #ifdef LUABINDINGDOC
+#include <iostream>
 #include <typeinfo>
 #include <execinfo.h>
 #include <type_traits>
@@ -66,26 +67,26 @@ std::string type_name()
 #define KEYEND "\"] = "
 #else // JSON
 #define KEYSTA "\""
-#define KEYEND "\" = "
+#define KEYEND "\" : "
 #endif
 
 #define CLASSDOC(TYPE, LUANAME, DECL, PARENTDECL) \
   if (LuaBindingDoc::printBindings ()) { \
-    std::cout <<   "{ " << KEYSTA << "type"   << KEYEND << " \"" << TYPE << "\",\n"; \
-    std::cout <<   "  " << KEYSTA << "lua"    << KEYEND << " \"" << LUANAME << "\",\n"; \
-    std::cout <<   "  " << KEYSTA << "decl"   << KEYEND << " \"" << DECL << "\",\n"; \
-    std::cout <<   "  " << KEYSTA << "parent" << KEYEND << " \"" << PARENTDECL << "\"\n"; \
+    std::cout <<   "{ " << KEYSTA << "type"   << KEYEND << "  \""  << TYPE << "\",\n"; \
+    std::cout <<   "  " << KEYSTA << "lua"    << KEYEND << "   \"" << LUANAME << "\",\n"; \
+    std::cout <<   "  " << KEYSTA << "decl"   << KEYEND << "  \"" << DECL << "\",\n"; \
+    std::cout <<   "  " << KEYSTA << "parent" << KEYEND << "\""  << PARENTDECL << "\"\n"; \
     std::cout <<   "},\n"; \
   }
 
 #define PRINTDOC(TYPE, LUANAME, RETVAL, DECL) \
   if (LuaBindingDoc::printBindings ()) { \
-    std::cout <<   "{ " << KEYSTA << "type"   << KEYEND << " \"" << TYPE << "\",\n"; \
-    std::cout <<   "  " << KEYSTA << "lua"    << KEYEND << " \"" << LUANAME << "\",\n"; \
+    std::cout <<   "{ " << KEYSTA << "type"   << KEYEND << "  \""  << TYPE << "\",\n"; \
+    std::cout <<   "  " << KEYSTA << "lua"    << KEYEND << "   \"" << LUANAME << "\",\n"; \
     if (!(RETVAL).empty()) { \
-      std::cout << "  " << KEYSTA << "ret"    << KEYEND << " \"" << (RETVAL) << "\",\n"; \
+      std::cout << "  " << KEYSTA << "ret"    << KEYEND << "   \"" << (RETVAL) << "\",\n"; \
     } \
-    std::cout <<   "  " << KEYSTA << "decl"   << KEYEND << " \"" << DECL << "\"\n"; \
+    std::cout <<   "  " << KEYSTA << "decl"   << KEYEND << "  \""  << DECL << "\"\n"; \
     std::cout <<   "},\n"; \
   }
 
@@ -726,7 +727,7 @@ private:
     template <class FP>
     Class <T>& addStaticFunction (char const* name, FP const fp)
     {
-      FUNDOC ("Static Function", name, FP)
+      FUNDOC ("Static Member Function", name, FP)
       new (lua_newuserdata (L, sizeof (fp))) FP (fp);
       lua_pushcclosure (L, &CFunc::Call <FP>::f, 1);
       rawsetfield (L, -2, name);
@@ -1038,6 +1039,31 @@ private:
       return addConstructor <void (*) ()> ();
     }
 
+    Class <T>& addEqualCheck ()
+    {
+      PRINTDOC("Member Function", _name << "sameinstance", std::string("bool"), std::string("void (*)(" + type_name <T>() + ")"))
+      assert (lua_istable (L, -1));
+      lua_pushcclosure (L, &CFunc::ClassEqualCheck <T>::f, 0);
+      rawsetfield (L, -3, "sameinstance");
+      return *this;
+    }
+
+    template <class U>
+    Class <T>& addCast (char const* name)
+    {
+      PRINTDOC("Cast", _name << name,
+          type_name< U >(),
+          type_name< U >() << " (" << type_name< T >() << "::*)()")
+
+      assert (lua_istable (L, -1));
+      lua_pushcclosure (L, &CFunc::CastClass <T, U>::f, 0);
+      rawsetfield (L, -3, name); // class table
+
+      lua_pushcclosure (L, &CFunc::CastConstClass <T, U>::f, 0);
+      rawsetfield (L, -4, name); // const table
+      return *this;
+    }
+
   };
 
   /** C Array to/from table */
@@ -1049,9 +1075,21 @@ private:
     {
 #ifdef LUABINDINGDOC
       _parent = parent;
-      _name = parent->_name + name + ".";
+      _name = parent->_name + name + ":";
 #endif
-      PRINTDOC ("[C] Array", parent->_name << name, std::string(), type_name <T>())
+      PRINTDOC ("[C] Array", parent->_name << name,
+          std::string(), type_name <T>() + "*")
+      PRINTDOC ("Ext C Function", _name << "array",
+          std::string(""), "int (*)(lua_State*)")
+      PRINTDOC ("Ext C Function", _name << "get_table",
+          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("bool (*)(" + type_name <T>() + "*)"))
+      PRINTDOC("Member Function", _name << "offset",
+          std::string(type_name <T>() + "*"), std::string(type_name <T>() + "* (*)(unsigned int)"))
+
       m_stackSize = parent->m_stackSize + 3;
       parent->m_stackSize = 0;
 
@@ -1108,6 +1146,13 @@ private:
 
         lua_pushcclosure (L, &CFunc::setTable <T>, 0);
         rawsetfield (L, -3, "set_table"); // class table
+
+        lua_pushcclosure (L, &CFunc::ClassEqualCheck <T>::f, 0);
+        rawsetfield (L, -3, "sameinstance");
+
+        lua_pushcclosure (L, &CFunc::offsetArray <T>, 0);
+        rawsetfield (L, -3, "offset"); // class table
+
       }
       else
       {
@@ -1352,8 +1397,8 @@ private:
     : L (child->L)
     , m_stackSize (0)
 #ifdef LUABINDINGDOC
-    , _name (child->_parent->_name)
-    , _parent (child->_parent)
+    , _name (child->_parent ? child->_parent->_name : "")
+    , _parent (child->_parent ? child->_parent->_parent : NULL)
 #endif
   {
     m_stackSize = child->m_stackSize - 1;
@@ -1580,6 +1625,7 @@ public:
   */
   Namespace& addCFunction (char const* name, int (*const fp)(lua_State*))
   {
+    DATADOC ("Free C Function", name, fp)
     lua_pushcfunction (L, fp);
     rawsetfield (L, -2, name);
 
@@ -1612,12 +1658,14 @@ public:
     typedef std::map<K, V> LT;
     typedef std::pair<const K, V> T;
 
+    typedef typename std::map<K, V>::size_type T_SIZE;
+
     return beginClass<LT> (name)
       .addVoidConstructor ()
       .addFunction ("empty", &LT::empty)
       .addFunction ("size", &LT::size)
       .addFunction ("clear", (void (LT::*)())&LT::clear)
-      .addFunction ("count", (void (LT::*)())&LT::count)
+      .addFunction ("count", (T_SIZE (LT::*)(const K&) const)&LT::count)
       .addExtCFunction ("add", &CFunc::tableToMap<K, V>)
       .addExtCFunction ("iter", &CFunc::mapIter<K, V>)
       .addExtCFunction ("table", &CFunc::mapToTable<K, V>);
@@ -1750,6 +1798,9 @@ public:
   template <class T, class U>
   WSPtrClass <T> deriveWSPtrClass (char const* name)
   {
+
+    CLASSDOC ("[C] Derived Class", _name << name, type_name <boost::shared_ptr<T> >(), type_name <boost::shared_ptr<U> >())
+    CLASSDOC ("[C] Derived Class", _name << name, type_name <boost::weak_ptr<T> >(), type_name <boost::weak_ptr<U> >())
     CLASSDOC ("[C] Derived Pointer Class", _name << name, type_name <T>(), type_name <U>())
     return WSPtrClass <T> (name, this,
         ClassInfo <boost::shared_ptr<U> >::getStaticKey (),