From 3117138d6f200e7e8c0649e58f1e2c403069fb31 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 9 Jan 2025 19:05:38 +0700 Subject: [PATCH] use multi set api in builders --- develop/untests.lua | 99 +++++++++++++++++++++++++++++++++++++++++++++ evolved.lua | 66 ++++++++++++++++++++---------- 2 files changed, 144 insertions(+), 21 deletions(-) diff --git a/develop/untests.lua b/develop/untests.lua index c5f4114..5048394 100644 --- a/develop/untests.lua +++ b/develop/untests.lua @@ -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 diff --git a/evolved.lua b/evolved.lua index 357fd59..f8f0aed 100644 --- a/evolved.lua +++ b/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