diff --git a/sol/stack.hpp b/sol/stack.hpp index 40975cf7..43212f9b 100644 --- a/sol/stack.hpp +++ b/sol/stack.hpp @@ -24,18 +24,12 @@ #include "reference.hpp" #include "tuple.hpp" +#include "traits.hpp" #include -#include #include #include namespace sol { -template -using EnableIf = typename std::enable_if::type; - -template -using DisableIf = typename std::enable_if::type; - namespace stack { namespace detail { template diff --git a/sol/table.hpp b/sol/table.hpp index b6e1abbd..7cefa37c 100644 --- a/sol/table.hpp +++ b/sol/table.hpp @@ -29,15 +29,15 @@ namespace sol { namespace detail { - template - T* get_ptr(T& val) { - return std::addressof(val); - } +template +T* get_ptr(T& val) { + return std::addressof(val); +} - template - T* get_ptr(T* val) { - return val; - } +template +T* get_ptr(T* val) { + return val; +} } // detail class table : virtual public reference { @@ -71,13 +71,13 @@ public: template table& set_function(T&& key, TFx&& fx) { - typedef typename std::remove_pointer::type>::type clean_fx; + typedef typename std::remove_pointer>::type clean_fx; return set_isfunction_fx(std::is_function(), std::forward(key), std::forward(fx)); } template table& set_function(T&& key, TFx&& fx, TObj&& obj) { - return set_lvalue_fx(std::integral_constant::value || std::is_pointer::value>(), + return set_lvalue_fx(Bool::value || std::is_pointer::value>(), std::forward(key), std::forward(fx), std::forward(obj)); } @@ -98,7 +98,7 @@ private: template table& set_isfunction_fx(std::false_type, T&& key, TFx&& fx) { - typedef typename std::decay::type clean_lambda; + typedef Decay clean_lambda; typedef typename detail::function_traits::free_function_pointer_type raw_func_t; typedef std::is_convertible isconvertible; return set_isconvertible_fx(isconvertible(), std::forward(key), std::forward(fx)); @@ -106,14 +106,14 @@ private: template table& set_isconvertible_fx(std::true_type, T&& key, TFx&& fx) { - typedef typename std::decay::type clean_lambda; + typedef Decay clean_lambda; typedef typename detail::function_traits::free_function_pointer_type raw_func_t; return set_isfunction_fx(std::true_type(), std::forward(key), raw_func_t(std::forward(fx))); } template table& set_isconvertible_fx(std::false_type, T&& key, TFx&& fx) { - typedef typename std::remove_pointer::type>::type clean_fx; + typedef typename std::remove_pointer>::type clean_fx; std::unique_ptr sptr(new lambda_lua_func(std::forward(fx))); return set_fx(std::forward(key), std::move(sptr)); } @@ -125,16 +125,13 @@ private: template table& set_lvalue_fx(std::false_type, T&& key, TFx&& fx, TObj&& obj) { - typedef typename std::remove_pointer::type>::type clean_fx; + typedef typename std::remove_pointer>::type clean_fx; std::unique_ptr sptr(new explicit_lua_func(std::forward(obj), std::forward(fx))); return set_fx(std::forward(key), std::move(sptr)); } template table& set_fx(std::true_type, T&& key, TFx&& fx, TObj&& obj) { - typedef typename std::decay::type decay_of_to; - typedef typename std::decay::type decay_of_tfx; - std::string fkey(key); // Layout: @@ -142,9 +139,9 @@ private: // idx n + 1: is the object's void pointer // We don't need to store the size, because the other side is templated // with the same member function pointer type - decay_of_tfx fxptr(std::forward(fx)); + Decay fxptr(std::forward(fx)); void* userobjdata = static_cast(detail::get_ptr(obj)); - lua_CFunction freefunc = &static_object_lua_func::call; + lua_CFunction freefunc = &static_object_lua_func, TFx>::call; const char* freefuncname = fkey.c_str(); const luaL_Reg funcreg[ 2 ] = { { freefuncname, freefunc }, @@ -164,9 +161,8 @@ private: template table& set_fx(std::false_type, T&& key, TFx&& fx) { - typedef typename std::decay::type ptr_fx; std::string fkey(key); - ptr_fx target(std::forward(fx)); + Decay target(std::forward(fx)); lua_CFunction freefunc = &static_lua_func::call; const char* freefuncname = fkey.c_str(); const luaL_Reg funcreg[ 2 ] = { @@ -176,7 +172,7 @@ private: push(); - int upvalues = stack::push_user(state(), target); + int upvalues = stack::push_user(state(), target); luaL_setfuncs(state(), funcreg, upvalues); lua_pop(state(), 1); @@ -205,10 +201,9 @@ private: lua_settable(state(), -3); } - push(); + push(); stack::push_user(state(), userdata, metatablename); luaL_setfuncs(state(), funcreg, 1); - lua_pop(state(), 1); return *this; } diff --git a/sol/traits.hpp b/sol/traits.hpp new file mode 100644 index 00000000..f49b0ca5 --- /dev/null +++ b/sol/traits.hpp @@ -0,0 +1,72 @@ +// The MIT License (MIT) + +// Copyright (c) 2013 Danny Y., Rapptz + +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +// the Software, and to permit persons to whom the Software is furnished to do so, +// subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +// FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +// COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +// IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +#ifndef SOL_TRAITS_HPP +#define SOL_TRAITS_HPP + +#include + +namespace sol { +template +using EnableIf = typename std::enable_if::type; + +template +using DisableIf = typename std::enable_if::type; + +template +using Unqualified = typename std::remove_reference::type>::type; + +namespace detail { +// code borrowed from Gears +// https://github.com/Rapptz/Gears/ +template +struct is_function_impl : std::is_function {}; + +template +struct is_function_impl>>> { + using yes = char; + using no = struct { char s[2]; }; + + struct F { void operator()(); }; + struct Derived : T, F { }; + template struct Check; + + template + static no test(Check*); + + template + static yes test(...); + + static const bool value = sizeof(test(0)) == sizeof(yes); +}; +} // detail + +template +using Bool = std::integral_constant; + +template +struct Function : Bool::value> {}; + +template +using Decay = typename std::decay::type; +} // sol + +#endif // SOL_TRAITS_HPP \ No newline at end of file