From c115fcf42f3b4ccd2cb1e4b2b8bd8bcebcdfe1f9 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Mon, 17 Mar 2025 00:14:14 +0700 Subject: [PATCH] is_alive_all/any, is_empty_all/any --- README.md | 9 ++- develop/untests.lua | 108 ++++++++++++++++++++++--------- evolved.lua | 152 ++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 232 insertions(+), 37 deletions(-) diff --git a/README.md b/README.md index ef79422..5788b18 100644 --- a/README.md +++ b/README.md @@ -60,8 +60,13 @@ unpack :: id -> integer, integer defer :: boolean commit :: boolean -is_alive :: entity... -> boolean -is_empty :: entity... -> boolean +is_alive :: entity -> boolean +is_alive_all :: entity... -> boolean +is_alive_any :: entity... -> boolean + +is_empty :: entity -> boolean +is_empty_all :: entity... -> boolean +is_empty_any :: entity... -> boolean get :: entity, fragment... -> component... has :: entity, fragment -> boolean diff --git a/develop/untests.lua b/develop/untests.lua index 3851185..6aa8ac5 100644 --- a/develop/untests.lua +++ b/develop/untests.lua @@ -7647,59 +7647,105 @@ end do local a1, a2, a3, a4, a5 = evo.id(5) - assert(evo.is_alive()) assert(evo.is_alive(a1)) - assert(evo.is_alive(a1, a2)) - assert(evo.is_alive(a1, a2, a3)) - assert(evo.is_alive(a1, a2, a3, a4)) - assert(evo.is_alive(a1, a2, a3, a4, a5)) + assert(evo.is_alive_all()) + assert(evo.is_alive_all(a1)) + assert(evo.is_alive_all(a1, a2)) + assert(evo.is_alive_all(a1, a2, a3)) + assert(evo.is_alive_all(a1, a2, a3, a4)) + assert(evo.is_alive_all(a1, a2, a3, a4, a5)) + + assert(not evo.is_alive_any()) + assert(evo.is_alive_any(a1)) + assert(evo.is_alive_any(a1, a2)) + assert(evo.is_alive_any(a1, a2, a3)) + assert(evo.is_alive_any(a1, a2, a3, a4)) + assert(evo.is_alive_any(a1, a2, a3, a4, a5)) local d1, d2 = evo.id(2) assert(evo.destroy(d1, d2)) assert(not evo.is_alive(d1)) - assert(not evo.is_alive(d1, d2)) - assert(not evo.is_alive(d1, a1)) - assert(not evo.is_alive(a1, d1)) - assert(not evo.is_alive(d1, d2, a1)) - assert(not evo.is_alive(d1, a1, a2)) - assert(not evo.is_alive(d1, a1, a2, d2, a3)) - assert(not evo.is_alive(d1, a1, a2, d2, a3, d1)) + assert(not evo.is_alive_all(d1)) + assert(not evo.is_alive_all(d1, d2)) + assert(not evo.is_alive_all(d1, a1)) + assert(not evo.is_alive_all(a1, d1)) + assert(not evo.is_alive_all(d1, d2, a1)) + assert(not evo.is_alive_all(d1, a1, a2)) + assert(not evo.is_alive_all(d1, a1, a2, d2, a3)) + assert(not evo.is_alive_all(d1, a1, a2, d2, a3, d1)) + + assert(not evo.is_alive_any(d1)) + assert(not evo.is_alive_any(d1, d2)) + assert(evo.is_alive_any(d1, a1)) + assert(evo.is_alive_any(a1, d1)) + assert(evo.is_alive_any(d1, d2, a1)) + assert(evo.is_alive_any(d1, a1, a2)) + assert(evo.is_alive_any(d1, a1, a2, d2, a3)) + assert(evo.is_alive_any(d1, a1, a2, d2, a3, d1)) end do local e1, e2, e3, e4, e5 = evo.id(5) - assert(evo.is_empty()) assert(evo.is_empty(e1)) - assert(evo.is_empty(e1, e2)) - assert(evo.is_empty(e1, e2, e3)) - assert(evo.is_empty(e1, e2, e3, e4)) - assert(evo.is_empty(e1, e2, e3, e4, e5)) + assert(evo.is_empty_all()) + assert(evo.is_empty_all(e1)) + assert(evo.is_empty_all(e1, e2)) + assert(evo.is_empty_all(e1, e2, e3)) + assert(evo.is_empty_all(e1, e2, e3, e4)) + assert(evo.is_empty_all(e1, e2, e3, e4, e5)) + + assert(not evo.is_empty_any()) + assert(evo.is_empty_any(e1)) + assert(evo.is_empty_any(e1, e2)) + assert(evo.is_empty_any(e1, e2, e3)) + assert(evo.is_empty_any(e1, e2, e3, e4)) + assert(evo.is_empty_any(e1, e2, e3, e4, e5)) local d1, d2 = evo.id(2) assert(evo.destroy(d1, d2)) assert(evo.is_empty(d1)) - assert(evo.is_empty(d1, d2)) - assert(evo.is_empty(d1, e1)) - assert(evo.is_empty(e1, d1)) - assert(evo.is_empty(d1, d2, e1)) - assert(evo.is_empty(d1, e1, e2)) - assert(evo.is_empty(d1, e1, e2, d2, e3)) - assert(evo.is_empty(d1, e1, e2, d2, e3, d1)) + assert(evo.is_empty_all(d1)) + assert(evo.is_empty_all(d1, d2)) + assert(evo.is_empty_all(d1, e1)) + assert(evo.is_empty_all(e1, d1)) + assert(evo.is_empty_all(d1, d2, e1)) + assert(evo.is_empty_all(d1, e1, e2)) + assert(evo.is_empty_all(d1, e1, e2, d2, e3)) + assert(evo.is_empty_all(d1, e1, e2, d2, e3, d1)) + + assert(evo.is_empty_any(d1)) + assert(evo.is_empty_any(d1, d2)) + assert(evo.is_empty_any(d1, e1)) + assert(evo.is_empty_any(e1, d1)) + assert(evo.is_empty_any(d1, d2, e1)) + assert(evo.is_empty_any(d1, e1, e2)) + assert(evo.is_empty_any(d1, e1, e2, d2, e3)) + assert(evo.is_empty_any(d1, e1, e2, d2, e3, d1)) local f1, f2 = evo.id(2) assert(evo.insert(f1, f1) and evo.insert(f2, f2)) assert(not evo.is_empty(f1)) - assert(not evo.is_empty(f1, f2)) - assert(not evo.is_empty(f1, e1)) - assert(not evo.is_empty(e1, f1)) - assert(not evo.is_empty(f1, f2, e1)) - assert(not evo.is_empty(f1, e1, e2)) - assert(not evo.is_empty(f1, e1, e2, f2, e3)) - assert(not evo.is_empty(f1, e1, e2, f2, e3, f1)) + assert(not evo.is_empty_all(f1)) + assert(not evo.is_empty_all(f1, f2)) + assert(not evo.is_empty_all(f1, e1)) + assert(not evo.is_empty_all(e1, f1)) + assert(not evo.is_empty_all(f1, f2, e1)) + assert(not evo.is_empty_all(f1, e1, e2)) + assert(not evo.is_empty_all(f1, e1, e2, f2, e3)) + assert(not evo.is_empty_all(f1, e1, e2, f2, e3, f1)) + + assert(not evo.is_empty_any(f1)) + assert(not evo.is_empty_any(f1, f2)) + assert(evo.is_empty_any(f1, e1)) + assert(evo.is_empty_any(e1, f1)) + assert(evo.is_empty_any(f1, f2, e1)) + assert(evo.is_empty_any(f1, e1, e2)) + assert(evo.is_empty_any(f1, e1, e2, f2, e3)) + assert(evo.is_empty_any(f1, e1, e2, f2, e3, f1)) end do diff --git a/evolved.lua b/evolved.lua index fe6b7f3..f92dbd0 100644 --- a/evolved.lua +++ b/evolved.lua @@ -639,7 +639,12 @@ local __evolved_defer local __evolved_commit local __evolved_is_alive +local __evolved_is_alive_all +local __evolved_is_alive_any + local __evolved_is_empty +local __evolved_is_empty_all +local __evolved_is_empty_any local __evolved_get local __evolved_has @@ -4907,10 +4912,18 @@ __evolved_commit = function() return __commit() end +---@param entity evolved.entity +---@return boolean +---@nodiscard +__evolved_is_alive = function(entity) + local entity_index = entity % 0x100000 + return __freelist_ids[entity_index] == entity +end + ---@param ... evolved.entity entities ---@return boolean ---@nodiscard -__evolved_is_alive = function(...) +__evolved_is_alive_all = function(...) local entity_count = __lua_select('#', ...) if entity_count == 0 then @@ -4961,14 +4974,81 @@ __evolved_is_alive = function(...) (ids[i2] == e2) and (ids[i3] == e3) and (ids[i4] == e4) and - __evolved_is_alive(__lua_select(5, ...)) + __evolved_is_alive_all(__lua_select(5, ...)) end end ---@param ... evolved.entity entities ---@return boolean ---@nodiscard -__evolved_is_empty = function(...) +__evolved_is_alive_any = function(...) + local entity_count = __lua_select('#', ...) + + if entity_count == 0 then + return false + end + + local ids = __freelist_ids + + if entity_count == 1 then + local e1 = ... + local i1 = e1 % 0x100000 + return + (ids[i1] == e1) + end + + if entity_count == 2 then + local e1, e2 = ... + local i1, i2 = e1 % 0x100000, e2 % 0x100000 + return + (ids[i1] == e1) or + (ids[i2] == e2) + end + + if entity_count == 3 then + local e1, e2, e3 = ... + local i1, i2, i3 = e1 % 0x100000, e2 % 0x100000, e3 % 0x100000 + return + (ids[i1] == e1) or + (ids[i2] == e2) or + (ids[i3] == e3) + end + + if entity_count == 4 then + local e1, e2, e3, e4 = ... + local i1, i2, i3, i4 = e1 % 0x100000, e2 % 0x100000, e3 % 0x100000, e4 % 0x100000 + return + (ids[i1] == e1) or + (ids[i2] == e2) or + (ids[i3] == e3) or + (ids[i4] == e4) + end + + do + local e1, e2, e3, e4 = ... + local i1, i2, i3, i4 = e1 % 0x100000, e2 % 0x100000, e3 % 0x100000, e4 % 0x100000 + return + (ids[i1] == e1) or + (ids[i2] == e2) or + (ids[i3] == e3) or + (ids[i4] == e4) or + __evolved_is_alive_any(__lua_select(5, ...)) + end +end + +---@param entity evolved.entity +---@return boolean +---@nodiscard +__evolved_is_empty = function(entity) + local entity_index = entity % 0x100000 + return __freelist_ids[entity_index] ~= entity + or not __entity_chunks[entity_index] +end + +---@param ... evolved.entity entities +---@return boolean +---@nodiscard +__evolved_is_empty_all = function(...) local entity_count = __lua_select('#', ...) if entity_count == 0 then @@ -5020,7 +5100,66 @@ __evolved_is_empty = function(...) (ids[i2] ~= e2 or not ecs[i2]) and (ids[i3] ~= e3 or not ecs[i3]) and (ids[i4] ~= e4 or not ecs[i4]) and - __evolved_is_empty(__lua_select(5, ...)) + __evolved_is_empty_all(__lua_select(5, ...)) + end +end + +---@param ... evolved.entity entities +---@return boolean +---@nodiscard +__evolved_is_empty_any = function(...) + local entity_count = __lua_select('#', ...) + + if entity_count == 0 then + return false + end + + local ids = __freelist_ids + local ecs = __entity_chunks + + if entity_count == 1 then + local e1 = ... + local i1 = e1 % 0x100000 + return + (ids[i1] ~= e1 or not ecs[i1]) + end + + if entity_count == 2 then + local e1, e2 = ... + local i1, i2 = e1 % 0x100000, e2 % 0x100000 + return + (ids[i1] ~= e1 or not ecs[i1]) or + (ids[i2] ~= e2 or not ecs[i2]) + end + + if entity_count == 3 then + local e1, e2, e3 = ... + local i1, i2, i3 = e1 % 0x100000, e2 % 0x100000, e3 % 0x100000 + return + (ids[i1] ~= e1 or not ecs[i1]) or + (ids[i2] ~= e2 or not ecs[i2]) or + (ids[i3] ~= e3 or not ecs[i3]) + end + + if entity_count == 4 then + local e1, e2, e3, e4 = ... + local i1, i2, i3, i4 = e1 % 0x100000, e2 % 0x100000, e3 % 0x100000, e4 % 0x100000 + return + (ids[i1] ~= e1 or not ecs[i1]) or + (ids[i2] ~= e2 or not ecs[i2]) or + (ids[i3] ~= e3 or not ecs[i3]) or + (ids[i4] ~= e4 or not ecs[i4]) + end + + do + local e1, e2, e3, e4 = ... + local i1, i2, i3, i4 = e1 % 0x100000, e2 % 0x100000, e3 % 0x100000, e4 % 0x100000 + return + (ids[i1] ~= e1 or not ecs[i1]) or + (ids[i2] ~= e2 or not ecs[i2]) or + (ids[i3] ~= e3 or not ecs[i3]) or + (ids[i4] ~= e4 or not ecs[i4]) or + __evolved_is_empty_any(__lua_select(5, ...)) end end @@ -8320,7 +8459,12 @@ evolved.defer = __evolved_defer evolved.commit = __evolved_commit evolved.is_alive = __evolved_is_alive +evolved.is_alive_all = __evolved_is_alive_all +evolved.is_alive_any = __evolved_is_alive_any + evolved.is_empty = __evolved_is_empty +evolved.is_empty_all = __evolved_is_empty_all +evolved.is_empty_any = __evolved_is_empty_any evolved.get = __evolved_get evolved.has = __evolved_has