mirror of
https://github.com/BlackMATov/evolved.lua.git
synced 2025-12-14 12:10:23 +07:00
use multi set api in builders
This commit is contained in:
@@ -3046,3 +3046,102 @@ do
|
||||
assert(remove_entity_sum == e and remove_component_sum == 41)
|
||||
end
|
||||
end
|
||||
|
||||
do
|
||||
local f1, f2 = evo.id(2)
|
||||
local qb = evo.query()
|
||||
|
||||
do
|
||||
local q = qb:build()
|
||||
|
||||
local includes, excludes = evo.get(q, evo.INCLUDES, evo.EXCLUDES)
|
||||
assert(includes == nil)
|
||||
assert(excludes == nil)
|
||||
end
|
||||
|
||||
do
|
||||
local q = qb:include(f1):build()
|
||||
|
||||
local includes, excludes = evo.get(q, evo.INCLUDES, evo.EXCLUDES)
|
||||
assert(#includes == 1 and includes[1] == f1)
|
||||
assert(excludes == nil)
|
||||
end
|
||||
|
||||
do
|
||||
local q = qb:include(f1, f2):build()
|
||||
|
||||
local includes, excludes = evo.get(q, evo.INCLUDES, evo.EXCLUDES)
|
||||
assert(#includes == 2 and includes[1] == f1 and includes[2] == f2)
|
||||
assert(excludes == nil)
|
||||
end
|
||||
|
||||
do
|
||||
local q = qb:include(f1):include(f2):build()
|
||||
|
||||
local includes, excludes = evo.get(q, evo.INCLUDES, evo.EXCLUDES)
|
||||
assert(#includes == 2 and includes[1] == f1 and includes[2] == f2)
|
||||
assert(excludes == nil)
|
||||
end
|
||||
|
||||
do
|
||||
local q = qb:exclude(f1):build()
|
||||
|
||||
local includes, excludes = evo.get(q, evo.INCLUDES, evo.EXCLUDES)
|
||||
assert(includes == nil)
|
||||
assert(#excludes == 1 and excludes[1] == f1)
|
||||
end
|
||||
|
||||
do
|
||||
local q = qb:exclude(f1, f2):build()
|
||||
|
||||
local includes, excludes = evo.get(q, evo.INCLUDES, evo.EXCLUDES)
|
||||
assert(includes == nil)
|
||||
assert(#excludes == 2 and excludes[1] == f1 and excludes[2] == f2)
|
||||
end
|
||||
|
||||
do
|
||||
local q = qb:exclude(f1):exclude(f2):build()
|
||||
|
||||
local includes, excludes = evo.get(q, evo.INCLUDES, evo.EXCLUDES)
|
||||
assert(includes == nil)
|
||||
assert(#excludes == 2 and excludes[1] == f1 and excludes[2] == f2)
|
||||
end
|
||||
|
||||
do
|
||||
qb:include(f1)
|
||||
qb:exclude(f2)
|
||||
|
||||
local q = qb:build()
|
||||
|
||||
local includes, excludes = evo.get(q, evo.INCLUDES, evo.EXCLUDES)
|
||||
assert(#includes == 1 and includes[1] == f1)
|
||||
assert(#excludes == 1 and excludes[1] == f2)
|
||||
end
|
||||
end
|
||||
|
||||
do
|
||||
local f1, f2 = evo.id(2)
|
||||
local eb = evo.entity()
|
||||
|
||||
do
|
||||
local e = eb:build()
|
||||
assert(evo.is_alive(e) and evo.is_empty(e))
|
||||
end
|
||||
|
||||
do
|
||||
local e = eb:set(f1, 41):build()
|
||||
assert(evo.has(e, f1) and evo.get(e, f1) == 41)
|
||||
assert(not evo.has(e, f2) and evo.get(e, f2) == nil)
|
||||
end
|
||||
|
||||
do
|
||||
local e = eb:set(f1, 41):set(f2, 42):build()
|
||||
assert(evo.has(e, f1) and evo.get(e, f1) == 41)
|
||||
assert(evo.has(e, f2) and evo.get(e, f2) == 42)
|
||||
end
|
||||
|
||||
do
|
||||
local e = eb:build()
|
||||
assert(evo.is_alive(e) and evo.is_empty(e))
|
||||
end
|
||||
end
|
||||
|
||||
66
evolved.lua
66
evolved.lua
@@ -3429,8 +3429,8 @@ evolved_entity_builder.__index = evolved_entity_builder
|
||||
function evolved.entity()
|
||||
---@type evolved.__entity_builder
|
||||
local builder = {
|
||||
__fragment_list = __acquire_table(__TABLE_POOL_TAG__FRAGMENT_LIST, 8, 0),
|
||||
__component_list = __acquire_table(__TABLE_POOL_TAG__COMPONENT_LIST, 8, 0),
|
||||
__fragment_list = nil,
|
||||
__component_list = nil,
|
||||
}
|
||||
---@cast builder evolved.entity_builder
|
||||
return setmetatable(builder, evolved_entity_builder)
|
||||
@@ -3445,6 +3445,13 @@ function evolved_entity_builder:set(fragment, ...)
|
||||
local fragment_list = self.__fragment_list
|
||||
local component_list = self.__component_list
|
||||
|
||||
if not fragment_list then
|
||||
fragment_list = __acquire_table(__TABLE_POOL_TAG__FRAGMENT_LIST, 8, 0)
|
||||
component_list = __acquire_table(__TABLE_POOL_TAG__COMPONENT_LIST, 8, 0)
|
||||
self.__fragment_list = fragment_list
|
||||
self.__component_list = component_list
|
||||
end
|
||||
|
||||
fragment_list[#fragment_list + 1] = fragment
|
||||
component_list[#component_list + 1] = component
|
||||
|
||||
@@ -3456,17 +3463,17 @@ function evolved_entity_builder:build()
|
||||
local fragment_list = self.__fragment_list
|
||||
local component_list = self.__component_list
|
||||
|
||||
self.__fragment_list = __acquire_table(__TABLE_POOL_TAG__FRAGMENT_LIST, 8, 0)
|
||||
self.__component_list = __acquire_table(__TABLE_POOL_TAG__COMPONENT_LIST, 8, 0)
|
||||
self.__fragment_list = nil
|
||||
self.__component_list = nil
|
||||
|
||||
local entity = evolved.id()
|
||||
|
||||
for i = 1, #fragment_list do
|
||||
local fragment = fragment_list[i]
|
||||
local component = component_list[i]
|
||||
evolved.set(entity, fragment, component)
|
||||
if not fragment_list then
|
||||
return entity
|
||||
end
|
||||
|
||||
evolved.multi_set(entity, fragment_list, component_list)
|
||||
|
||||
__release_table(__TABLE_POOL_TAG__FRAGMENT_LIST, fragment_list)
|
||||
__release_table(__TABLE_POOL_TAG__COMPONENT_LIST, component_list)
|
||||
|
||||
@@ -3533,18 +3540,29 @@ function evolved_fragment_builder:build()
|
||||
|
||||
local fragment = evolved.id()
|
||||
|
||||
local fragment_list = __acquire_table(__TABLE_POOL_TAG__FRAGMENT_LIST, 3, 0)
|
||||
local component_list = __acquire_table(__TABLE_POOL_TAG__COMPONENT_LIST, 3, 0)
|
||||
|
||||
if tag then
|
||||
evolved.set(fragment, evolved.TAG, tag)
|
||||
fragment_list[#fragment_list + 1] = evolved.TAG
|
||||
component_list[#component_list + 1] = true
|
||||
end
|
||||
|
||||
if default ~= nil then
|
||||
evolved.set(fragment, evolved.DEFAULT, default)
|
||||
fragment_list[#fragment_list + 1] = evolved.DEFAULT
|
||||
component_list[#component_list + 1] = default
|
||||
end
|
||||
|
||||
if construct ~= nil then
|
||||
evolved.set(fragment, evolved.CONSTRUCT, construct)
|
||||
fragment_list[#fragment_list + 1] = evolved.CONSTRUCT
|
||||
component_list[#component_list + 1] = construct
|
||||
end
|
||||
|
||||
evolved.multi_set(fragment, fragment_list, component_list)
|
||||
|
||||
__release_table(__TABLE_POOL_TAG__FRAGMENT_LIST, fragment_list)
|
||||
__release_table(__TABLE_POOL_TAG__COMPONENT_LIST, component_list)
|
||||
|
||||
return fragment
|
||||
end
|
||||
|
||||
@@ -3586,7 +3604,7 @@ function evolved_query_builder:include(...)
|
||||
local include_list = self.__include_list
|
||||
|
||||
if not include_list then
|
||||
include_list = __acquire_table(__TABLE_POOL_TAG__FRAGMENT_LIST, 8, 0)
|
||||
include_list = __table_new(math.max(8, fragment_count), 0)
|
||||
self.__include_list = include_list
|
||||
end
|
||||
|
||||
@@ -3594,8 +3612,7 @@ function evolved_query_builder:include(...)
|
||||
|
||||
for i = 1, fragment_count do
|
||||
local fragment = select(i, ...)
|
||||
include_list[include_list_size + 1] = fragment
|
||||
include_list_size = include_list_size + 1
|
||||
include_list[include_list_size + i] = fragment
|
||||
end
|
||||
|
||||
return self
|
||||
@@ -3613,7 +3630,7 @@ function evolved_query_builder:exclude(...)
|
||||
local exclude_list = self.__exclude_list
|
||||
|
||||
if not exclude_list then
|
||||
exclude_list = __acquire_table(__TABLE_POOL_TAG__FRAGMENT_LIST, 8, 0)
|
||||
exclude_list = __table_new(math.max(8, fragment_count), 0)
|
||||
self.__exclude_list = exclude_list
|
||||
end
|
||||
|
||||
@@ -3621,8 +3638,7 @@ function evolved_query_builder:exclude(...)
|
||||
|
||||
for i = 1, fragment_count do
|
||||
local fragment = select(i, ...)
|
||||
exclude_list[exclude_list_size + 1] = fragment
|
||||
exclude_list_size = exclude_list_size + 1
|
||||
exclude_list[exclude_list_size + i] = fragment
|
||||
end
|
||||
|
||||
return self
|
||||
@@ -3638,16 +3654,24 @@ function evolved_query_builder:build()
|
||||
|
||||
local query = evolved.id()
|
||||
|
||||
local fragment_list = __acquire_table(__TABLE_POOL_TAG__FRAGMENT_LIST, 2, 0)
|
||||
local component_list = __acquire_table(__TABLE_POOL_TAG__COMPONENT_LIST, 2, 0)
|
||||
|
||||
if include_list then
|
||||
evolved.insert(query, evolved.INCLUDES, __table_unpack(include_list))
|
||||
__release_table(__TABLE_POOL_TAG__FRAGMENT_LIST, include_list)
|
||||
fragment_list[#fragment_list + 1] = evolved.INCLUDES
|
||||
component_list[#component_list + 1] = include_list
|
||||
end
|
||||
|
||||
if exclude_list then
|
||||
evolved.insert(query, evolved.EXCLUDES, __table_unpack(exclude_list))
|
||||
__release_table(__TABLE_POOL_TAG__FRAGMENT_LIST, exclude_list)
|
||||
fragment_list[#fragment_list + 1] = evolved.EXCLUDES
|
||||
component_list[#component_list + 1] = exclude_list
|
||||
end
|
||||
|
||||
evolved.multi_set(query, fragment_list, component_list)
|
||||
|
||||
__release_table(__TABLE_POOL_TAG__FRAGMENT_LIST, fragment_list)
|
||||
__release_table(__TABLE_POOL_TAG__COMPONENT_LIST, component_list)
|
||||
|
||||
return query
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user