diff --git a/README.md b/README.md index fef319c..da2c857 100644 --- a/README.md +++ b/README.md @@ -115,49 +115,37 @@ debug_mode :: boolean -> () collect_garbage :: () ``` -## Builders +## Builder ``` -entity :: entity_builder -entity_builder:set :: fragment, component -> entity_builder -entity_builder:build :: entity -``` - -``` -fragment :: fragment_builder -fragment_builder:tag :: fragment_builder -fragment_builder:name :: string -> fragment_builder -fragment_builder:single :: component -> fragment_builder -fragment_builder:default :: component -> fragment_builder -fragment_builder:duplicate :: {component -> component} -> fragment_builder -fragment_builder:on_set :: {entity, fragment, component, component?} -> fragment_builder -fragment_builder:on_assign :: {entity, fragment, component, component} -> fragment_builder -fragment_builder:on_insert :: {entity, fragment, component} -> fragment_builder -fragment_builder:on_remove :: {entity, fragment} -> fragment_builder -fragment_builder:destroy_policy :: id -> fragment_builder -fragment_builder:build :: fragment -``` - -``` -query :: query_builder -query_builder:name :: string -> query_builder -query_builder:single :: component -> query_builder -query_builder:include :: fragment... -> query_builder -query_builder:exclude :: fragment... -> query_builder -query_builder:build :: query -``` - -``` -system :: system_builder -system_builder:name :: string -> system_builder -system_builder:single :: component -> system_builder -system_builder:group :: system -> system_builder -system_builder:query :: query -> system_builder -system_builder:execute :: {chunk, entity[], integer} -> system_builder -system_builder:prologue :: {} -> system_builder -system_builder:epilogue :: {} -> system_builder -system_builder:disabled :: system_builder -system_builder:build :: system +builder :: builder +builder:has :: fragment -> boolean +builder:has_all :: fragment... -> boolean +builder:has_any :: fragment... -> boolean +builder:get :: fragment... -> component... +builder:set :: fragment, component -> builder +builder:remove :: fragment... -> builder +builder:clear :: builder +builder:tag :: builder +builder:name :: string -> builder +builder:prefab :: entity -> builder +builder:single :: component -> builder +builder:default :: component -> builder +builder:duplicate :: {component -> component} -> builder +builder:include :: fragment... -> builder +builder:exclude :: fragment... -> builder +builder:on_set :: {entity, fragment, component, component?} -> builder +builder:on_assign :: {entity, fragment, component, component} -> builder +builder:on_insert :: {entity, fragment, component} -> builder +builder:on_remove :: {entity, fragment} -> builder +builder:group :: system -> builder +builder:query :: query -> builder +builder:execute :: {chunk, entity[], integer} -> builder +builder:prologue :: {} -> builder +builder:epilogue :: {} -> builder +builder:disabled :: builder +builder:destroy_policy :: id -> builder +builder:build :: boolean -> entity ``` ## [License (MIT)](./LICENSE.md) diff --git a/develop/example.lua b/develop/example.lua index ff14085..22cc32a 100644 --- a/develop/example.lua +++ b/develop/example.lua @@ -2,6 +2,8 @@ local evo = require 'evolved' +evo.debug_mode(true) + ---@class evolved.vector2 ---@field x number ---@field y number @@ -16,41 +18,41 @@ local function vector2(x, y) end local groups = { - awake = evo.system():build(), - physics = evo.system():build(), - graphics = evo.system():build(), - shutdown = evo.system():build(), + awake = evo.builder():build(), + physics = evo.builder():build(), + graphics = evo.builder():build(), + shutdown = evo.builder():build(), } local singles = { - delta_time = evo.fragment():single(0.016):build(), - physics_gravity = evo.fragment():single(vector2(0, 9.81)):build(), + delta_time = evo.builder():single(0.016):build(), + physics_gravity = evo.builder():single(vector2(0, 9.81)):build(), } local fragments = { - force = evo.fragment():build(), - position = evo.fragment():build(), - velocity = evo.fragment():build(), + force = evo.builder():build(), + position = evo.builder():build(), + velocity = evo.builder():build(), } local queries = { - physics_bodies = evo.query() + physics_bodies = evo.builder() :include(fragments.force, fragments.position, fragments.velocity) :build(), } -local awake_system = evo.system() +local awake_system = evo.builder() :group(groups.awake) :prologue(function() print '-= | Awake | =-' - evo.entity() + evo.builder() :set(fragments.force, vector2(0, 0)) :set(fragments.position, vector2(0, 0)) :set(fragments.velocity, vector2(0, 0)) :build() end):build() -local integrate_forces_system = evo.system() +local integrate_forces_system = evo.builder() :group(groups.physics) :query(queries.physics_bodies) :execute(function(chunk, entities, entity_count) @@ -71,7 +73,7 @@ local integrate_forces_system = evo.system() end end):build() -local integrate_velocities_system = evo.system() +local integrate_velocities_system = evo.builder() :group(groups.physics) :query(queries.physics_bodies) :execute(function(chunk, entities, entity_count) @@ -94,7 +96,7 @@ local integrate_velocities_system = evo.system() end end):build() -local graphics_system = evo.system() +local graphics_system = evo.builder() :group(groups.graphics) :query(queries.physics_bodies) :execute(function(chunk, entities, entity_count) @@ -111,7 +113,7 @@ local graphics_system = evo.system() end end):build() -local shutdown_system = evo.system() +local shutdown_system = evo.builder() :group(groups.shutdown) :epilogue(function() print '-= | Shutdown | =-' diff --git a/develop/fuzzing/batch_destroy_fuzz.lua b/develop/fuzzing/batch_destroy_fuzz.lua index 6a48d08..b8b4968 100644 --- a/develop/fuzzing/batch_destroy_fuzz.lua +++ b/develop/fuzzing/batch_destroy_fuzz.lua @@ -81,7 +81,7 @@ end do local r = math.random(1, 2) - local q = evo.query():include(__table_unpack(destroying_include_list)):build() + local q = evo.builder():include(__table_unpack(destroying_include_list)):build() if r == 1 then evo.batch_destroy(q) @@ -98,7 +98,7 @@ end --- --- -local all_chunk_query = evo.query():build() +local all_chunk_query = evo.builder():build() for chunk in evo.execute(all_chunk_query) do assert(not evo.has_any(chunk, __table_unpack(should_be_destroyed_entity_list))) diff --git a/develop/fuzzing/destroy_fuzz.lua b/develop/fuzzing/destroy_fuzz.lua index c5a92b3..e9b4707 100644 --- a/develop/fuzzing/destroy_fuzz.lua +++ b/develop/fuzzing/destroy_fuzz.lua @@ -102,7 +102,7 @@ end --- --- -local all_chunk_query = evo.query():build() +local all_chunk_query = evo.builder():build() for chunk in evo.execute(all_chunk_query) do assert(not evo.has_any(chunk, __table_unpack(destroying_entity_list))) diff --git a/develop/unbench.lua b/develop/unbench.lua index b7016cd..c59e47d 100644 --- a/develop/unbench.lua +++ b/develop/unbench.lua @@ -4,9 +4,9 @@ basics.unload 'evolved' local evo = require 'evolved' local N = 1000 -local B = evo.entity() +local B = evo.builder() local F1, F2, F3, F4, F5 = evo.id(5) -local Q1 = evo.query():include(F1):build() +local Q1 = evo.builder():include(F1):build() print '----------------------------------------' diff --git a/develop/untests.lua b/develop/untests.lua index 59ebb68..6c69830 100644 --- a/develop/untests.lua +++ b/develop/untests.lua @@ -1263,13 +1263,13 @@ do local f1, f2 = evo.id(2) evo.set(f2, evo.DEFAULT, 42) - local e1 = evo.entity():set(f1, 11):build() - local e2 = evo.entity():set(f1, 21):set(f2, 22):build() + local e1 = evo.builder():set(f1, 11):build() + local e2 = evo.builder():set(f1, 21):set(f2, 22):build() assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == nil) assert(evo.get(e2, f1) == 21 and evo.get(e2, f2) == 22) - local q = evo.query():include(f1):exclude(f2):build() + local q = evo.builder():include(f1):exclude(f2):build() evo.batch_set(q, f2) assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == 42) @@ -2400,7 +2400,7 @@ do local f1, f2 = evo.id(2) do - local e = evo.entity() + local e = evo.builder() :set(f1, 41) :set(f2, 42) :build() @@ -2409,7 +2409,7 @@ do end do - local e = evo.entity() + local e = evo.builder() :set(f1, 11) :set(f1, 41) :build() @@ -2418,22 +2418,22 @@ do end do - local f1 = evo.fragment():default(41):build() - local f2 = evo.fragment():default(42):build() - local f3 = evo.fragment():tag():build() + local f1 = evo.builder():default(41):build() + local f2 = evo.builder():default(42):build() + local f3 = evo.builder():tag():build() - local e0 = evo.entity():build() + local e0 = evo.builder():build() assert(not evo.has_any(e0, f1, f2, f3)) - local e1 = evo.entity():set(f1):build() + local e1 = evo.builder():set(f1):build() assert(evo.has(e1, f1)) assert(evo.get(e1, f1) == 41) - local e2 = evo.entity():set(f1):set(f2):build() + local e2 = evo.builder():set(f1):set(f2):build() assert(evo.has(e2, f1) and evo.has(e2, f2)) assert(evo.get(e2, f1) == 41 and evo.get(e2, f2) == 42) - local e3 = evo.entity():set(f1):set(f2):set(f3):build() + local e3 = evo.builder():set(f1):set(f2):set(f3):build() assert(evo.has(e3, f1) and evo.has(e3, f2) and evo.has(e3, f3)) assert(evo.get(e3, f1) == 41 and evo.get(e3, f2) == 42 and evo.get(e3, f3) == nil) @@ -2450,9 +2450,9 @@ do return entities end - local q1 = evo.query():include(f1):build() - local q2 = evo.query():include(f1, f2):build() - local q3 = evo.query():include(f1):include(f2):exclude(f3):build() + local q1 = evo.builder():include(f1):build() + local q2 = evo.builder():include(f1, f2):build() + local q3 = evo.builder():include(f1):include(f2):exclude(f3):build() do local entities = collect_entities(q1) @@ -2482,7 +2482,7 @@ do local f2_set_count = 0 local f2_remove_count = 0 - local FB = evo.fragment() + local FB = evo.builder() local f1 = FB :on_assign(function(e, f, nc, oc) @@ -2520,10 +2520,10 @@ do end) :build() - local e1 = evo.entity():set(f1, 41):build() + local e1 = evo.builder():set(f1, 41):build() assert(f1_assign_count == 0 and f1_insert_count == 1) - local e2 = evo.entity():set(f1, 42):set(f1, 41):build() + local e2 = evo.builder():set(f1, 42):set(f1, 41):build() assert(f1_assign_count == 0 and f1_insert_count == 2) evo.set(e1, f1, 42) @@ -3061,7 +3061,7 @@ end do local f1, f2 = evo.id(2) - local qb = evo.query() + local qb = evo.builder() do local q = qb:build() @@ -3133,7 +3133,7 @@ end do local f1, f2 = evo.id(2) - local eb = evo.entity() + local eb = evo.builder() do local e = eb:build() @@ -3160,7 +3160,7 @@ end do local f1, f2 = evo.id(2) - local eb = evo.entity() + local eb = evo.builder() local e1 = eb:set(f1, 1):set(f2, 2):build() local e2 = eb:set(f1, 11):build() @@ -3334,7 +3334,7 @@ do local last_insert_entity = 0 local last_insert_component = 0 - local q = evo.query():include(cf):build() + local q = evo.builder():include(cf):build() evo.batch_set(q, evo.ON_SET, function(e, f, c) last_set_entity = e @@ -3542,7 +3542,7 @@ do local last_insert_entity = 0 local last_insert_component = 0 - local q = evo.query():include(cf):build() + local q = evo.builder():include(cf):build() evo.batch_set(q, evo.ON_SET, function(e, f, c) last_set_entity = e @@ -3735,19 +3735,19 @@ end do local f1, f2, f3, f4, f5 = evo.id(5) - local e1 = evo.entity():set(f1, 11):build() - local e2 = evo.entity():set(f1, 21):set(f2, 22):build() - local e3 = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e4 = evo.entity():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() + local e1 = evo.builder():set(f1, 11):build() + local e2 = evo.builder():set(f1, 21):set(f2, 22):build() + local e3 = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e4 = evo.builder():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() evo.batch_multi_remove(q, {}) evo.batch_multi_remove(q, { f5 }) end do - local q = evo.query():include(f3):build() + local q = evo.builder():include(f3):build() evo.batch_multi_remove(q, { f4 }) assert(evo.has_all(e4, f1, f2, f3) and not evo.has(e4, f4)) @@ -3778,7 +3778,7 @@ do end do - local q = evo.query():include(f2):build() + local q = evo.builder():include(f2):build() evo.batch_multi_remove(q, { f1 }) assert(evo.has_all(e1, f1) and not evo.has_any(e1, f2, f3, f4)) @@ -3820,7 +3820,7 @@ do end do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() assert(evo.defer()) evo.batch_multi_remove(q, { f1 }) @@ -3861,7 +3861,7 @@ do last_remove_component = 0 sum_removed_components = 0 - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() evo.batch_multi_remove(q, { f1, f1 }) assert(last_remove_entity == e2 and last_remove_component == 21) @@ -3873,7 +3873,7 @@ do last_remove_component = 0 sum_removed_components = 0 - local q = evo.query():include(f2):build() + local q = evo.builder():include(f2):build() evo.batch_multi_remove(q, { f2 }) assert(last_remove_entity == e2 and last_remove_component == nil) @@ -3884,10 +3884,10 @@ end do local f1, f2, f3, f4, f5 = evo.id(5) - local e1 = evo.entity():set(f1, 11):build() - local e2 = evo.entity():set(f1, 21):set(f2, 22):build() - local e3 = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e4 = evo.entity():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() + local e1 = evo.builder():set(f1, 11):build() + local e2 = evo.builder():set(f1, 21):set(f2, 22):build() + local e3 = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e4 = evo.builder():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == nil and evo.get(e1, f3) == nil) assert(evo.get(e2, f1) == 21 and evo.get(e2, f2) == 22 and evo.get(e2, f3) == nil) @@ -3895,17 +3895,17 @@ do assert(evo.get(e4, f1) == 41 and evo.get(e4, f2) == 42 and evo.get(e4, f3) == 43 and evo.get(e4, f4) == 44) do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() evo.batch_multi_set(q, {}) end do - local q = evo.query():include(f1, f5):build() + local q = evo.builder():include(f1, f5):build() evo.batch_multi_set(q, { f5 }) end do - local q = evo.query():include(f3, f4):build() + local q = evo.builder():include(f3, f4):build() evo.batch_multi_set(q, { f4 }, { 54 }) assert(evo.get(e3, f3) == 33 and evo.get(e3, f4) == nil) @@ -3913,7 +3913,7 @@ do end do - local q = evo.query():include(f2):build() + local q = evo.builder():include(f2):build() evo.batch_multi_set(q, { f1 }, { 51, 52 }) assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == nil and evo.get(e1, f3) == nil) @@ -3935,10 +3935,10 @@ do evo.set(f2, evo.DEFAULT, 41) evo.set(f3, evo.TAG) - local e1 = evo.entity():set(f1, 11):build() - local e2 = evo.entity():set(f1, 21):set(f2, 22):build() - local e3 = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e4 = evo.entity():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() + local e1 = evo.builder():set(f1, 11):build() + local e2 = evo.builder():set(f1, 21):set(f2, 22):build() + local e3 = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e4 = evo.builder():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == nil and evo.get(e1, f3) == nil) assert(evo.get(e2, f1) == 21 and evo.get(e2, f2) == 22 and evo.get(e2, f3) == nil) @@ -3946,13 +3946,13 @@ do assert(evo.get(e4, f1) == 41 and evo.get(e4, f2) == 42 and evo.get(e4, f3) == nil and evo.get(e4, f4) == 44) do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() evo.batch_multi_set(q, {}) evo.batch_multi_set(q, { f5 }) end do - local q = evo.query():include(f3, f4):build() + local q = evo.builder():include(f3, f4):build() evo.batch_multi_set(q, { f4 }, { 54 }) assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == nil and evo.get(e1, f3) == nil) @@ -3962,7 +3962,7 @@ do end do - local q = evo.query():include(f2):build() + local q = evo.builder():include(f2):build() evo.batch_multi_set(q, { f1 }, { 51, 52 }) assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == nil and evo.get(e1, f3) == nil) @@ -3978,7 +3978,7 @@ do end do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() evo.batch_multi_set(q, { f1 }) assert(evo.get(e1, f1) == true and evo.get(e1, f2) == nil and evo.get(e1, f3) == nil) @@ -4029,12 +4029,12 @@ do last_assign_old_component = oc end) - local e1 = evo.entity():set(f1, 11):build() - local e2 = evo.entity():set(f1, 21):set(f2, 22):build() - local e3 = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e1 = evo.builder():set(f1, 11):build() + local e2 = evo.builder():set(f1, 21):set(f2, 22):build() + local e3 = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() do - local q = evo.query():include(f3):build() + local q = evo.builder():include(f3):build() sum_entity = 0 last_assign_entity = 0 @@ -4049,7 +4049,7 @@ do end do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() sum_entity = 0 last_assign_entity = 0 @@ -4064,7 +4064,7 @@ do end do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() sum_entity = 0 last_assign_entity = 0 @@ -4079,7 +4079,7 @@ do end do - local q = evo.query():include(f1, f3):build() + local q = evo.builder():include(f1, f3):build() sum_entity = 0 last_assign_entity = 0 @@ -4097,19 +4097,19 @@ end do local f1, f2, f3, f4 = evo.id(4) - local e1 = evo.entity():set(f1, 11):build() - local e2 = evo.entity():set(f1, 21):set(f2, 22):build() - local e3 = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e4 = evo.entity():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() + local e1 = evo.builder():set(f1, 11):build() + local e2 = evo.builder():set(f1, 21):set(f2, 22):build() + local e3 = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e4 = evo.builder():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() evo.batch_multi_set(q, {}) end do - local q = evo.query():include(f3):exclude(f4):build() + local q = evo.builder():include(f3):exclude(f4):build() evo.batch_multi_set(q, { f4 }) assert(evo.get(e3, f1) == 31 and evo.get(e3, f2) == 32 and evo.get(e3, f3) == 33 and evo.get(e3, f4) == true) @@ -4132,7 +4132,7 @@ do end do - local q = evo.query():include(f1):exclude(f3, f4):build() + local q = evo.builder():include(f1):exclude(f3, f4):build() evo.batch_multi_set(q, { f3, f4 }, { 53, 54 }) assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == nil and evo.get(e1, f3) == 53 and evo.get(e1, f4) == 54) @@ -4178,10 +4178,10 @@ do evo.set(f2, evo.DEFAULT, 41) evo.set(f3, evo.TAG) - local e1 = evo.entity():set(f1, 11):build() - local e2 = evo.entity():set(f1, 21):set(f2, 22):build() - local e3 = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e4 = evo.entity():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() + local e1 = evo.builder():set(f1, 11):build() + local e2 = evo.builder():set(f1, 21):set(f2, 22):build() + local e3 = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e4 = evo.builder():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == nil and evo.get(e1, f3) == nil) assert(evo.get(e2, f1) == 21 and evo.get(e2, f2) == 22 and evo.get(e2, f3) == nil) @@ -4189,12 +4189,12 @@ do assert(evo.get(e4, f1) == 41 and evo.get(e4, f2) == 42 and evo.get(e4, f3) == nil and evo.get(e4, f4) == 44) do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() evo.batch_multi_set(q, {}) end do - local q = evo.query():include(f1):exclude(f2):build() + local q = evo.builder():include(f1):exclude(f2):build() evo.batch_multi_set(q, { f2 }) assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == 41 and evo.get(e1, f3) == nil) @@ -4249,12 +4249,12 @@ do last_insert_component = c end) - local e1 = evo.entity():set(f1, 11):build() - local e2 = evo.entity():set(f1, 21):set(f2, 22):build() - local e3 = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e1 = evo.builder():set(f1, 11):build() + local e2 = evo.builder():set(f1, 21):set(f2, 22):build() + local e3 = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() do - local q = evo.query():include(f1):exclude(f2):build() + local q = evo.builder():include(f1):exclude(f2):build() sum_entity = 0 last_insert_entity = 0 @@ -4273,7 +4273,7 @@ do end do - local q = evo.query():include(f2):exclude(f3):build() + local q = evo.builder():include(f2):exclude(f3):build() sum_entity = 0 last_insert_entity = 0 @@ -4292,7 +4292,7 @@ do end do - local q = evo.query():include(f1, f2, f3):build() + local q = evo.builder():include(f1, f2, f3):build() sum_entity = 0 last_insert_entity = 0 @@ -4320,25 +4320,25 @@ do evo.set(f2, evo.DEFAULT, 52) evo.set(f4, evo.TAG) - local e1a = evo.entity():set(f1, 11):build() - local e1b = evo.entity():set(f1, 11):build() + local e1a = evo.builder():set(f1, 11):build() + local e1b = evo.builder():set(f1, 11):build() - local e2a = evo.entity():set(f1, 21):set(f2, 22):build() - local e2b = evo.entity():set(f1, 21):set(f2, 22):build() + local e2a = evo.builder():set(f1, 21):set(f2, 22):build() + local e2b = evo.builder():set(f1, 21):set(f2, 22):build() - local e3a = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e3b = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e3a = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e3b = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e4a = evo.entity():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() - local e4b = evo.entity():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() + local e4a = evo.builder():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() + local e4b = evo.builder():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() evo.batch_multi_set(q, {}) end do - local q = evo.query():include(f3):exclude(f4):build() + local q = evo.builder():include(f3):exclude(f4):build() evo.batch_multi_set(q, { f3 }) assert(evo.get(e1a, f1) == 11 and evo.get(e1a, f2) == nil and evo.get(e1a, f3) == nil) assert(evo.get(e1b, f1) == 11 and evo.get(e1b, f2) == nil and evo.get(e1b, f3) == nil) @@ -4351,7 +4351,7 @@ do end do - local q = evo.query():include(f3):exclude(f4):build() + local q = evo.builder():include(f3):exclude(f4):build() evo.batch_multi_set(q, { f3 }, { 43, 44 }) assert(evo.get(e1a, f1) == 11 and evo.get(e1a, f2) == nil and evo.get(e1a, f3) == nil) assert(evo.get(e1b, f1) == 11 and evo.get(e1b, f2) == nil and evo.get(e1b, f3) == nil) @@ -4364,7 +4364,7 @@ do end do - local q = evo.query():include(f2):exclude(f3, f4):build() + local q = evo.builder():include(f2):exclude(f3, f4):build() evo.batch_multi_set(q, { f2 }, {}) assert(evo.get(e1a, f1) == 11 and evo.get(e1a, f2) == nil and evo.get(e1a, f3) == nil) assert(evo.get(e1b, f1) == 11 and evo.get(e1b, f2) == nil and evo.get(e1b, f3) == nil) @@ -4377,7 +4377,7 @@ do end do - local q = evo.query():include(f2):exclude(f3, f4):build() + local q = evo.builder():include(f2):exclude(f3, f4):build() evo.batch_multi_set(q, { f2 }, { 62, 63 }) assert(evo.get(e1a, f1) == 11 and evo.get(e1a, f2) == nil and evo.get(e1a, f3) == nil) assert(evo.get(e1b, f1) == 11 and evo.get(e1b, f2) == nil and evo.get(e1b, f3) == nil) @@ -4409,7 +4409,7 @@ do local last_assign_component = 0 do - local q = evo.query():include(fc):build() + local q = evo.builder():include(fc):build() evo.batch_set(q, evo.ON_ASSIGN, function(e, f, c) assert(f == f1 or f == f2 or f == f3 or f == f4) sum_entity = sum_entity + e @@ -4418,22 +4418,22 @@ do end) end - local e2a = evo.entity():set(f1, 21):set(f2, 22):build() - local e2b = evo.entity():set(f1, 21):set(f2, 22):build() + local e2a = evo.builder():set(f1, 21):set(f2, 22):build() + local e2b = evo.builder():set(f1, 21):set(f2, 22):build() - local e3a = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e3b = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e3a = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e3b = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e4a = evo.entity():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() - local e4b = evo.entity():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() + local e4a = evo.builder():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() + local e4b = evo.builder():set(f1, 41):set(f2, 42):set(f3, 43):set(f4, 44):build() do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() evo.batch_multi_set(q, {}) end do - local q = evo.query():include(f2):exclude(f3, f4):build() + local q = evo.builder():include(f2):exclude(f3, f4):build() sum_entity = 0 last_assign_entity = 0 @@ -4457,7 +4457,7 @@ do end do - local q = evo.query():include(f2):exclude(f3, f4):build() + local q = evo.builder():include(f2):exclude(f3, f4):build() sum_entity = 0 last_assign_entity = 0 @@ -4481,7 +4481,7 @@ do end do - local q = evo.query():include(f3):exclude(f4):build() + local q = evo.builder():include(f3):exclude(f4):build() sum_entity = 0 last_assign_entity = 0 @@ -4495,7 +4495,7 @@ do end do - local q = evo.query():include(f4):build() + local q = evo.builder():include(f4):build() sum_entity = 0 last_assign_entity = 0 @@ -4526,17 +4526,17 @@ do evo.set(f2, evo.DEFAULT, 52) evo.set(f4, evo.TAG) - local e1a = evo.entity():set(f1, 11):build() - local e1b = evo.entity():set(f1, 11):build() + local e1a = evo.builder():set(f1, 11):build() + local e1b = evo.builder():set(f1, 11):build() - local e2a = evo.entity():set(f1, 21):set(f2, 22):build() - local e2b = evo.entity():set(f1, 21):set(f2, 22):build() + local e2a = evo.builder():set(f1, 21):set(f2, 22):build() + local e2b = evo.builder():set(f1, 21):set(f2, 22):build() - local e3a = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e3b = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e3a = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e3b = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() do - local q = evo.query():include(f2):exclude(f3, f4):build() + local q = evo.builder():include(f2):exclude(f3, f4):build() evo.batch_multi_set(q, { f3 }) assert(evo.get(e2a, f1) == 21 and evo.get(e2a, f2) == 22 and evo.get(e2a, f3) == true) assert(evo.get(e2b, f1) == 21 and evo.get(e2b, f2) == 22 and evo.get(e2b, f3) == true) @@ -4557,7 +4557,7 @@ do end do - local q = evo.query():include(f2, f3):exclude(f4):build() + local q = evo.builder():include(f2, f3):exclude(f4):build() evo.batch_multi_set(q, { f2, f3, f4, f4 }, { 62, 63, 64, 65 }) assert(evo.has_all(e2a, f2, f3, f4) and evo.has_all(e2b, f2, f3, f4)) assert(evo.get(e2a, f1) == 21 and evo.get(e2a, f2) == 62 and evo.get(e2a, f3) == 63 and evo.get(e2a, f4) == nil) @@ -4567,7 +4567,7 @@ do end do - local q = evo.query():include(f1):exclude(f2, f3, f4):build() + local q = evo.builder():include(f1):exclude(f2, f3, f4):build() evo.batch_multi_set(q, { f2, f1 }, { nil, 71 }) assert(evo.get(e1a, f1) == 71 and evo.get(e1a, f2) == 52) assert(evo.get(e1b, f1) == 71 and evo.get(e1b, f2) == 52) @@ -4606,7 +4606,7 @@ do local last_insert_component = 0 do - local q = evo.query():include(fc):build() + local q = evo.builder():include(fc):build() evo.batch_set(q, evo.ON_ASSIGN, function(e, f, c) assert(f == f0 or f == f1 or f == f2 or f == f3 or f == f4) sum_entity = sum_entity + e @@ -4621,14 +4621,14 @@ do end) end - local e0a = evo.entity():set(f0, 0):build() - local e0b = evo.entity():set(f0, 0):build() + local e0a = evo.builder():set(f0, 0):build() + local e0b = evo.builder():set(f0, 0):build() - local e3a = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() - local e3b = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e3a = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e3b = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() do - local q = evo.query():include(f0):build() + local q = evo.builder():include(f0):build() sum_entity = 0 last_assign_entity, last_assign_component = 0, 0 @@ -4658,7 +4658,7 @@ do end do - local q = evo.query():include(f3):exclude(f0, f4):build() + local q = evo.builder():include(f3):exclude(f0, f4):build() sum_entity = 0 last_assign_entity, last_assign_component = 0, 0 @@ -4678,22 +4678,22 @@ end do local f1, f2, f3, f4 = evo.id(4) - local e1 = evo.entity():set(f1, 11):build() - local e2 = evo.entity():set(f1, 21):set(f2, 22):build() - local e3 = evo.entity():set(f1, 31):set(f2, 32):set(f3, 33):build() + local e1 = evo.builder():set(f1, 11):build() + local e2 = evo.builder():set(f1, 21):set(f2, 22):build() + local e3 = evo.builder():set(f1, 31):set(f2, 32):set(f3, 33):build() assert(evo.defer()) do do - local q = evo.query():include(f1):exclude(f2):build() + local q = evo.builder():include(f1):exclude(f2):build() evo.batch_multi_set(q, { f2 }, { 42 }) end do - local q = evo.query():include(f1, f3):build() + local q = evo.builder():include(f1, f3):build() evo.batch_multi_set(q, { f3 }, { 43 }) end do - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() assert(not evo.batch_multi_remove(q, { f1 })) end assert(evo.get(e1, f1) == 11 and evo.get(e1, f2) == nil and evo.get(e1, f3) == nil) @@ -4708,7 +4708,7 @@ do end assert(evo.defer()) do - local q = evo.query():include(f2):build() + local q = evo.builder():include(f2):build() do evo.batch_multi_set(q, { f3, f4 }, { 53, 54 }) end @@ -4723,7 +4723,7 @@ end do local f1, f2, f3, f4, f5 = evo.id(5) - local e = evo.entity():set(f1, 11):set(f2, 22):set(f3, 33):set(f4, 44):set(f5, 55):build() + local e = evo.builder():set(f1, 11):set(f2, 22):set(f3, 33):set(f4, 44):set(f5, 55):build() do local c1 = evo.get(e, f1) @@ -4764,13 +4764,13 @@ do evo.set(f2, evo.DEFAULT, 42) - local e1a = evo.entity():set(f1, 11):build() - local e1b = evo.entity():set(f1, 11):build() + local e1a = evo.builder():set(f1, 11):build() + local e1b = evo.builder():set(f1, 11):build() - local e2a = evo.entity():set(f1, 11):set(f2, 22):build() - local e2b = evo.entity():set(f1, 11):set(f2, 22):build() + local e2a = evo.builder():set(f1, 11):set(f2, 22):build() + local e2b = evo.builder():set(f1, 11):set(f2, 22):build() - local q = evo.query():include(f1):build() + local q = evo.builder():include(f1):build() evo.set(q, evo.EXCLUDES, { f2 }) evo.batch_set(q, f2) @@ -4818,7 +4818,7 @@ do local last_insert_component = 0 do - local q = evo.query():include(fc):build() + local q = evo.builder():include(fc):build() evo.batch_set(q, evo.ON_ASSIGN, function(e, f, c) assert(f == f1 or f == f2 or f == f3 or f == f4) sum_entity = sum_entity + e @@ -4833,14 +4833,14 @@ do end) end - local e1a = evo.entity():set(f1, 11):build() - local e1b = evo.entity():set(f1, 11):build() + local e1a = evo.builder():set(f1, 11):build() + local e1b = evo.builder():set(f1, 11):build() - local e2a = evo.entity():set(f1, 11):set(f2, 22):build() - local e2b = evo.entity():set(f1, 11):set(f2, 22):build() + local e2a = evo.builder():set(f1, 11):set(f2, 22):build() + local e2b = evo.builder():set(f1, 11):set(f2, 22):build() do - local q = evo.query():include(f1):exclude(f2):build() + local q = evo.builder():include(f1):exclude(f2):build() sum_entity = 0 last_insert_entity = 0 @@ -4858,7 +4858,7 @@ do end do - local q = evo.query():include(f2):build() + local q = evo.builder():include(f2):build() sum_entity = 0 last_insert_entity = 0 @@ -4874,7 +4874,7 @@ do end do - local q = evo.query():include(f2):build() + local q = evo.builder():include(f2):build() sum_entity = 0 last_insert_entity = 0 @@ -4890,7 +4890,7 @@ do end do - local q = evo.query():include(f3):build() + local q = evo.builder():include(f3):build() sum_entity = 0 last_assign_entity = 0 @@ -5451,7 +5451,7 @@ end do local f0, f1 = evo.id(2) - local q0 = evo.query():include(f0):build() + local q0 = evo.builder():include(f0):build() local assign_count = 0 local insert_count = 0 @@ -5519,7 +5519,7 @@ end do local f0, f1, f2 = evo.id(3) - local q0 = evo.query():include(f0):build() + local q0 = evo.builder():include(f0):build() local assign_count = 0 local insert_count = 0 @@ -5791,10 +5791,10 @@ end do local f1, f2 = evo.id(2) - local q1 = evo.query():include(f1):build() + local q1 = evo.builder():include(f1):build() - local e1a = evo.entity():set(f1, 1):build() - local e1b = evo.entity():set(f1, 11):build() + local e1a = evo.builder():set(f1, 1):build() + local e1b = evo.builder():set(f1, 11):build() do local c1, c1_es = evo.chunk(f1) @@ -5816,8 +5816,8 @@ do assert(evo.components(c12, f2)[1] == 2 and evo.components(c12, f2)[2] == 2) end - local e1c = evo.entity():set(f1, 111):build() - local e1d = evo.entity():set(f1, 1111):build() + local e1c = evo.builder():set(f1, 111):build() + local e1d = evo.builder():set(f1, 1111):build() do local c1, c1_es = evo.chunk(f1) @@ -5847,10 +5847,10 @@ end do local f1, f2, f3 = evo.id(3) - local q1 = evo.query():include(f1):build() + local q1 = evo.builder():include(f1):build() - local e123a = evo.entity():set(f1, 1):set(f2, 2):set(f3, 3):build() - local e123b = evo.entity():set(f1, 11):set(f2, 22):set(f3, 33):build() + local e123a = evo.builder():set(f1, 1):set(f2, 2):set(f3, 3):build() + local e123b = evo.builder():set(f1, 11):set(f2, 22):set(f3, 33):build() do local c123, c123_es = evo.chunk(f1, f2, f3) @@ -5872,8 +5872,8 @@ do assert(evo.components(c13, f3)[1] == 3 and evo.components(c13, f3)[2] == 33) end - local e3a = evo.entity():set(f3, 3):build() - local e3b = evo.entity():set(f3, 33):build() + local e3a = evo.builder():set(f3, 3):build() + local e3b = evo.builder():set(f3, 33):build() do local c3, c3_es = evo.chunk(f3) @@ -5900,17 +5900,17 @@ end do do - local f = evo.fragment():default():build() - assert(not evo.has(f, evo.DEFAULT)) + local f = evo.builder():default():build() + assert(evo.has(f, evo.DEFAULT)) end do - local f = evo.fragment():single():build() - assert(not evo.has(f, f)) + local f = evo.builder():single():build() + assert(evo.has(f, f)) end do - local f = evo.fragment():single(42):build() + local f = evo.builder():single(42):build() assert(evo.has(f, f) and evo.get(f, f) == 42) end end @@ -5918,10 +5918,10 @@ end do local f1, f2 = evo.id(2) - local e1a = evo.entity():set(f1, 1):build() - local e1b = evo.entity():set(f1, 2):build() + local e1a = evo.builder():set(f1, 1):build() + local e1b = evo.builder():set(f1, 2):build() - local e12 = evo.entity():set(f1, 3):set(f2, 4):build() + local e12 = evo.builder():set(f1, 3):set(f2, 4):build() do local c1, c1_es, c1_ec = evo.chunk(f1) @@ -5937,20 +5937,20 @@ do end do - local f = evo.fragment():build() + local f = evo.builder():build() assert(evo.get(f, evo.NAME) == nil) - local q = evo.query():build() + local q = evo.builder():build() assert(evo.get(q, evo.NAME) == nil) - local s = evo.system():build() + local s = evo.builder():build() assert(evo.get(s, evo.NAME) == nil) end do - local fb = evo.fragment() - local qb = evo.query() - local sb = evo.system() + local fb = evo.builder() + local qb = evo.builder() + local sb = evo.builder() do local f = fb:name('fragment'):build() @@ -5976,9 +5976,9 @@ do end do - local fb = evo.fragment() - local qb = evo.query() - local sb = evo.system() + local fb = evo.builder() + local qb = evo.builder() + local sb = evo.builder() do local f = fb:single(false):build() @@ -6010,11 +6010,11 @@ do local c2 = assert(evo.chunk(f2)) local c12 = assert(evo.chunk(f1, f2)) - local e1a = evo.entity():set(f1, 1):build() - local e1b = evo.entity():set(f1, 2):build() + local e1a = evo.builder():set(f1, 1):build() + local e1b = evo.builder():set(f1, 2):build() - local e12a = evo.entity():set(f1, 3):set(f2, 4):build() - local e12b = evo.entity():set(f1, 5):set(f2, 6):build() + local e12a = evo.builder():set(f1, 3):set(f2, 4):build() + local e12b = evo.builder():set(f1, 5):set(f2, 6):build() do local c1_es, c1_ec = evo.entities(c1) @@ -6226,7 +6226,7 @@ do evo.set(f2, ft) evo.set(f3, ft) evo.set(f3, evo.DESTROY_POLICY, evo.DESTROY_POLICY_DESTROY_ENTITY) - local qt = evo.query():include(ft):build() + local qt = evo.builder():include(ft):build() local c4 = assert(evo.chunk(f4)) local c14 = assert(evo.chunk(f1, f4)) @@ -6234,10 +6234,10 @@ do local c234 = assert(evo.chunk(f2, f3, f4)) local c124 = assert(evo.chunk(f1, f2, f4)) - local e14 = evo.entity():set(f1, 1):set(f4, 2):build() - local e24 = evo.entity():set(f2, 3):set(f4, 4):build() - local e234 = evo.entity():set(f2, 5):set(f3, 6):set(f4, 7):build() - local e124 = evo.entity():set(f1, 8):set(f2, 6):set(f4, 9):build() + local e14 = evo.builder():set(f1, 1):set(f4, 2):build() + local e24 = evo.builder():set(f2, 3):set(f4, 4):build() + local e234 = evo.builder():set(f2, 5):set(f3, 6):set(f4, 7):build() + local e124 = evo.builder():set(f1, 8):set(f2, 6):set(f4, 9):build() evo.batch_destroy(qt) @@ -6322,14 +6322,14 @@ do local c13 = evo.chunk(f1, f3) local c123 = evo.chunk(f1, f2, f3) - local e1a = evo.entity():set(f1, 1):build() - local e1b = evo.entity():set(f1, 2):build() + local e1a = evo.builder():set(f1, 1):build() + local e1b = evo.builder():set(f1, 2):build() - local e12a = evo.entity():set(f1, 3):set(f2, 4):build() - local e12b = evo.entity():set(f1, 5):set(f2, 6):build() + local e12a = evo.builder():set(f1, 3):set(f2, 4):build() + local e12b = evo.builder():set(f1, 5):set(f2, 6):build() - local e123a = evo.entity():set(f1, 7):set(f2, 8):set(f3, 9):build() - local e123b = evo.entity():set(f1, 10):set(f2, 11):set(f3, 12):build() + local e123a = evo.builder():set(f1, 7):set(f2, 8):set(f3, 9):build() + local e123b = evo.builder():set(f1, 10):set(f2, 11):set(f3, 12):build() evo.destroy(f2) @@ -6391,13 +6391,13 @@ do evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_DESTROY_ENTITY) - local e12a = evo.entity():set(f1, 1):set(f2, 2):build() - local e12b = evo.entity():set(f1, 3):set(f2, 4):build() - local e_e12a_e12b = evo.entity():set(e12a, 11):set(e12b, 22):build() + local e12a = evo.builder():set(f1, 1):set(f2, 2):build() + local e12b = evo.builder():set(f1, 3):set(f2, 4):build() + local e_e12a_e12b = evo.builder():set(e12a, 11):set(e12b, 22):build() - local e2a = evo.entity():set(f2, 5):build() - local e2b = evo.entity():set(f2, 6):build() - local e_e2a_e2b = evo.entity():set(e2a, 55):set(e2b, 66):build() + local e2a = evo.builder():set(f2, 5):build() + local e2b = evo.builder():set(f2, 6):build() + local e_e2a_e2b = evo.builder():set(e2a, 55):set(e2b, 66):build() evo.destroy(f1) @@ -6436,13 +6436,13 @@ do evo.set(f1, evo.DESTROY_POLICY, evo.DESTROY_POLICY_REMOVE_FRAGMENT) - local e12a = evo.entity():set(f1, 1):set(f2, 2):build() - local e12b = evo.entity():set(f1, 3):set(f2, 4):build() - local e_e12a_e12b = evo.entity():set(e12a, 11):set(e12b, 22):build() + local e12a = evo.builder():set(f1, 1):set(f2, 2):build() + local e12b = evo.builder():set(f1, 3):set(f2, 4):build() + local e_e12a_e12b = evo.builder():set(e12a, 11):set(e12b, 22):build() - local e2a = evo.entity():set(f2, 5):build() - local e2b = evo.entity():set(f2, 6):build() - local e_e2a_e2b = evo.entity():set(e2a, 55):set(e2b, 66):build() + local e2a = evo.builder():set(f2, 5):build() + local e2b = evo.builder():set(f2, 6):build() + local e_e2a_e2b = evo.builder():set(e2a, 55):set(e2b, 66):build() evo.destroy(f1) @@ -6462,7 +6462,7 @@ do end do - local fb = evo.fragment() + local fb = evo.builder() local f1 = fb:build() local f2 = fb:destroy_policy(evo.DESTROY_POLICY_DESTROY_ENTITY):build() @@ -6492,15 +6492,15 @@ end do local f0, f1, f2, f3 = evo.id(4) - local e1 = evo.entity():set(f0, 0):set(f1, 1):build() - local e12 = evo.entity():set(f0, 0):set(f1, 2):set(f2, 3):build() - local e123 = evo.entity():set(f0, 0):set(f1, 4):set(f2, 5):set(f3, 6):build() + local e1 = evo.builder():set(f0, 0):set(f1, 1):build() + local e12 = evo.builder():set(f0, 0):set(f1, 2):set(f2, 3):build() + local e123 = evo.builder():set(f0, 0):set(f1, 4):set(f2, 5):set(f3, 6):build() - evo.entity():set(f1, 41):build() - evo.entity():set(f1, 42):set(f2, 43):build() + evo.builder():set(f1, 41):build() + evo.builder():set(f1, 42):set(f2, 43):build() do - local q1 = evo.query():include(f0, f1):build() + local q1 = evo.builder():include(f0, f1):build() local iter, state = evo.execute(q1) @@ -6521,7 +6521,7 @@ do end do - local q1 = evo.query():include(f0, f1):exclude(f3):build() + local q1 = evo.builder():include(f0, f1):exclude(f3):build() local iter, state = evo.execute(q1) @@ -6540,7 +6540,7 @@ end do local f1, f2 = evo.id(2) - local q12 = evo.query():include(f1, f2):build() + local q12 = evo.builder():include(f1, f2):build() do local iter, state = evo.execute(q12) @@ -6551,11 +6551,11 @@ end do local f1, f2 = evo.id(2) - local qe12 = evo.query():exclude(f1, f2):build() + local qe12 = evo.builder():exclude(f1, f2):build() - evo.entity():set(f1, 1):build() - evo.entity():set(f2, 2):build() - local e12 = evo.entity():set(f1, 3):set(f2, 4):build() + evo.builder():set(f1, 1):build() + evo.builder():set(f2, 2):build() + local e12 = evo.builder():set(f1, 3):set(f2, 4):build() local c1 = evo.chunk(f1) local c2 = evo.chunk(f2) @@ -6615,11 +6615,11 @@ do local old_c1 = assert(evo.chunk(f1)) local old_c12 = assert(evo.chunk(f1, f2)) - local e1 = evo.entity():set(f1, 1):build() + local e1 = evo.builder():set(f1, 1):build() evo.collect_garbage() - local e12 = evo.entity():set(f1, 2):set(f2, 3):build() + local e12 = evo.builder():set(f1, 2):set(f2, 3):build() do assert(evo.is_alive(old_c1)) @@ -7312,7 +7312,7 @@ do end do - local gb = evo.system() + local gb = evo.builder() local g1 = gb:build() local g2 = gb:name('g2'):build() @@ -7326,8 +7326,8 @@ do end do - local g = evo.system():build() - local s = evo.system():group(g):build() + local g = evo.builder():build() + local s = evo.builder():group(g):build() assert(evo.get(s, evo.GROUP) == g) end @@ -7460,7 +7460,7 @@ do local function v2_clone(v) return { x = v.x, y = v.y } end do - local f = evo.fragment():build() + local f = evo.builder():build() do local e1, e2, e3, e4 = evo.id(4) @@ -7522,7 +7522,7 @@ do end do - local f = evo.fragment():default(v2(11, 22)):build() + local f = evo.builder():default(v2(11, 22)):build() do local e1, e2, e3, e4 = evo.id(4) @@ -7594,7 +7594,7 @@ do end do - local f = evo.fragment():default(v2(11, 22)):duplicate(v2_clone):build() + local f = evo.builder():default(v2(11, 22)):duplicate(v2_clone):build() do local e1, e2, e3, e4 = evo.id(4) @@ -7666,7 +7666,7 @@ do end do - local f = evo.fragment():duplicate(v2_clone):build() + local f = evo.builder():duplicate(v2_clone):build() do local e1, e2, e3, e4 = evo.id(4) @@ -7746,13 +7746,13 @@ do local function v2_clone(v) return { x = v.x, y = v.y } end do - local f = evo.fragment():build() + local f = evo.builder():build() - local t1 = evo.fragment():tag():build() - local qt1 = evo.query():include(t1):build() + local t1 = evo.builder():tag():build() + local qt1 = evo.builder():include(t1):build() - local t2 = evo.fragment():tag():build() - local qt2 = evo.query():include(t2):build() + local t2 = evo.builder():tag():build() + local qt2 = evo.builder():include(t2):build() do local e1, e2, e3, e4 = evo.id(4) @@ -7810,13 +7810,13 @@ do end do - local f = evo.fragment():default(v2(11, 22)):build() + local f = evo.builder():default(v2(11, 22)):build() - local t1 = evo.fragment():tag():build() - local qt1 = evo.query():include(t1):build() + local t1 = evo.builder():tag():build() + local qt1 = evo.builder():include(t1):build() - local t2 = evo.fragment():tag():build() - local qt2 = evo.query():include(t2):build() + local t2 = evo.builder():tag():build() + local qt2 = evo.builder():include(t2):build() do local e1, e2, e3, e4 = evo.id(4) @@ -7880,13 +7880,13 @@ do end do - local f = evo.fragment():default(v2(11, 22)):duplicate(v2_clone):build() + local f = evo.builder():default(v2(11, 22)):duplicate(v2_clone):build() - local t1 = evo.fragment():tag():build() - local qt1 = evo.query():include(t1):build() + local t1 = evo.builder():tag():build() + local qt1 = evo.builder():include(t1):build() - local t2 = evo.fragment():tag():build() - local qt2 = evo.query():include(t2):build() + local t2 = evo.builder():tag():build() + local qt2 = evo.builder():include(t2):build() do local e1, e2, e3, e4 = evo.id(4) @@ -7950,13 +7950,13 @@ do end do - local f = evo.fragment():duplicate(v2_clone):build() + local f = evo.builder():duplicate(v2_clone):build() - local t1 = evo.fragment():tag():build() - local qt1 = evo.query():include(t1):build() + local t1 = evo.builder():tag():build() + local qt1 = evo.builder():include(t1):build() - local t2 = evo.fragment():tag():build() - local qt2 = evo.query():include(t2):build() + local t2 = evo.builder():tag():build() + local qt2 = evo.builder():include(t2):build() do local e1, e2, e3, e4 = evo.id(4) @@ -8023,8 +8023,8 @@ end do local function v2(x, y) return { x = x or 0, y = y or 0 } end - local f1 = evo.fragment():default(v2(10, 11)):build() - local f2 = evo.fragment():default(v2(11, 22)):build() + local f1 = evo.builder():default(v2(10, 11)):build() + local f2 = evo.builder():default(v2(11, 22)):build() local fs, cs = { f1, f2 }, { v2(1, 2) } local c12 = evo.chunk(f1, f2) @@ -8060,8 +8060,8 @@ do local function v2(x, y) return { x = x or 0, y = y or 0 } end local function v2_clone(v) return { x = v.x, y = v.y } end - local f1 = evo.fragment():default(v2(10, 11)):duplicate(v2_clone):build() - local f2 = evo.fragment():default(v2(11, 22)):duplicate(v2_clone):build() + local f1 = evo.builder():default(v2(10, 11)):duplicate(v2_clone):build() + local f2 = evo.builder():default(v2(11, 22)):duplicate(v2_clone):build() local fs, cs = { f1, f2 }, { v2(1, 2) } local c12 = evo.chunk(f1, f2) @@ -8469,3 +8469,395 @@ do assert(evo.has(e1, f3) and evo.get(e1, f3) == 43) end end + +do + local b = evo.builder() + + local f1, f2 = evo.id(2) + + do + local e1 = b:set(f1, 41):build() + local e2 = b:set(f2, 42):build() + + assert(evo.has(e1, f1) and evo.get(e1, f1) == 41) + assert(not evo.has(e1, f2) and evo.get(e1, f2) == nil) + + assert(not evo.has(e2, f1) and evo.get(e2, f1) == nil) + assert(evo.has(e2, f2) and evo.get(e2, f2) == 42) + end + + do + local e1 = b:set(f1, 41):build(true) + local e2 = b:set(f2, 42):build(true) + local e3 = b:clear():set(f2, 43):build() + + assert(evo.has(e1, f1) and evo.get(e1, f1) == 41) + assert(not evo.has(e1, f2) and evo.get(e1, f2) == nil) + + assert(evo.has(e2, f1) and evo.get(e2, f1) == 41) + assert(evo.has(e2, f2) and evo.get(e2, f2) == 42) + + assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil) + assert(evo.has(e3, f2) and evo.get(e3, f2) == 43) + end + + do + assert(evo.defer()) + + local e1 = b:set(f1, 41):build() + local e2 = b:set(f2, 42):build() + + assert(not evo.has_any(e1, f1, f2)) + assert(not evo.has_any(e2, f1, f2)) + + assert(evo.commit()) + + assert(evo.has(e1, f1) and evo.get(e1, f1) == 41) + assert(not evo.has(e1, f2) and evo.get(e1, f2) == nil) + + assert(not evo.has(e2, f1) and evo.get(e2, f1) == nil) + assert(evo.has(e2, f2) and evo.get(e2, f2) == 42) + end + + do + assert(evo.defer()) + + local e1 = b:set(f1, 41):build(true) + local e2 = b:set(f2, 42):build(true) + local e3 = b:clear():set(f2, 43):build() + + assert(not evo.has_any(e1, f1, f2)) + assert(not evo.has_any(e2, f1, f2)) + assert(not evo.has_any(e3, f1, f2)) + + assert(evo.commit()) + + assert(evo.has(e1, f1) and evo.get(e1, f1) == 41) + assert(not evo.has(e1, f2) and evo.get(e1, f2) == nil) + + assert(evo.has(e2, f1) and evo.get(e2, f1) == 41) + assert(evo.has(e2, f2) and evo.get(e2, f2) == 42) + + assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil) + assert(evo.has(e3, f2) and evo.get(e3, f2) == 43) + end +end + +do + local b = evo.builder() + + local f1, f2 = evo.id(2) + + do + local e1 = b:set(f1, 41):build() + local e2 = b:prefab(e1):set(f2, 42):build() + + assert(evo.has(e1, f1) and evo.get(e1, f1) == 41) + assert(not evo.has(e1, f2) and evo.get(e1, f2) == nil) + + assert(evo.has(e2, f1) and evo.get(e2, f1) == 41) + assert(evo.has(e2, f2) and evo.get(e2, f2) == 42) + end + + do + local e1 = b:set(f1, 41):build() + local e2 = b:prefab(e1):set(f2, 42):build() + local e3 = b:clear():set(f2, 43):build() + + assert(evo.has(e1, f1) and evo.get(e1, f1) == 41) + assert(not evo.has(e1, f2) and evo.get(e1, f2) == nil) + + assert(evo.has(e2, f1) and evo.get(e2, f1) == 41) + assert(evo.has(e2, f2) and evo.get(e2, f2) == 42) + + assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil) + assert(evo.has(e3, f2) and evo.get(e3, f2) == 43) + end + + do + assert(evo.defer()) + + local e1 = b:set(f1, 41):build() + local e2 = b:prefab(e1):set(f2, 42):build() + + assert(not evo.has_any(e1, f1, f2)) + assert(not evo.has_any(e2, f1, f2)) + + assert(evo.commit()) + + assert(evo.has(e1, f1) and evo.get(e1, f1) == 41) + assert(not evo.has(e1, f2) and evo.get(e1, f2) == nil) + + assert(evo.has(e2, f1) and evo.get(e2, f1) == 41) + assert(evo.has(e2, f2) and evo.get(e2, f2) == 42) + end + + do + assert(evo.defer()) + + local e1 = b:set(f1, 41):build() + local e2 = b:prefab(e1):set(f2, 42):build() + local e3 = b:clear():set(f2, 43):build() + + assert(not evo.has_any(e1, f1, f2)) + assert(not evo.has_any(e2, f1, f2)) + assert(not evo.has_any(e3, f1, f2)) + + assert(evo.commit()) + + assert(evo.has(e1, f1) and evo.get(e1, f1) == 41) + assert(not evo.has(e1, f2) and evo.get(e1, f2) == nil) + + assert(evo.has(e2, f1) and evo.get(e2, f1) == 41) + assert(evo.has(e2, f2) and evo.get(e2, f2) == 42) + + assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil) + assert(evo.has(e3, f2) and evo.get(e3, f2) == 43) + end +end + +do + local f1, f2 = evo.id(2) + + do + local b = evo.builder() + + assert(b:has_all()) + assert(not b:has_any()) + + assert(not b:has(f1) and b:get(f1) == nil) + assert(not b:has(f2) and b:get(f2) == nil) + + assert(not b:has_all(f1, f2)) + assert(not b:has_any(f1, f2)) + + do + local e = b:build(true) + + assert(not evo.has(e, f1) and evo.get(e, f1) == nil) + assert(not evo.has(e, f2) and evo.get(e, f2) == nil) + end + + b:set(f1, 41) + + assert(b:has(f1) and b:get(f1) == 41) + assert(not b:has(f2) and b:get(f2) == nil) + + assert(not b:has_all(f1, f2)) + assert(b:has_any(f1, f2)) + + do + local e = b:build(true) + + assert(evo.has(e, f1) and evo.get(e, f1) == 41) + assert(not evo.has(e, f2) and evo.get(e, f2) == nil) + end + + b:set(f2, 42) + + assert(b:has(f1) and b:get(f1) == 41) + assert(b:has(f2) and b:get(f2) == 42) + + assert(b:has_all(f1, f2)) + assert(b:has_any(f1, f2)) + + do + local e = b:build(true) + + assert(evo.has(e, f1) and evo.get(e, f1) == 41) + assert(evo.has(e, f2) and evo.get(e, f2) == 42) + end + + b:remove(f1) + + assert(not b:has(f1) and b:get(f1) == nil) + assert(b:has(f2) and b:get(f2) == 42) + + assert(not b:has_all(f1, f2)) + assert(b:has_any(f1, f2)) + + do + local e = b:build(true) + + assert(not evo.has(e, f1) and evo.get(e, f1) == nil) + assert(evo.has(e, f2) and evo.get(e, f2) == 42) + end + + b:remove(f2) + + assert(not b:has_all(f1, f2)) + assert(not b:has_any(f1, f2)) + + assert(not b:has(f1) and b:get(f1) == nil) + assert(not b:has(f2) and b:get(f2) == nil) + + do + local e = b:build(true) + + assert(not evo.has(e, f1) and evo.get(e, f1) == nil) + assert(not evo.has(e, f2) and evo.get(e, f2) == nil) + end + end +end + +do + local f0, f1, f2, f3, f4, f5 = evo.id(6) + + do + local b = evo.builder() + + do + assert(b:get() == nil) + end + + do + local c1 = b:get(f1) + assert(c1 == nil) + end + + do + local c1, c2 = b:get(f1, f2) + assert(c1 == nil and c2 == nil) + end + + do + local c1, c2, c3 = b:get(f1, f2, f3) + assert(c1 == nil and c2 == nil and c3 == nil) + end + + do + local c1, c2, c3, c4 = b:get(f1, f2, f3, f4) + assert(c1 == nil and c2 == nil and c3 == nil and c4 == nil) + end + + do + local c1, c2, c3, c4, c5 = b:get(f1, f2, f3, f4, f5) + assert(c1 == nil and c2 == nil and c3 == nil and c4 == nil and c5 == nil) + end + + do + local c0, c1, c2, c3, c4, c5 = b:get(f0, f1, f2, f3, f4, f5) + assert(c0 == nil and c1 == nil and c2 == nil and c3 == nil and c4 == nil and c5 == nil) + end + end + + do + local b = evo.builder():set(f1, 11):set(f2, 22):set(f3, 33):set(f4, 44):set(f5, 55) + + do + assert(b:get() == nil) + end + + do + local c1 = b:get(f1) + assert(c1 == 11) + end + + do + local c1, c2 = b:get(f1, f2) + assert(c1 == 11 and c2 == 22) + end + + do + local c1, c2, c3 = b:get(f1, f2, f3) + assert(c1 == 11 and c2 == 22 and c3 == 33) + end + + do + local c1, c2, c3, c4 = b:get(f1, f2, f3, f4) + assert(c1 == 11 and c2 == 22 and c3 == 33 and c4 == 44) + end + + do + local c1, c2, c3, c4, c5 = b:get(f1, f2, f3, f4, f5) + assert(c1 == 11 and c2 == 22 and c3 == 33 and c4 == 44 and c5 == 55) + end + + do + local c0, c1, c2, c3, c4, c5 = b:get(f0, f1, f2, f3, f4, f5) + assert(c0 == nil and c1 == 11 and c2 == 22 and c3 == 33 and c4 == 44 and c5 == 55) + end + + do + local c1, c0, c2, c3, c4, c5 = b:get(f1, f0, f2, f3, f4, f5) + assert(c0 == nil and c1 == 11 and c2 == 22 and c3 == 33 and c4 == 44 and c5 == 55) + end + + do + local c5, c4, c3, c2, c1, c0 = b:get(f5, f4, f3, f2, f1, f0) + assert(c0 == nil and c1 == 11 and c2 == 22 and c3 == 33 and c4 == 44 and c5 == 55) + end + end +end + +do + local f1, f2, f3 = evo.id(3) + + do + local b = evo.builder():set(f1, 11):set(f2, 22) + assert(b == b:remove(f1)) + assert(not b:has(f1) and b:get(f1) == nil) + assert(b:has(f2) and b:get(f2) == 22) + local e = b:build() + assert(not evo.has(e, f1) and evo.get(e, f1) == nil) + assert(evo.has(e, f2) and evo.get(e, f2) == 22) + end + + do + local b = evo.builder():set(f1, 11):set(f2, 22) + assert(b == b:remove(f3, f1)) + assert(not b:has(f1) and b:get(f1) == nil) + assert(b:has(f2) and b:get(f2) == 22) + local e = b:build() + assert(not evo.has(e, f1) and evo.get(e, f1) == nil) + assert(evo.has(e, f2) and evo.get(e, f2) == 22) + end + + do + local b = evo.builder():set(f1, 11):set(f2, 22) + assert(b == b:remove(f1, f2)) + assert(not b:has(f1) and b:get(f1) == nil) + assert(not b:has(f2) and b:get(f2) == nil) + local e = b:build() + assert(not evo.has(e, f1) and evo.get(e, f1) == nil) + assert(not evo.has(e, f2) and evo.get(e, f2) == nil) + end + + do + local b = evo.builder():set(f1, 11):set(f2, 22) + assert(b == b:remove(f2, f1, f1)) + assert(not b:has(f1) and b:get(f1) == nil) + assert(not b:has(f2) and b:get(f2) == nil) + local e = b:build() + assert(not evo.has(e, f1) and evo.get(e, f1) == nil) + assert(not evo.has(e, f2) and evo.get(e, f2) == nil) + end +end + +do + local f1 = evo.id(1) + + do + local b = evo.builder():set(f1, 11):single(1) + + local e1 = b:build(true) + assert(evo.has(e1, e1) and evo.get(e1, e1) == 1) + assert(evo.has(e1, f1) and evo.get(e1, f1) == 11) + + assert(not b:has(e1) and b:get(e1) == nil) + + local e2 = b:build() + + assert(not evo.has(e2, e1) and evo.get(e2, e1) == nil) + + assert(evo.has(e2, e2) and evo.get(e2, e2) == 1) + assert(evo.has(e2, f1) and evo.get(e2, f1) == 11) + + local e3 = b:build() + + assert(not evo.has(e3, e1) and evo.get(e3, e1) == nil) + assert(not evo.has(e3, e2) and evo.get(e3, e2) == nil) + assert(not evo.has(e3, e3) and evo.get(e3, e3) == nil) + assert(not evo.has(e3, f1) and evo.get(e3, f1) == nil) + end +end diff --git a/develop/usbench.lua b/develop/usbench.lua index a5c0b29..293ce8a 100644 --- a/develop/usbench.lua +++ b/develop/usbench.lua @@ -54,11 +54,11 @@ basics.describe_bench(string.format('Evolved Entity Cycle (Defer): %d entities', local a, b = evo.id(2) for i = 1, N do - evo.entity():set(a, i):build() + evo.builder():set(a, i):build() end - local A = evo.query():include(a):build() - local B = evo.query():include(b):build() + local A = evo.builder():include(a):build() + local B = evo.builder():include(b):build() return a, b, A, B end, function(_, _, A, _) @@ -86,11 +86,11 @@ basics.describe_bench(string.format('Evolved Entity Cycle (Manual): %d entities' local a, b = evo.id(2) for i = 1, N do - evo.entity():set(a, i):build() + evo.builder():set(a, i):build() end - local A = evo.query():include(a):build() - local B = evo.query():include(b):build() + local A = evo.builder():include(a):build() + local B = evo.builder():include(b):build() return a, b, A, B end, function(_, _, A, _) @@ -167,15 +167,15 @@ basics.describe_bench(string.format('Evolved Simple Iteration: %d entities', N), local a, b, c, d, e = evo.id(5) for i = 1, N do - evo.entity():set(a, i):set(b, i):build() - evo.entity():set(a, i):set(b, i):set(c, i):build() - evo.entity():set(a, i):set(b, i):set(c, i):set(d, i):build() - evo.entity():set(a, i):set(b, i):set(c, i):set(e, i):build() + evo.builder():set(a, i):set(b, i):build() + evo.builder():set(a, i):set(b, i):set(c, i):build() + evo.builder():set(a, i):set(b, i):set(c, i):set(d, i):build() + evo.builder():set(a, i):set(b, i):set(c, i):set(e, i):build() end - local AB = evo.query():include(a, b):build() - local CD = evo.query():include(c, d):build() - local CE = evo.query():include(c, e):build() + local AB = evo.builder():include(a, b):build() + local CD = evo.builder():include(c, d):build() + local CE = evo.builder():include(c, e):build() return a, b, c, d, e, AB, CD, CE end, function(_, _, _, _, _, AB, CD, CE) @@ -277,14 +277,14 @@ basics.describe_bench(string.format('Evolved Packed Iteration: %d entities', N), local a, b, c, d, e = evo.id(5) for i = 1, N do - evo.entity():set(a, i):set(b, i):set(c, i):set(d, i):set(e, i):build() + evo.builder():set(a, i):set(b, i):set(c, i):set(d, i):set(e, i):build() end - local A = evo.query():include(a):build() - local B = evo.query():include(b):build() - local C = evo.query():include(c):build() - local D = evo.query():include(d):build() - local E = evo.query():include(e):build() + local A = evo.builder():include(a):build() + local B = evo.builder():include(b):build() + local C = evo.builder():include(c):build() + local D = evo.builder():include(d):build() + local E = evo.builder():include(e):build() return a, b, c, d, e, A, B, C, D, E end, function(_, _, _, _, _, A, _, _, _, _) @@ -359,12 +359,12 @@ basics.describe_bench(string.format('Evolved Fragmented Iteration: %d entities', for _, char in ipairs(chars) do for i = 1, N do - evo.entity():set(char, i):set(data, i):build() + evo.builder():set(char, i):set(data, i):build() end end - local Data = evo.query():include(data):build() - local Last = evo.query():include(chars[#chars]):build() + local Data = evo.builder():include(data):build() + local Last = evo.builder():include(chars[#chars]):build() return data, chars[#chars], Data, Last end, function(_, _, Data, _) diff --git a/evolved.lua b/evolved.lua index baf96ec..1868e26 100644 --- a/evolved.lua +++ b/evolved.lua @@ -759,10 +759,7 @@ local __evolved_spawn_with local __evolved_debug_mode local __evolved_collect_garbage -local __evolved_entity -local __evolved_fragment -local __evolved_query -local __evolved_system +local __evolved_builder --- --- @@ -4178,7 +4175,9 @@ __defer_ops[__defer_op.spawn_entity_at] = function(bytes, index) __evolved_defer() do - __spawn_entity_at(entity, chunk, fragment_list, fragment_count, component_list) + __spawn_entity_at(entity, chunk, + fragment_list, fragment_count, + component_list) __release_table(__table_pool_tag.fragment_list, fragment_list) __release_table(__table_pool_tag.component_list, component_list) end @@ -4233,7 +4232,9 @@ __defer_ops[__defer_op.spawn_entity_as] = function(bytes, index) __evolved_defer() do - __spawn_entity_as(entity, prefab, fragment_list, fragment_count, component_list) + __spawn_entity_as(entity, prefab, + fragment_list, fragment_count, + component_list) __release_table(__table_pool_tag.fragment_list, fragment_list) __release_table(__table_pool_tag.component_list, component_list) end @@ -4288,7 +4289,9 @@ __defer_ops[__defer_op.spawn_entity_with] = function(bytes, index) __evolved_defer() do - __spawn_entity_with(entity, chunk, fragment_list, fragment_count, component_list) + __spawn_entity_with(entity, chunk, + fragment_list, fragment_count, + component_list) __release_table(__table_pool_tag.fragment_list, fragment_list) __release_table(__table_pool_tag.component_list, component_list) end @@ -5997,7 +6000,9 @@ function __evolved_spawn_at(chunk, fragments, components) __evolved_defer() do - __spawn_entity_at(entity, entity_chunk, fragments, fragment_count, components) + __spawn_entity_at(entity, entity_chunk, + fragments, fragment_count, + components) end __evolved_commit() @@ -6035,7 +6040,9 @@ function __evolved_spawn_as(prefab, fragments, components) __evolved_defer() do - __spawn_entity_as(entity, prefab, fragments, fragment_count, components) + __spawn_entity_as(entity, prefab, + fragments, fragment_count, + components) end __evolved_commit() @@ -6073,7 +6080,9 @@ function __evolved_spawn_with(fragments, components) __evolved_defer() do - __spawn_entity_with(entity, entity_chunk, fragments, fragment_count, components) + __spawn_entity_with(entity, entity_chunk, + fragments, fragment_count, + components) end __evolved_commit() @@ -6163,48 +6172,15 @@ end --- --- -local __builder_fns = {} - ----@class evolved.entity_builder +---@class evolved.builder +---@field package __prefab? evolved.entity +---@field package __single? evolved.component +---@field package __fragment_set table ---@field package __fragment_list evolved.fragment[] ---@field package __component_list evolved.component[] ---@field package __component_count integer -__builder_fns.entity_builder = {} -__builder_fns.entity_builder.__index = __builder_fns.entity_builder - ----@class evolved.fragment_builder ----@field package __tag? boolean ----@field package __name? string ----@field package __single? evolved.component ----@field package __default? evolved.component ----@field package __duplicate? evolved.duplicate ----@field package __on_set? evolved.set_hook ----@field package __on_assign? evolved.set_hook ----@field package __on_insert? evolved.set_hook ----@field package __on_remove? evolved.remove_hook ----@field package __destroy_policy? evolved.id -__builder_fns.fragment_builder = {} -__builder_fns.fragment_builder.__index = __builder_fns.fragment_builder - ----@class evolved.query_builder ----@field package __name? string ----@field package __single? evolved.component ----@field package __include_list? evolved.fragment[] ----@field package __exclude_list? evolved.fragment[] -__builder_fns.query_builder = {} -__builder_fns.query_builder.__index = __builder_fns.query_builder - ----@class evolved.system_builder ----@field package __name? string ----@field package __single? evolved.component ----@field package __group? evolved.system ----@field package __query? evolved.query ----@field package __execute? evolved.execute ----@field package __prologue? evolved.prologue ----@field package __epilogue? evolved.epilogue ----@field package __disabled? boolean -__builder_fns.system_builder = {} -__builder_fns.system_builder.__index = __builder_fns.system_builder +local __evolved_builder_mt = {} +__evolved_builder_mt.__index = __evolved_builder_mt --- --- @@ -6212,518 +6188,401 @@ __builder_fns.system_builder.__index = __builder_fns.system_builder --- --- ----@return evolved.entity_builder builder +---@return evolved.builder builder ---@nodiscard -function __evolved_entity() +function __evolved_builder() return __lua_setmetatable({ + __fragment_set = {}, __fragment_list = {}, __component_list = {}, __component_count = 0, - }, __builder_fns.entity_builder) + }, __evolved_builder_mt) +end + +---@param fragment evolved.fragment +---@return boolean +---@nodiscard +function __evolved_builder_mt:has(fragment) + local component_index = self.__fragment_set[fragment] + + if not component_index then + return false + end + + if component_index > self.__component_count then + return false + end + + if fragment ~= self.__fragment_list[component_index] then + return false + end + + return true +end + +---@param ... evolved.fragment fragments +---@return boolean +---@nodiscard +function __evolved_builder_mt:has_all(...) + local fragment_count = select("#", ...) + + if fragment_count == 0 then + return true + end + + return self:has(...) and self:has_all(__lua_select(2, ...)) +end + +---@param ... evolved.fragment fragments +---@return boolean +---@nodiscard +function __evolved_builder_mt:has_any(...) + local fragment_count = select("#", ...) + + if fragment_count == 0 then + return false + end + + return self:has(...) or self:has_any(__lua_select(2, ...)) +end + +---@param ... evolved.fragment fragments +---@return evolved.component ... components +---@nodiscard +function __evolved_builder_mt:get(...) + local fragment_count = select("#", ...) + + if fragment_count == 0 then + return + end + + local fragment = ... + + local component_index = self.__fragment_set[fragment] + + if not component_index then + return nil, self:get(__lua_select(2, ...)) + end + + if component_index > self.__component_count then + return nil, self:get(__lua_select(2, ...)) + end + + if fragment ~= self.__fragment_list[component_index] then + return nil, self:get(__lua_select(2, ...)) + end + + return self.__component_list[component_index], self:get(__lua_select(2, ...)) end ---@param fragment evolved.fragment ---@param component evolved.component ----@return evolved.entity_builder builder -function __builder_fns.entity_builder:set(fragment, component) - local fragment_list = self.__fragment_list - local component_list = self.__component_list - - local component_count = self.__component_count + 1 - self.__component_count = component_count - - fragment_list[component_count] = fragment - component_list[component_count] = component - - return self -end - ----@return evolved.entity entity -function __builder_fns.entity_builder:build() - local fragment_list = self.__fragment_list - local component_list = self.__component_list - - local component_count = self.__component_count - self.__component_count = 0 - +---@return evolved.builder builder +function __evolved_builder_mt:set(fragment, component) if __debug_mode then - __debug_fns.validate_fragment_list(fragment_list, component_count) + __debug_fns.validate_fragment(fragment) end - local entity = __acquire_id() - local entity_chunk = __chunk_fragment_list(fragment_list, component_count) - - if __defer_depth > 0 then - __defer_spawn_entity_with(entity, entity_chunk, - fragment_list, component_count, - component_list, component_count) - end - - __evolved_defer() do - __spawn_entity_with(entity, entity_chunk, fragment_list, component_count, component_list) - end - __evolved_commit() + ---@type evolved.default?, evolved.duplicate? + local fragment_default, fragment_duplicate = + __evolved_get(fragment, __DEFAULT, __DUPLICATE) - return entity -end + if component == nil then + component = fragment_default + end ---- ---- ---- ---- ---- + if component ~= nil and fragment_duplicate then + component = fragment_duplicate(component) + end ----@return evolved.fragment_builder builder ----@nodiscard -function __evolved_fragment() - return __lua_setmetatable({}, __builder_fns.fragment_builder) -end - ----@return evolved.fragment_builder builder -function __builder_fns.fragment_builder:tag() - self.__tag = true - return self -end - ----@param name string ----@return evolved.fragment_builder builder -function __builder_fns.fragment_builder:name(name) - self.__name = name - return self -end - ----@param single evolved.component ----@return evolved.fragment_builder builder -function __builder_fns.fragment_builder:single(single) - self.__single = single - return self -end - ----@param default evolved.component ----@return evolved.fragment_builder builder -function __builder_fns.fragment_builder:default(default) - self.__default = default - return self -end - ----@param duplicate evolved.duplicate ----@return evolved.fragment_builder builder -function __builder_fns.fragment_builder:duplicate(duplicate) - self.__duplicate = duplicate - return self -end - ----@param on_set evolved.set_hook ----@return evolved.fragment_builder builder -function __builder_fns.fragment_builder:on_set(on_set) - self.__on_set = on_set - return self -end - ----@param on_assign evolved.assign_hook ----@return evolved.fragment_builder builder -function __builder_fns.fragment_builder:on_assign(on_assign) - self.__on_assign = on_assign - return self -end - ----@param on_insert evolved.insert_hook ----@return evolved.fragment_builder builder -function __builder_fns.fragment_builder:on_insert(on_insert) - self.__on_insert = on_insert - return self -end - ----@param on_remove evolved.remove_hook ----@return evolved.fragment_builder builder -function __builder_fns.fragment_builder:on_remove(on_remove) - self.__on_remove = on_remove - return self -end - ----@param destroy_policy evolved.id ----@return evolved.fragment_builder builder -function __builder_fns.fragment_builder:destroy_policy(destroy_policy) - self.__destroy_policy = destroy_policy - return self -end - ----@return evolved.fragment fragment -function __builder_fns.fragment_builder:build() - local tag = self.__tag - local name = self.__name - local single = self.__single - local default = self.__default - local duplicate = self.__duplicate - local on_set = self.__on_set - local on_assign = self.__on_assign - local on_insert = self.__on_insert - local on_remove = self.__on_remove - local destroy_policy = self.__destroy_policy - - self.__tag = nil - self.__name = nil - self.__single = nil - self.__default = nil - self.__duplicate = nil - self.__on_set = nil - self.__on_assign = nil - self.__on_insert = nil - self.__on_remove = nil - self.__destroy_policy = nil - - local fragment = __evolved_id() - - local fragment_list = __acquire_table(__table_pool_tag.fragment_list) - local component_list = __acquire_table(__table_pool_tag.component_list) - local component_count = 0 - - if tag then - component_count = component_count + 1 - fragment_list[component_count] = __TAG - component_list[component_count] = true + if component == nil then + component = true + end end - if name then - component_count = component_count + 1 - fragment_list[component_count] = __NAME - component_list[component_count] = name - end + local fragment_set = self.__fragment_set + local fragment_list = self.__fragment_list + local component_list = self.__component_list + local component_count = self.__component_count - if single ~= nil then + local component_index = fragment_set[fragment] + + if component_index + and component_index <= component_count + and fragment == fragment_list[component_index] + then + component_list[component_index] = component + else component_count = component_count + 1 + self.__component_count = component_count + + fragment_set[fragment] = component_count fragment_list[component_count] = fragment - component_list[component_count] = single + component_list[component_count] = component end - if default ~= nil then - component_count = component_count + 1 - fragment_list[component_count] = __DEFAULT - component_list[component_count] = default - end - - if duplicate then - component_count = component_count + 1 - fragment_list[component_count] = __DUPLICATE - component_list[component_count] = duplicate - end - - if on_set then - component_count = component_count + 1 - fragment_list[component_count] = __ON_SET - component_list[component_count] = on_set - end - - if on_assign then - component_count = component_count + 1 - fragment_list[component_count] = __ON_ASSIGN - component_list[component_count] = on_assign - end - - if on_insert then - component_count = component_count + 1 - fragment_list[component_count] = __ON_INSERT - component_list[component_count] = on_insert - end - - if on_remove then - component_count = component_count + 1 - fragment_list[component_count] = __ON_REMOVE - component_list[component_count] = on_remove - end - - if destroy_policy then - component_count = component_count + 1 - fragment_list[component_count] = __DESTROY_POLICY - component_list[component_count] = destroy_policy - 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 - ---- ---- ---- ---- ---- - ----@return evolved.query_builder builder ----@nodiscard -function __evolved_query() - return __lua_setmetatable({}, __builder_fns.query_builder) -end - ----@param name string ----@return evolved.query_builder builder -function __builder_fns.query_builder:name(name) - self.__name = name - return self -end - ----@param single evolved.component ----@return evolved.query_builder builder -function __builder_fns.query_builder:single(single) - self.__single = single return self end ---@param ... evolved.fragment fragments ----@return evolved.query_builder builder -function __builder_fns.query_builder:include(...) - local fragment_count = __lua_select('#', ...) +---@return evolved.builder builder +function __evolved_builder_mt:remove(...) + local fragment_count = select("#", ...) if fragment_count == 0 then return self end - local include_list = self.__include_list + local fragment = ... - if not include_list then - include_list = __lua_table_new(fragment_count, 0) - self.__include_list = include_list + local fragment_set = self.__fragment_set + local fragment_list = self.__fragment_list + local component_list = self.__component_list + local component_count = self.__component_count + + local component_index = fragment_set[fragment] + + if component_index + and component_index <= component_count + and fragment == fragment_list[component_index] + then + if component_index ~= component_count then + local last_fragment = fragment_list[component_count] + local last_component = component_list[component_count] + + fragment_set[last_fragment] = component_index + fragment_list[component_index] = last_fragment + component_list[component_index] = last_component + end + + fragment_set[fragment] = nil + fragment_list[component_count] = nil + component_list[component_count] = nil + + component_count = component_count - 1 + self.__component_count = component_count end - local include_count = #include_list + return self:remove(__lua_select(2, ...)) +end - for i = 1, fragment_count do +---@return evolved.builder builder +function __evolved_builder_mt:clear() + self.__prefab = nil + self.__single = nil + self.__component_count = 0 + return self +end + +---@return evolved.builder builder +function __evolved_builder_mt:tag() + return self:set(__TAG) +end + +---@param name string +---@return evolved.builder builder +function __evolved_builder_mt:name(name) + return self:set(__NAME, name) +end + +---@param prefab evolved.entity +---@return evolved.builder builder +function __evolved_builder_mt:prefab(prefab) + self.__prefab = prefab + return self +end + +---@param single evolved.component +---@return evolved.builder builder +function __evolved_builder_mt:single(single) + self.__single = single == nil and true or single + return self +end + +---@param default evolved.component +---@return evolved.builder builder +function __evolved_builder_mt:default(default) + return self:set(__DEFAULT, default) +end + +---@param duplicate evolved.duplicate +---@return evolved.builder builder +function __evolved_builder_mt:duplicate(duplicate) + return self:set(__DUPLICATE, duplicate) +end + +---@param ... evolved.fragment fragments +---@return evolved.builder builder +function __evolved_builder_mt:include(...) + local argument_count = __lua_select('#', ...) + + if argument_count == 0 then + return self + end + + local include_list = self:get(__INCLUDES) + local include_count = include_list and #include_list or 0 + + if include_count == 0 then + include_list = __lua_table_new(argument_count, 0) + end + + for i = 1, argument_count do ---@type evolved.fragment local fragment = __lua_select(i, ...) include_list[include_count + i] = fragment end - return self + return self:set(__INCLUDES, include_list) end ---@param ... evolved.fragment fragments ----@return evolved.query_builder builder -function __builder_fns.query_builder:exclude(...) - local fragment_count = __lua_select('#', ...) +---@return evolved.builder builder +function __evolved_builder_mt:exclude(...) + local argument_count = __lua_select('#', ...) - if fragment_count == 0 then + if argument_count == 0 then return self end - local exclude_list = self.__exclude_list + local exclude_list = self:get(__EXCLUDES) + local exclude_count = exclude_list and #exclude_list or 0 - if not exclude_list then - exclude_list = __lua_table_new(fragment_count, 0) - self.__exclude_list = exclude_list + if exclude_count == 0 then + exclude_list = __lua_table_new(argument_count, 0) end - local exclude_count = #exclude_list - - for i = 1, fragment_count do + for i = 1, argument_count do ---@type evolved.fragment local fragment = __lua_select(i, ...) exclude_list[exclude_count + i] = fragment end - return self + return self:set(__EXCLUDES, exclude_list) end ----@return evolved.query query -function __builder_fns.query_builder:build() - local name = self.__name - local single = self.__single - local include_list = self.__include_list - local exclude_list = self.__exclude_list - - self.__name = nil - self.__single = nil - self.__include_list = nil - self.__exclude_list = nil - - local query = __evolved_id() - - local fragment_list = __acquire_table(__table_pool_tag.fragment_list) - local component_list = __acquire_table(__table_pool_tag.component_list) - local component_count = 0 - - if name then - component_count = component_count + 1 - fragment_list[component_count] = __NAME - component_list[component_count] = name - end - - if single ~= nil then - component_count = component_count + 1 - fragment_list[component_count] = query - component_list[component_count] = single - end - - if include_list then - component_count = component_count + 1 - fragment_list[component_count] = __INCLUDES - component_list[component_count] = include_list - end - - if exclude_list then - component_count = component_count + 1 - fragment_list[component_count] = __EXCLUDES - component_list[component_count] = 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 +---@param on_set evolved.set_hook +---@return evolved.builder builder +function __evolved_builder_mt:on_set(on_set) + return self:set(__ON_SET, on_set) end ---- ---- ---- ---- ---- - ----@return evolved.system_builder builder ----@nodiscard -function __evolved_system() - return __lua_setmetatable({}, __builder_fns.system_builder) +---@param on_assign evolved.assign_hook +---@return evolved.builder builder +function __evolved_builder_mt:on_assign(on_assign) + return self:set(__ON_ASSIGN, on_assign) end ----@param name string ----@return evolved.system_builder builder -function __builder_fns.system_builder:name(name) - self.__name = name - return self +---@param on_insert evolved.insert_hook +---@return evolved.builder builder +function __evolved_builder_mt:on_insert(on_insert) + return self:set(__ON_INSERT, on_insert) end ----@param single evolved.component ----@return evolved.system_builder builder -function __builder_fns.system_builder:single(single) - self.__single = single - return self +---@param on_remove evolved.remove_hook +---@return evolved.builder builder +function __evolved_builder_mt:on_remove(on_remove) + return self:set(__ON_REMOVE, on_remove) end ---@param group evolved.system ----@return evolved.system_builder builder -function __builder_fns.system_builder:group(group) - self.__group = group - return self +---@return evolved.builder builder +function __evolved_builder_mt:group(group) + return self:set(__GROUP, group) end ---@param query evolved.query ----@return evolved.system_builder builder -function __builder_fns.system_builder:query(query) - self.__query = query - return self +---@return evolved.builder builder +function __evolved_builder_mt:query(query) + return self:set(__QUERY, query) end ---@param execute evolved.execute ----@return evolved.system_builder builder -function __builder_fns.system_builder:execute(execute) - self.__execute = execute - return self +---@return evolved.builder builder +function __evolved_builder_mt:execute(execute) + return self:set(__EXECUTE, execute) end ---@param prologue evolved.prologue ----@return evolved.system_builder builder -function __builder_fns.system_builder:prologue(prologue) - self.__prologue = prologue - return self +---@return evolved.builder builder +function __evolved_builder_mt:prologue(prologue) + return self:set(__PROLOGUE, prologue) end ---@param epilogue evolved.epilogue ----@return evolved.system_builder builder -function __builder_fns.system_builder:epilogue(epilogue) - self.__epilogue = epilogue - return self +---@return evolved.builder builder +function __evolved_builder_mt:epilogue(epilogue) + return self:set(__EPILOGUE, epilogue) end ----@return evolved.system_builder builder -function __builder_fns.system_builder:disabled() - self.__disabled = true - return self +---@return evolved.builder builder +function __evolved_builder_mt:disabled() + return self:set(__DISABLED) end ----@return evolved.system system -function __builder_fns.system_builder:build() - local name = self.__name +---@param destroy_policy evolved.id +---@return evolved.builder builder +function __evolved_builder_mt:destroy_policy(destroy_policy) + return self:set(__DESTROY_POLICY, destroy_policy) +end + +---@param no_clear? boolean +---@return evolved.entity entity +function __evolved_builder_mt:build(no_clear) + local prefab = self.__prefab local single = self.__single - local group = self.__group - local query = self.__query - local execute = self.__execute - local prologue = self.__prologue - local epilogue = self.__epilogue - local disabled = self.__disabled + local fragment_list = self.__fragment_list + local component_list = self.__component_list + local component_count = self.__component_count - self.__name = nil - self.__single = nil - self.__group = nil - self.__query = nil - self.__execute = nil - self.__prologue = nil - self.__epilogue = nil - self.__disabled = nil - - local system = __evolved_id() - - local fragment_list = __acquire_table(__table_pool_tag.fragment_list) - local component_list = __acquire_table(__table_pool_tag.component_list) - local component_count = 0 - - if name then - component_count = component_count + 1 - fragment_list[component_count] = __NAME - component_list[component_count] = name + if __debug_mode then + if prefab then __debug_fns.validate_prefab(prefab) end + __debug_fns.validate_fragment_list(fragment_list, component_count) end + local entity = __acquire_id() + if single ~= nil then component_count = component_count + 1 - fragment_list[component_count] = system + fragment_list[component_count] = entity component_list[component_count] = single end - if group then - component_count = component_count + 1 - fragment_list[component_count] = __GROUP - component_list[component_count] = group + if not no_clear then + self:clear() end - if query then - component_count = component_count + 1 - fragment_list[component_count] = __QUERY - component_list[component_count] = query + local entity_chunk = __chunk_fragment_list(fragment_list, component_count) + + if __defer_depth > 0 then + if prefab then + __defer_spawn_entity_as(entity, prefab, + fragment_list, component_count, + component_list, component_count) + else + __defer_spawn_entity_with(entity, entity_chunk, + fragment_list, component_count, + component_list, component_count) + end + return entity end - if execute then - component_count = component_count + 1 - fragment_list[component_count] = __EXECUTE - component_list[component_count] = execute + __evolved_defer() + do + if prefab then + __spawn_entity_as(entity, prefab, + fragment_list, component_count, + component_list) + else + __spawn_entity_with(entity, entity_chunk, + fragment_list, component_count, + component_list) + end end + __evolved_commit() - if prologue then - component_count = component_count + 1 - fragment_list[component_count] = __PROLOGUE - component_list[component_count] = prologue - end - - if epilogue then - component_count = component_count + 1 - fragment_list[component_count] = __EPILOGUE - component_list[component_count] = epilogue - end - - if disabled then - component_count = component_count + 1 - fragment_list[component_count] = __DISABLED - component_list[component_count] = true - end - - __evolved_multi_set(system, fragment_list, component_list) - - __release_table(__table_pool_tag.fragment_list, fragment_list) - __release_table(__table_pool_tag.component_list, component_list) - - return system + return entity end --- @@ -7074,6 +6933,7 @@ evolved.is_empty_all = __evolved_is_empty_all evolved.is_empty_any = __evolved_is_empty_any evolved.get = __evolved_get + evolved.has = __evolved_has evolved.has_all = __evolved_has_all evolved.has_any = __evolved_has_any @@ -7112,10 +6972,7 @@ evolved.spawn_with = __evolved_spawn_with evolved.debug_mode = __evolved_debug_mode evolved.collect_garbage = __evolved_collect_garbage -evolved.entity = __evolved_entity -evolved.fragment = __evolved_fragment -evolved.query = __evolved_query -evolved.system = __evolved_system +evolved.builder = __evolved_builder evolved.collect_garbage()