mirror of
https://github.com/ThePhD/sol2.git
synced 2024-03-22 13:10:44 +08:00
push/pop pragma macros, wew lad
This commit is contained in:
parent
b938e42af6
commit
9c050230f3
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user