diff --git a/README.md b/README.md index b841026..ceb27a0 100644 --- a/README.md +++ b/README.md @@ -26,13 +26,13 @@ TAG :: fragment DEFAULT :: fragment CONSTRUCT :: fragment +INCLUDES :: fragment +EXCLUDES :: fragment + ON_SET :: fragment ON_ASSIGN :: fragment ON_INSERT :: fragment ON_REMOVE :: fragment - -INCLUDE_LIST :: fragment -EXCLUDE_LIST :: fragment ``` ## Functions diff --git a/develop/untests.lua b/develop/untests.lua index c979982..a0ba02e 100644 --- a/develop/untests.lua +++ b/develop/untests.lua @@ -826,7 +826,7 @@ do assert(evo.insert(e5, f4, 53)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f1, f2) + evo.insert(q, evo.INCLUDES, f1, f2) assert(evo.batch_assign(q, f1, 60) == 3) @@ -886,7 +886,7 @@ do assert(evo.insert(e5, f4, 53)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f1, f2) + evo.insert(q, evo.INCLUDES, f1, f2) assert(evo.batch_assign(q, f1, 60) == 3) @@ -944,7 +944,7 @@ do assert(evo.insert(e5, f4, 53)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f1, f2) + evo.insert(q, evo.INCLUDES, f1, f2) assert(evo.batch_clear(q) == 3) @@ -1014,7 +1014,7 @@ do assert(evo.insert(e5, f4, 53)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f1, f2) + evo.insert(q, evo.INCLUDES, f1, f2) assert(evo.batch_clear(q) == 3) assert(entity_sum == e2 * 2 + e3 * 3 + e4 * 4) @@ -1062,7 +1062,7 @@ do assert(evo.insert(e5, f4, 53)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f1, f2) + evo.insert(q, evo.INCLUDES, f1, f2) assert(evo.batch_destroy(q) == 3) @@ -1132,7 +1132,7 @@ do assert(evo.insert(e5, f4, 53)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f1, f2) + evo.insert(q, evo.INCLUDES, f1, f2) assert(evo.batch_destroy(q) == 3) assert(entity_sum == e2 * 2 + e3 * 3 + e4 * 4) @@ -1180,7 +1180,7 @@ do assert(evo.insert(e5, f4, 53)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f1, f2) + evo.insert(q, evo.INCLUDES, f1, f2) assert(evo.batch_remove(q, f2, f3) == 3) @@ -1253,7 +1253,7 @@ do assert(evo.insert(e5, f4, 53)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f1, f2) + evo.insert(q, evo.INCLUDES, f1, f2) assert(evo.batch_remove(q, f2, f3) == 3) assert(entity_sum == e2 + e3 * 2 + e4 * 2) @@ -1289,7 +1289,7 @@ do assert(evo.insert(e4, f4, 50)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f2) + evo.insert(q, evo.INCLUDES, f2) assert(evo.batch_insert(q, f1, 60) == 1) @@ -1334,7 +1334,7 @@ do assert(evo.insert(e4, f4, 50)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f2) + evo.insert(q, evo.INCLUDES, f2) entity_sum = 0 component_sum = 0 @@ -1377,7 +1377,7 @@ do assert(evo.insert(e4, f4, 50)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f2) + evo.insert(q, evo.INCLUDES, f2) assert(evo.batch_set(q, f1, 60) == 3) @@ -1422,7 +1422,7 @@ do assert(evo.insert(e4, f4, 50)) local q = evo.id() - evo.insert(q, evo.INCLUDE_LIST, f2) + evo.insert(q, evo.INCLUDES, f2) entity_sum = 0 component_sum = 0 @@ -1815,12 +1815,12 @@ do do do local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) evo.batch_destroy(q) end local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1, f2) + evo.set(q, evo.INCLUDES, f1, f2) do local e = evo.id() @@ -1865,12 +1865,12 @@ do do do local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) evo.batch_destroy(q) end local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1, f2) + evo.set(q, evo.INCLUDES, f1, f2) do local e1 = evo.id() @@ -1912,12 +1912,12 @@ do do do local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) evo.batch_destroy(q) end local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1, f2) + evo.set(q, evo.INCLUDES, f1, f2) do local e1 = evo.id() @@ -1963,12 +1963,12 @@ do do do local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) evo.batch_destroy(q) end local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1, f2) + evo.set(q, evo.INCLUDES, f1, f2) do local e1 = evo.id() @@ -2008,12 +2008,12 @@ do do do local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) evo.batch_destroy(q) end local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1, f2) + evo.set(q, evo.INCLUDES, f1, f2) do local e1 = evo.id() @@ -2055,7 +2055,7 @@ do local f1, f2 = evo.id(2) local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) local e1 = evo.id() assert(evo.insert(e1, f1, 41)) @@ -2091,7 +2091,7 @@ do local f1, f2 = evo.id(2) local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) local e1 = evo.id() assert(evo.insert(e1, f1, 41)) @@ -2127,7 +2127,7 @@ do local f1, f2 = evo.id(2) local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) local e1 = evo.id() assert(evo.insert(e1, f1, 41)) @@ -2163,7 +2163,7 @@ do local f1 = evo.id(1) local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) local e1 = evo.id() assert(evo.insert(e1, f1, 41)) @@ -2186,7 +2186,7 @@ do local f1 = evo.id(1) local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) local e1 = evo.id() assert(evo.insert(e1, f1, 41)) @@ -2211,7 +2211,7 @@ do local f1 = evo.id(1) local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) local e1 = evo.id() assert(evo.insert(e1, f1, 41)) @@ -2236,8 +2236,8 @@ do local f1, f2 = evo.id(2) local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) - evo.set(q, evo.INCLUDE_LIST, f2) + evo.set(q, evo.INCLUDES, f1) + evo.set(q, evo.INCLUDES, f2) local e1 = evo.id() assert(evo.insert(e1, f1, 41)) @@ -2253,7 +2253,7 @@ do assert(entities and entities[1] == e2) end - evo.set(q, evo.INCLUDE_LIST) + evo.set(q, evo.INCLUDES) do local iter, state = evo.execute(q) @@ -2268,7 +2268,7 @@ do local f1, f2, f3 = evo.id(3) local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) local e1 = evo.id() assert(evo.insert(e1, f1, 41)) @@ -2296,10 +2296,10 @@ do local f1, f2 = evo.id(2) local q = evo.id() - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) - evo.set(q, evo.EXCLUDE_LIST, f1) - evo.set(q, evo.EXCLUDE_LIST, f2) + evo.set(q, evo.EXCLUDES, f1) + evo.set(q, evo.EXCLUDES, f2) local e1 = evo.id() assert(evo.insert(e1, f1, 41)) @@ -2319,7 +2319,7 @@ do assert(not entities) end - evo.set(q, evo.EXCLUDE_LIST) + evo.set(q, evo.EXCLUDES) do local iter, state = evo.execute(q) @@ -2355,7 +2355,7 @@ do assert(not chunk and not entities) end - evo.set(q, evo.EXCLUDE_LIST, f2) + evo.set(q, evo.EXCLUDES, f2) do local iter, state = evo.execute(q) @@ -2363,7 +2363,7 @@ do assert(not chunk and not entities) end - evo.set(q, evo.INCLUDE_LIST, f1) + evo.set(q, evo.INCLUDES, f1) do local iter, state = evo.execute(q) diff --git a/evolved.lua b/evolved.lua index 4fa33a9..a238506 100644 --- a/evolved.lua +++ b/evolved.lua @@ -339,13 +339,39 @@ evolved.TAG = __acquire_id() evolved.DEFAULT = __acquire_id() evolved.CONSTRUCT = __acquire_id() +evolved.INCLUDES = __acquire_id() +evolved.EXCLUDES = __acquire_id() + evolved.ON_SET = __acquire_id() evolved.ON_ASSIGN = __acquire_id() evolved.ON_INSERT = __acquire_id() evolved.ON_REMOVE = __acquire_id() -evolved.INCLUDE_LIST = __acquire_id() -evolved.EXCLUDE_LIST = __acquire_id() +--- +--- +--- +--- +--- + +local __INCLUDE_SET = __acquire_id() +local __EXCLUDE_SET = __acquire_id() +local __SORTED_INCLUDE_LIST = __acquire_id() +local __SORTED_EXCLUDE_LIST = __acquire_id() + +---@type table +local __EMPTY_FRAGMENT_SET = setmetatable({}, { + __newindex = function() error('attempt to modify empty fragment set') end +}) + +---@type evolved.fragment[] +local __EMPTY_FRAGMENT_LIST = setmetatable({}, { + __newindex = function() error('attempt to modify empty fragment list') end +}) + +---@type evolved.component[] +local __EMPTY_COMPONENT_STORAGE = setmetatable({}, { + __newindex = function() error('attempt to modify empty component storage') end +}) --- --- @@ -2448,15 +2474,10 @@ end --- --- -local __INCLUDE_SET = __acquire_id() -local __EXCLUDE_SET = __acquire_id() -local __SORTED_INCLUDE_LIST = __acquire_id() -local __SORTED_EXCLUDE_LIST = __acquire_id() - evolved.set(evolved.TAG, evolved.TAG) ---@param ... evolved.fragment -evolved.set(evolved.INCLUDE_LIST, evolved.CONSTRUCT, function(_, _, ...) +evolved.set(evolved.INCLUDES, evolved.CONSTRUCT, function(_, _, ...) local fragment_count = select('#', ...) if fragment_count == 0 then @@ -2475,7 +2496,7 @@ end) ---@param query evolved.query ---@param include_list evolved.fragment[] -evolved.set(evolved.INCLUDE_LIST, evolved.ON_SET, function(query, _, include_list) +evolved.set(evolved.INCLUDES, evolved.ON_SET, function(query, _, include_list) local include_list_size = #include_list ---@type table @@ -2500,12 +2521,12 @@ evolved.set(evolved.INCLUDE_LIST, evolved.ON_SET, function(query, _, include_lis evolved.set(query, __SORTED_INCLUDE_LIST, sorted_include_list) end) -evolved.set(evolved.INCLUDE_LIST, evolved.ON_REMOVE, function(query) +evolved.set(evolved.INCLUDES, evolved.ON_REMOVE, function(query) evolved.remove(query, __INCLUDE_SET, __SORTED_INCLUDE_LIST) end) ---@param ... evolved.fragment -evolved.set(evolved.EXCLUDE_LIST, evolved.CONSTRUCT, function(_, _, ...) +evolved.set(evolved.EXCLUDES, evolved.CONSTRUCT, function(_, _, ...) local fragment_count = select('#', ...) if fragment_count == 0 then @@ -2524,7 +2545,7 @@ end) ---@param query evolved.query ---@param exclude_list evolved.fragment[] -evolved.set(evolved.EXCLUDE_LIST, evolved.ON_SET, function(query, _, exclude_list) +evolved.set(evolved.EXCLUDES, evolved.ON_SET, function(query, _, exclude_list) local exclude_list_size = #exclude_list ---@type table @@ -2549,7 +2570,7 @@ evolved.set(evolved.EXCLUDE_LIST, evolved.ON_SET, function(query, _, exclude_lis evolved.set(query, __SORTED_EXCLUDE_LIST, sorted_exclude_list) end) -evolved.set(evolved.EXCLUDE_LIST, evolved.ON_REMOVE, function(query) +evolved.set(evolved.EXCLUDES, evolved.ON_REMOVE, function(query) evolved.remove(query, __EXCLUDE_SET, __SORTED_EXCLUDE_LIST) end) @@ -2559,27 +2580,6 @@ end) --- --- ----@type table -local __EMPTY_FRAGMENT_SET = setmetatable({}, { - __newindex = function() error('attempt to modify empty fragment set') end -}) - ----@type evolved.fragment[] -local __EMPTY_FRAGMENT_LIST = setmetatable({}, { - __newindex = function() error('attempt to modify empty fragment list') end -}) - ----@type evolved.component[] -local __EMPTY_COMPONENT_STORAGE = setmetatable({}, { - __newindex = function() error('attempt to modify empty component storage') end -}) - ---- ---- ---- ---- ---- - ---@param ... evolved.fragment fragments ---@return evolved.chunk?, evolved.entity[]? function evolved.chunk(...) @@ -2637,39 +2637,39 @@ function evolved.select(chunk, ...) local indices = chunk.__component_indices local storages = chunk.__component_storages - local EMPTY_COMPONENT_STORAGE = __EMPTY_COMPONENT_STORAGE + local empty_component_storage = __EMPTY_COMPONENT_STORAGE if fragment_count == 1 then local f1 = ... local i1 = indices[f1] return - i1 and storages[i1] or EMPTY_COMPONENT_STORAGE + i1 and storages[i1] or empty_component_storage end if fragment_count == 2 then local f1, f2 = ... local i1, i2 = indices[f1], indices[f2] return - i1 and storages[i1] or EMPTY_COMPONENT_STORAGE, - i2 and storages[i2] or EMPTY_COMPONENT_STORAGE + i1 and storages[i1] or empty_component_storage, + i2 and storages[i2] or empty_component_storage end if fragment_count == 3 then local f1, f2, f3 = ... local i1, i2, i3 = indices[f1], indices[f2], indices[f3] return - i1 and storages[i1] or EMPTY_COMPONENT_STORAGE, - i2 and storages[i2] or EMPTY_COMPONENT_STORAGE, - i3 and storages[i3] or EMPTY_COMPONENT_STORAGE + i1 and storages[i1] or empty_component_storage, + i2 and storages[i2] or empty_component_storage, + i3 and storages[i3] or empty_component_storage end do local f1, f2, f3 = ... local i1, i2, i3 = indices[f1], indices[f2], indices[f3] return - i1 and storages[i1] or EMPTY_COMPONENT_STORAGE, - i2 and storages[i2] or EMPTY_COMPONENT_STORAGE, - i3 and storages[i3] or EMPTY_COMPONENT_STORAGE, + i1 and storages[i1] or empty_component_storage, + i2 and storages[i2] or empty_component_storage, + i3 and storages[i3] or empty_component_storage, evolved.select(chunk, select(4, ...)) end end