diff options
Diffstat (limited to 'libs')
-rw-r--r-- | libs/lua/LuaBridge/detail/CFunctions.h | 23 | ||||
-rw-r--r-- | libs/lua/LuaBridge/detail/Namespace.h | 16 |
2 files changed, 39 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 */ |