push/pop pragma macros, wew lad

This commit is contained in:
ThePhD 2019-02-14 04:52:30 -05:00
parent b938e42af6
commit 9c050230f3
No known key found for this signature in database
GPG Key ID: 1509DB1C0F702BFA
5 changed files with 33 additions and 320 deletions

View File

@ -23,12 +23,9 @@
#define SOL_HPP #define SOL_HPP
#if defined(UE_BUILD_DEBUG) || defined(UE_BUILD_DEVELOPMENT) || defined(UE_BUILD_TEST) || defined(UE_BUILD_SHIPPING) || defined(UE_SERVER) #if defined(UE_BUILD_DEBUG) || defined(UE_BUILD_DEVELOPMENT) || defined(UE_BUILD_TEST) || defined(UE_BUILD_SHIPPING) || defined(UE_SERVER)
#define SOL_INSIDE_UNREAL 1 #define SOL_INSIDE_UNREAL
#endif // Unreal Engine 4 bullshit
#if defined(SOL_INSIDE_UNREAL) && SOL_INSIDE_UNREAL
#ifdef check #ifdef check
#define SOL_INSIDE_UNREAL_REMOVED_CHECK 1 #pragma push_macro("check")
#undef check #undef check
#endif #endif
#endif // Unreal Engine 4 Bullshit #endif // Unreal Engine 4 Bullshit
@ -74,23 +71,9 @@
#pragma warning(push) #pragma warning(push)
#endif // g++ #endif // g++
#if defined(SOL_INSIDE_UNREAL) && SOL_INSIDE_UNREAL #if defined(SOL_INSIDE_UNREAL)
#if defined(SOL_INSIDE_UNREAL_REMOVED_CHECK) && SOL_INSIDE_UNREAL_REMOVED_CHECK #undef check
#if defined(DO_CHECK) && DO_CHECK #pragma pop_macro("check")
#define check(expr) \
{ \
if (UNLIKELY(!(expr))) { \
FDebug::LogAssertFailedMessage(#expr, __FILE__, __LINE__); \
_DebugBreakAndPromptForRemote(); \
FDebug::AssertFailed(#expr, __FILE__, __LINE__); \
CA_ASSUME(false); \
} \
}
#else
#define check(expr) \
{ CA_ASSUME(expr); }
#endif
#endif
#endif // Unreal Engine 4 Bullshit #endif // Unreal Engine 4 Bullshit
#endif // SOL_HPP #endif // SOL_HPP

View File

@ -508,6 +508,10 @@ namespace sol {
iter(T& source, iterator it) iter(T& source, iterator it)
: source(source), it(std::move(it)), i(0) { : source(source), it(std::move(it)), i(0) {
} }
~iter() {
}
}; };
static auto& get_src(lua_State* L) { static auto& get_src(lua_State* L) {
@ -1073,7 +1077,7 @@ namespace sol {
auto& source = i.source; auto& source = i.source;
auto& it = i.it; auto& it = i.it;
if (it == deferred_uc::end(L, source)) { if (it == deferred_uc::end(L, source)) {
return 0; return stack::push(L, lua_nil);
} }
int p; int p;
if (ip) { if (ip) {
@ -1095,7 +1099,7 @@ namespace sol {
auto& it = i.it; auto& it = i.it;
next_K k = stack::unqualified_get<next_K>(L, 2); next_K k = stack::unqualified_get<next_K>(L, 2);
if (it == deferred_uc::end(L, source)) { if (it == deferred_uc::end(L, source)) {
return 0; return stack::push(L, lua_nil);
} }
int p; int p;
p = stack::push_reference(L, k + 1); p = stack::push_reference(L, k + 1);

View File

@ -20,8 +20,8 @@
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// This file was generated with a script. // This file was generated with a script.
// Generated 2019-02-14 07:36:40.809154 UTC // Generated 2019-02-14 09:52:13.841439 UTC
// This header was generated with sol v2.20.6 (revision ffe77cc) // This header was generated with sol v2.20.6 (revision b938e42)
// https://github.com/ThePhD/sol2 // https://github.com/ThePhD/sol2
#ifndef SOL_SINGLE_INCLUDE_FORWARD_HPP #ifndef SOL_SINGLE_INCLUDE_FORWARD_HPP

View File

@ -20,8 +20,8 @@
// CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
// This file was generated with a script. // This file was generated with a script.
// Generated 2019-02-14 07:36:40.566598 UTC // Generated 2019-02-14 09:52:13.459443 UTC
// This header was generated with sol v2.20.6 (revision ffe77cc) // This header was generated with sol v2.20.6 (revision b938e42)
// https://github.com/ThePhD/sol2 // https://github.com/ThePhD/sol2
#ifndef SOL_SINGLE_INCLUDE_HPP #ifndef SOL_SINGLE_INCLUDE_HPP
@ -33,12 +33,9 @@
#define SOL_HPP #define SOL_HPP
#if defined(UE_BUILD_DEBUG) || defined(UE_BUILD_DEVELOPMENT) || defined(UE_BUILD_TEST) || defined(UE_BUILD_SHIPPING) || defined(UE_SERVER) #if defined(UE_BUILD_DEBUG) || defined(UE_BUILD_DEVELOPMENT) || defined(UE_BUILD_TEST) || defined(UE_BUILD_SHIPPING) || defined(UE_SERVER)
#define SOL_INSIDE_UNREAL 1 #define SOL_INSIDE_UNREAL
#endif // Unreal Engine 4 bullshit
#if defined(SOL_INSIDE_UNREAL) && SOL_INSIDE_UNREAL
#ifdef check #ifdef check
#define SOL_INSIDE_UNREAL_REMOVED_CHECK 1 #pragma push_macro("check")
#undef check #undef check
#endif #endif
#endif // Unreal Engine 4 Bullshit #endif // Unreal Engine 4 Bullshit
@ -18758,6 +18755,10 @@ namespace sol {
iter(T& source, iterator it) iter(T& source, iterator it)
: source(source), it(std::move(it)), i(0) { : source(source), it(std::move(it)), i(0) {
} }
~iter() {
}
}; };
static auto& get_src(lua_State* L) { static auto& get_src(lua_State* L) {
@ -19323,7 +19324,7 @@ namespace sol {
auto& source = i.source; auto& source = i.source;
auto& it = i.it; auto& it = i.it;
if (it == deferred_uc::end(L, source)) { if (it == deferred_uc::end(L, source)) {
return 0; return stack::push(L, lua_nil);
} }
int p; int p;
if (ip) { if (ip) {
@ -19345,7 +19346,7 @@ namespace sol {
auto& it = i.it; auto& it = i.it;
next_K k = stack::unqualified_get<next_K>(L, 2); next_K k = stack::unqualified_get<next_K>(L, 2);
if (it == deferred_uc::end(L, source)) { if (it == deferred_uc::end(L, source)) {
return 0; return stack::push(L, lua_nil);
} }
int p; int p;
p = stack::push_reference(L, k + 1); p = stack::push_reference(L, k + 1);
@ -24383,23 +24384,9 @@ namespace sol {
#pragma warning(push) #pragma warning(push)
#endif // g++ #endif // g++
#if defined(SOL_INSIDE_UNREAL) && SOL_INSIDE_UNREAL #if defined(SOL_INSIDE_UNREAL)
#if defined(SOL_INSIDE_UNREAL_REMOVED_CHECK) && SOL_INSIDE_UNREAL_REMOVED_CHECK #undef check
#if defined(DO_CHECK) && DO_CHECK #pragma pop_macro("check")
#define check(expr) \
{ \
if (UNLIKELY(!(expr))) { \
FDebug::LogAssertFailedMessage(#expr, __FILE__, __LINE__); \
_DebugBreakAndPromptForRemote(); \
FDebug::AssertFailed(#expr, __FILE__, __LINE__); \
CA_ASSUME(false); \
} \
}
#else
#define check(expr) \
{ CA_ASSUME(expr); }
#endif
#endif
#endif // Unreal Engine 4 Bullshit #endif // Unreal Engine 4 Bullshit
#endif // SOL_HPP #endif // SOL_HPP

View File

@ -26,272 +26,11 @@
#include <catch.hpp> #include <catch.hpp>
#include <iterator> #include <iterator>
#include <vector>
#include <list>
#include <forward_list>
#include <deque>
#include <set>
#include <map>
#include <array>
#include <numeric> // std::iota #include <numeric> // std::iota
struct my_object {
private:
std::vector<int> mdata;
public:
static const void* last_printed;
my_object(int sz) : mdata() {
mdata.resize(sz);
std::iota(mdata.begin(), mdata.end(), 1);
}
void operator()(std::size_t count, int value) {
for (; count > 0; --count) {
mdata.push_back(value);
}
}
public: // Container requirements, as per the C++ standard
using value_type = int;
using reference = value_type&;
using const_reference = const value_type&;
using iterator = decltype(mdata)::iterator;
using const_iterator = decltype(mdata)::const_iterator;
using difference_type = decltype(mdata)::difference_type;
using size_type = decltype(mdata)::size_type;
iterator begin() {
return iterator(mdata.begin());
}
iterator end() {
return iterator(mdata.end());
}
const_iterator begin() const {
return const_iterator(mdata.begin());
}
const_iterator end() const {
return const_iterator(mdata.end());
}
const_iterator cbegin() const {
return begin();
}
const_iterator cend() const {
return end();
}
size_type size() const noexcept {
return mdata.size();
}
size_type max_size() const noexcept {
return mdata.max_size();
}
void push_back(const value_type& v) {
mdata.push_back(v);
}
void insert(const_iterator where, const value_type& v) {
mdata.insert(where, v);
}
bool empty() const noexcept {
return mdata.empty();
}
bool operator==(const my_object& right) const {
return mdata == right.mdata;
}
bool operator!=(const my_object& right) const noexcept {
return mdata != right.mdata;
}
std::vector<int>& data() {
return mdata;
}
const std::vector<int>& data() const {
return mdata;
}
};
const void* my_object::last_printed = nullptr;
std::ostream& operator<<(std::ostream& ostr, const my_object& mo) {
my_object::last_printed = static_cast<const void*>(&mo);
ostr << "{ ";
const auto& v = mo.data();
if (v.empty()) {
ostr << "empty";
}
else {
ostr << v[0];
for (std::size_t i = 1; i < v.size(); ++i) {
ostr << ", " << v[i];
}
}
ostr << " }";
return ostr;
}
namespace sol {
template <>
struct is_container<my_object> : std::false_type {};
} // namespace sol
TEST_CASE("containers/as_container reference", "test that we can force a container to be treated like one despite is_container being false_type") {
sol::state lua;
lua.open_libraries(sol::lib::base);
lua.new_usertype<my_object>("my_object",
sol::constructors<my_object(int)>(),
sol::call_constructor,
sol::constructors<my_object(int)>(),
"size",
&my_object::size,
"iterable",
[](my_object& mo) { return sol::as_container(mo); });
#if SOL_LUA_VERSION > 501
auto result1 = lua.safe_script(R"(
mop = my_object.new(20)
for i, v in pairs(mop) do
assert(i == v)
end
print(mop)
)",
sol::script_pass_on_error);
REQUIRE(result1.valid());
REQUIRE_NOTHROW([&]() {
my_object& mo = lua["mop"];
REQUIRE((&mo == my_object::last_printed));
}());
#endif
auto result2 = lua.safe_script(R"(
mo = my_object(10)
c_mo = mo
c_iterable = mo:iterable()
)",
sol::script_pass_on_error);
REQUIRE(result2.valid());
REQUIRE_NOTHROW([&]() {
my_object& mo = lua["c_mo"];
my_object& mo_iterable = lua["c_iterable"];
REQUIRE(&mo == &mo_iterable);
REQUIRE(mo == mo_iterable);
}());
auto result3 = lua.safe_script(R"(
s1 = c_mo:size()
s1_len = #c_mo
s1_iterable = c_iterable:size()
s1_iterable_len = #c_iterable
)");
REQUIRE(result3.valid());
REQUIRE_NOTHROW([&]() {
std::size_t s1 = lua["s1"];
std::size_t s1_len = lua["s1_len"];
std::size_t s1_iterable = lua["s1_iterable"];
std::size_t s1_iterable_len = lua["s1_iterable_len"];
REQUIRE(s1 == 10);
REQUIRE(s1 == s1_len);
REQUIRE(s1 == s1_iterable_len);
REQUIRE(s1_iterable == s1_iterable_len);
}());
auto result4 = lua.safe_script(R"(
for i=1,#c_mo do
v_iterable = c_iterable[i]
assert(v_iterable == i)
end
)",
sol::script_pass_on_error);
REQUIRE(result4.valid());
auto result5 = lua.safe_script(R"(
mo(5, 20)
c_iterable:insert(1, 100)
v1 = c_iterable[1]
s2 = c_mo:size()
s2_len = #c_mo
s2_iterable = c_iterable:size()
s2_iterable_len = #c_iterable
print(mo)
)",
sol::script_pass_on_error);
REQUIRE(result5.valid());
int v1 = lua["v1"];
std::size_t s2 = lua["s2"];
std::size_t s2_len = lua["s2_len"];
std::size_t s2_iterable = lua["s2_iterable"];
std::size_t s2_iterable_len = lua["s2_iterable_len"];
REQUIRE(v1 == 100);
REQUIRE(s2 == 16);
REQUIRE(s2 == s2_len);
REQUIRE(s2 == s2_iterable_len);
REQUIRE(s2_iterable == s2_iterable_len);
my_object& mo = lua["mo"];
REQUIRE(&mo == my_object::last_printed);
}
TEST_CASE("containers/as_container", "test that we can force a container to be treated like one despite the trait being false using the proper marker") {
sol::state lua;
lua.open_libraries(sol::lib::base);
lua.set_function("f", [](int v) { return sol::as_container(my_object(v)); });
#if SOL_LUA_VERSION > 501
auto result1 = lua.safe_script(R"(
mop = f(20)
for i, v in pairs(mop) do
assert(i == v)
end
)");
REQUIRE(result1.valid());
#endif
auto result2 = lua.safe_script(R"(
mo = f(10)
c_iterable = mo
)");
REQUIRE(result2.valid());
{
my_object& mo = lua["mo"];
my_object& mo_iterable = lua["c_iterable"];
REQUIRE(&mo == &mo_iterable);
REQUIRE(mo == mo_iterable);
}
auto result3 = lua.safe_script(R"(
s1_iterable = c_iterable:size()
s1_iterable_len = #c_iterable
)");
REQUIRE(result3.valid());
{
std::size_t s1_iterable = lua["s1_iterable"];
std::size_t s1_iterable_len = lua["s1_iterable_len"];
REQUIRE(s1_iterable == 10);
REQUIRE(s1_iterable == s1_iterable_len);
}
auto result4 = lua.safe_script(R"(
for i=1,#c_iterable do
v_iterable = c_iterable[i]
assert(v_iterable == i)
end
)");
REQUIRE(result4.valid());
auto result5 = lua.safe_script(R"(
c_iterable:insert(1, 100)
v1 = c_iterable:get(1)
s2_iterable = c_iterable:size()
s2_iterable_len = #c_iterable
)");
REQUIRE(result5.valid());
{
int v1 = lua["v1"];
std::size_t s2_iterable = lua["s2_iterable"];
std::size_t s2_iterable_len = lua["s2_iterable_len"];
REQUIRE(v1 == 100);
REQUIRE(s2_iterable_len == 11);
REQUIRE(s2_iterable == s2_iterable_len);
}
}