//==============================================================================
#ifdef LUABINDINGDOC
+#include <iostream>
#include <typeinfo>
#include <execinfo.h>
#include <type_traits>
#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"; \
}
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);
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 */
{
#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;
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
{
: 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;
*/
Namespace& addCFunction (char const* name, int (*const fp)(lua_State*))
{
+ DATADOC ("Free C Function", name, fp)
lua_pushcfunction (L, fp);
rawsetfield (L, -2, name);
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", <::empty)
.addFunction ("size", <::size)
.addFunction ("clear", (void (LT::*)())<::clear)
- .addFunction ("count", (void (LT::*)())<::count)
+ .addFunction ("count", (T_SIZE (LT::*)(const K&) const)<::count)
.addExtCFunction ("add", &CFunc::tableToMap<K, V>)
.addExtCFunction ("iter", &CFunc::mapIter<K, V>)
.addExtCFunction ("table", &CFunc::mapToTable<K, V>);
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 (),