diff options
Diffstat (limited to '3rdparty/sol2/sol/stack_get.hpp')
-rw-r--r-- | 3rdparty/sol2/sol/stack_get.hpp | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/3rdparty/sol2/sol/stack_get.hpp b/3rdparty/sol2/sol/stack_get.hpp index 52c52efa10e..7cb7f2b82c9 100644 --- a/3rdparty/sol2/sol/stack_get.hpp +++ b/3rdparty/sol2/sol/stack_get.hpp @@ -41,7 +41,7 @@ namespace sol { template<typename T, typename> struct getter { static T& get(lua_State* L, int index, record& tracking) { - return getter<T&>{}.get(L, index, tracking); + return getter<sol::detail::as_value_tag<T>>{}.get(L, index, tracking); } }; @@ -437,7 +437,7 @@ namespace sol { }; template<typename T> - struct getter<T*> { + struct getter<detail::as_value_tag<T>> { static T* get_no_nil(lua_State* L, int index, record& tracking) { tracking.use(1); void** pudata = static_cast<void**>(lua_touserdata(L, index)); @@ -456,28 +456,49 @@ namespace sol { T* obj = static_cast<T*>(udata); return obj; } + + static T& get(lua_State* L, int index, record& tracking) { + return *get_no_nil(L, index, tracking); + } + }; + template<typename T> + struct getter<detail::as_pointer_tag<T>> { static T* get(lua_State* L, int index, record& tracking) { type t = type_of(L, index); if (t == type::nil) { tracking.use(1); return nullptr; } - return get_no_nil(L, index, tracking); + return getter<detail::as_value_tag<T>>::get_no_nil(L, index, tracking); } }; template<typename T> struct getter<non_null<T*>> { static T* get(lua_State* L, int index, record& tracking) { - return getter<T*>::get_no_nil(L, index, tracking); + return getter<detail::as_value_tag<T>>::get_no_nil(L, index, tracking); } }; template<typename T> struct getter<T&> { static T& get(lua_State* L, int index, record& tracking) { - return *getter<T*>::get_no_nil(L, index, tracking); + return getter<detail::as_value_tag<T>>::get(L, index, tracking); + } + }; + + template<typename T> + struct getter<std::reference_wrapper<T>> { + static T& get(lua_State* L, int index, record& tracking) { + return getter<T&>{}.get(L, index, tracking); + } + }; + + template<typename T> + struct getter<T*> { + static T* get(lua_State* L, int index, record& tracking) { + return getter<detail::as_pointer_tag<T>>::get(L, index, tracking); } }; @@ -495,13 +516,6 @@ namespace sol { } }; - template<typename T> - struct getter<std::reference_wrapper<T>> { - static T& get(lua_State* L, int index, record& tracking) { - return getter<T&>{}.get(L, index, tracking); - } - }; - template<typename... Args> struct getter<std::tuple<Args...>> { typedef std::tuple<decltype(stack::get<Args>(nullptr, 0))...> R; |