diff options
-rw-r--r-- | libs/lua/LuaBridge/detail/CFunctions.h | 23 | ||||
-rw-r--r-- | libs/lua/LuaBridge/detail/Namespace.h | 16 | ||||
-rwxr-xr-x | tools/fmt-luadoc.php | 1 |
3 files changed, 40 insertions, 0 deletions
diff --git a/libs/lua/LuaBridge/detail/CFunctions.h b/libs/lua/LuaBridge/detail/CFunctions.h index 15bc7022b3..9f1712995a 100644 --- a/libs/lua/LuaBridge/detail/CFunctions.h +++ b/libs/lua/LuaBridge/detail/CFunctions.h @@ -379,6 +379,29 @@ struct CFunc }; + template <class T, class R> + struct CastClass + { + static int f (lua_State* L) + { + T * const t = Userdata::get <T> (L, 1, false ); + Stack <R*>::push (L, dynamic_cast<R*>(t)); + return 1; + } + }; + + template <class T, class R> + struct CastConstClass + { + static int f (lua_State* L) + { + T const* const t = Userdata::get <T> (L, 1, true); + Stack <R const*>::push (L, dynamic_cast<R const*>(t)); + return 1; + } + }; + + template <class T> struct PtrNullCheck { diff --git a/libs/lua/LuaBridge/detail/Namespace.h b/libs/lua/LuaBridge/detail/Namespace.h index 590f25be4a..79a0786d40 100644 --- a/libs/lua/LuaBridge/detail/Namespace.h +++ b/libs/lua/LuaBridge/detail/Namespace.h @@ -1048,6 +1048,22 @@ private: 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 */ diff --git a/tools/fmt-luadoc.php b/tools/fmt-luadoc.php index b3d2c0eb71..7f7b35d589 100755 --- a/tools/fmt-luadoc.php +++ b/tools/fmt-luadoc.php @@ -384,6 +384,7 @@ foreach ($doc as $b) { 'cand' => canonical_decl ($b) ); break; + case "Cast": case "Weak/Shared Pointer Cast": checkclass ($b); $classlist[luafn2class ($b['lua'])]['cast'][] = array ( |