diff --git a/flecs.c b/flecs.c index f6d829b3e..0c7aa7504 100644 --- a/flecs.c +++ b/flecs.c @@ -501,37 +501,17 @@ extern "C" { #ifndef FLECS_TABLE_H #define FLECS_TABLE_H -/* Table event type for notifying tables of world events */ -typedef enum ecs_table_eventkind_t { - EcsTableTriggersForId, - EcsTableNoTriggersForId, -} ecs_table_eventkind_t; - -typedef struct ecs_table_event_t { - ecs_table_eventkind_t kind; - - /* Query event */ - ecs_query_t *query; - - /* Component info event */ - ecs_entity_t component; - - /* Event match */ - ecs_entity_t event; +/** + * @file table_graph.h + * @brief Table graph types. + */ - /* If the nubmer of fields gets out of hand, this can be turned into a union - * but since events are very temporary objects, this works for now and makes - * initializing an event a bit simpler. */ -} ecs_table_event_t; +#ifndef FLECS_TABLE_GRAPH_H +#define FLECS_TABLE_GRAPH_H /** Cache of added/removed components for non-trivial edges between tables */ #define ECS_TABLE_DIFF_INIT { .added = {0}} -typedef struct ecs_table_diff_t { - ecs_type_t added; /* Components added between tables */ - ecs_type_t removed; /* Components removed between tables */ -} ecs_table_diff_t; - /** Builder for table diff. The table diff type itself doesn't use ecs_vec_t to * conserve memory on table edges (a type doesn't have the size field), whereas * a vec for the builder is more convenient to use & has allocator support. */ @@ -540,6 +520,11 @@ typedef struct ecs_table_diff_builder_t { ecs_vec_t removed; } ecs_table_diff_builder_t; +typedef struct ecs_table_diff_t { + ecs_type_t added; /* Components added between tables */ + ecs_type_t removed; /* Components removed between tables */ +} ecs_table_diff_t; + /** Edge linked list (used to keep track of incoming edges) */ typedef struct ecs_graph_edge_hdr_t { struct ecs_graph_edge_hdr_t *prev; @@ -571,6 +556,80 @@ typedef struct ecs_graph_node_t { ecs_graph_edge_hdr_t refs; } ecs_graph_node_t; +/* Find table by adding id to current table */ +ecs_table_t *flecs_table_traverse_add( + ecs_world_t *world, + ecs_table_t *table, + ecs_id_t *id_ptr, + ecs_table_diff_t *diff); + +/* Find table by removing id from current table */ +ecs_table_t *flecs_table_traverse_remove( + ecs_world_t *world, + ecs_table_t *table, + ecs_id_t *id_ptr, + ecs_table_diff_t *diff); + +/* Cleanup incoming and outgoing edges for table */ +void flecs_table_clear_edges( + ecs_world_t *world, + ecs_table_t *table); + +/* Table diff builder, used to build id lists that indicate the difference in + * ids between two tables. */ +void flecs_table_diff_builder_init( + ecs_world_t *world, + ecs_table_diff_builder_t *builder); + +void flecs_table_diff_builder_fini( + ecs_world_t *world, + ecs_table_diff_builder_t *builder); + +void flecs_table_diff_builder_clear( + ecs_table_diff_builder_t *builder); + +void flecs_table_diff_build_append_table( + ecs_world_t *world, + ecs_table_diff_builder_t *dst, + ecs_table_diff_t *src); + +void flecs_table_diff_build( + ecs_world_t *world, + ecs_table_diff_builder_t *builder, + ecs_table_diff_t *diff, + int32_t added_offset, + int32_t removed_offset); + +void flecs_table_diff_build_noalloc( + ecs_table_diff_builder_t *builder, + ecs_table_diff_t *diff); + +#endif + + +/* Table event type for notifying tables of world events */ +typedef enum ecs_table_eventkind_t { + EcsTableTriggersForId, + EcsTableNoTriggersForId, +} ecs_table_eventkind_t; + +typedef struct ecs_table_event_t { + ecs_table_eventkind_t kind; + + /* Query event */ + ecs_query_t *query; + + /* Component info event */ + ecs_entity_t component; + + /* Event match */ + ecs_entity_t event; + + /* If the nubmer of fields gets out of hand, this can be turned into a union + * but since events are very temporary objects, this works for now and makes + * initializing an event a bit simpler. */ +} ecs_table_event_t; + /** Infrequently accessed data not stored inline in ecs_table_t */ typedef struct ecs_table__t { uint64_t hash; /* Type hash */ @@ -775,18 +834,6 @@ void flecs_table_swap( int32_t row_1, int32_t row_2); -ecs_table_t *flecs_table_traverse_add( - ecs_world_t *world, - ecs_table_t *table, - ecs_id_t *id_ptr, - ecs_table_diff_t *diff); - -ecs_table_t *flecs_table_traverse_remove( - ecs_world_t *world, - ecs_table_t *table, - ecs_id_t *id_ptr, - ecs_table_diff_t *diff); - void flecs_table_mark_dirty( ecs_world_t *world, ecs_table_t *table, @@ -797,10 +844,6 @@ void flecs_table_notify( ecs_table_t *table, ecs_table_event_t *event); -void flecs_table_clear_edges( - ecs_world_t *world, - ecs_table_t *table); - void flecs_table_delete_entities( ecs_world_t *world, ecs_table_t *table); @@ -814,35 +857,6 @@ void flecs_table_traversable_add( ecs_table_t *table, int32_t value); -/* Table diff builder, used to build id lists that indicate the difference in - * ids between two tables. */ -void flecs_table_diff_builder_init( - ecs_world_t *world, - ecs_table_diff_builder_t *builder); - -void flecs_table_diff_builder_fini( - ecs_world_t *world, - ecs_table_diff_builder_t *builder); - -void flecs_table_diff_builder_clear( - ecs_table_diff_builder_t *builder); - -void flecs_table_diff_build_append_table( - ecs_world_t *world, - ecs_table_diff_builder_t *dst, - ecs_table_diff_t *src); - -void flecs_table_diff_build( - ecs_world_t *world, - ecs_table_diff_builder_t *builder, - ecs_table_diff_t *diff, - int32_t added_offset, - int32_t removed_offset); - -void flecs_table_diff_build_noalloc( - ecs_table_diff_builder_t *builder, - ecs_table_diff_t *diff); - #endif diff --git a/src/storage/table.h b/src/storage/table.h index 45b800cc5..3e66c2f81 100644 --- a/src/storage/table.h +++ b/src/storage/table.h @@ -6,6 +6,8 @@ #ifndef FLECS_TABLE_H #define FLECS_TABLE_H +#include "table_graph.h" + /* Table event type for notifying tables of world events */ typedef enum ecs_table_eventkind_t { EcsTableTriggersForId, @@ -29,53 +31,6 @@ typedef struct ecs_table_event_t { * initializing an event a bit simpler. */ } ecs_table_event_t; -/** Cache of added/removed components for non-trivial edges between tables */ -#define ECS_TABLE_DIFF_INIT { .added = {0}} - -typedef struct ecs_table_diff_t { - ecs_type_t added; /* Components added between tables */ - ecs_type_t removed; /* Components removed between tables */ -} ecs_table_diff_t; - -/** Builder for table diff. The table diff type itself doesn't use ecs_vec_t to - * conserve memory on table edges (a type doesn't have the size field), whereas - * a vec for the builder is more convenient to use & has allocator support. */ -typedef struct ecs_table_diff_builder_t { - ecs_vec_t added; - ecs_vec_t removed; -} ecs_table_diff_builder_t; - -/** Edge linked list (used to keep track of incoming edges) */ -typedef struct ecs_graph_edge_hdr_t { - struct ecs_graph_edge_hdr_t *prev; - struct ecs_graph_edge_hdr_t *next; -} ecs_graph_edge_hdr_t; - -/** Single edge. */ -typedef struct ecs_graph_edge_t { - ecs_graph_edge_hdr_t hdr; - ecs_table_t *from; /* Edge source table */ - ecs_table_t *to; /* Edge destination table */ - ecs_table_diff_t *diff; /* Index into diff vector, if non trivial edge */ - ecs_id_t id; /* Id associated with edge */ -} ecs_graph_edge_t; - -/* Edges to other tables. */ -typedef struct ecs_graph_edges_t { - ecs_graph_edge_t *lo; /* Small array optimized for low edges */ - ecs_map_t *hi; /* Map for hi edges (map) */ -} ecs_graph_edges_t; - -/* Table graph node */ -typedef struct ecs_graph_node_t { - /* Outgoing edges */ - ecs_graph_edges_t add; - ecs_graph_edges_t remove; - - /* Incoming edges (next = add edges, prev = remove edges) */ - ecs_graph_edge_hdr_t refs; -} ecs_graph_node_t; - /** Infrequently accessed data not stored inline in ecs_table_t */ typedef struct ecs_table__t { uint64_t hash; /* Type hash */ @@ -280,18 +235,6 @@ void flecs_table_swap( int32_t row_1, int32_t row_2); -ecs_table_t *flecs_table_traverse_add( - ecs_world_t *world, - ecs_table_t *table, - ecs_id_t *id_ptr, - ecs_table_diff_t *diff); - -ecs_table_t *flecs_table_traverse_remove( - ecs_world_t *world, - ecs_table_t *table, - ecs_id_t *id_ptr, - ecs_table_diff_t *diff); - void flecs_table_mark_dirty( ecs_world_t *world, ecs_table_t *table, @@ -302,10 +245,6 @@ void flecs_table_notify( ecs_table_t *table, ecs_table_event_t *event); -void flecs_table_clear_edges( - ecs_world_t *world, - ecs_table_t *table); - void flecs_table_delete_entities( ecs_world_t *world, ecs_table_t *table); @@ -319,33 +258,4 @@ void flecs_table_traversable_add( ecs_table_t *table, int32_t value); -/* Table diff builder, used to build id lists that indicate the difference in - * ids between two tables. */ -void flecs_table_diff_builder_init( - ecs_world_t *world, - ecs_table_diff_builder_t *builder); - -void flecs_table_diff_builder_fini( - ecs_world_t *world, - ecs_table_diff_builder_t *builder); - -void flecs_table_diff_builder_clear( - ecs_table_diff_builder_t *builder); - -void flecs_table_diff_build_append_table( - ecs_world_t *world, - ecs_table_diff_builder_t *dst, - ecs_table_diff_t *src); - -void flecs_table_diff_build( - ecs_world_t *world, - ecs_table_diff_builder_t *builder, - ecs_table_diff_t *diff, - int32_t added_offset, - int32_t removed_offset); - -void flecs_table_diff_build_noalloc( - ecs_table_diff_builder_t *builder, - ecs_table_diff_t *diff); - #endif diff --git a/src/storage/table_graph.h b/src/storage/table_graph.h new file mode 100644 index 000000000..b17448699 --- /dev/null +++ b/src/storage/table_graph.h @@ -0,0 +1,104 @@ +/** + * @file table_graph.h + * @brief Table graph types. + */ + +#ifndef FLECS_TABLE_GRAPH_H +#define FLECS_TABLE_GRAPH_H + +/** Cache of added/removed components for non-trivial edges between tables */ +#define ECS_TABLE_DIFF_INIT { .added = {0}} + +/** Builder for table diff. The table diff type itself doesn't use ecs_vec_t to + * conserve memory on table edges (a type doesn't have the size field), whereas + * a vec for the builder is more convenient to use & has allocator support. */ +typedef struct ecs_table_diff_builder_t { + ecs_vec_t added; + ecs_vec_t removed; +} ecs_table_diff_builder_t; + +typedef struct ecs_table_diff_t { + ecs_type_t added; /* Components added between tables */ + ecs_type_t removed; /* Components removed between tables */ +} ecs_table_diff_t; + +/** Edge linked list (used to keep track of incoming edges) */ +typedef struct ecs_graph_edge_hdr_t { + struct ecs_graph_edge_hdr_t *prev; + struct ecs_graph_edge_hdr_t *next; +} ecs_graph_edge_hdr_t; + +/** Single edge. */ +typedef struct ecs_graph_edge_t { + ecs_graph_edge_hdr_t hdr; + ecs_table_t *from; /* Edge source table */ + ecs_table_t *to; /* Edge destination table */ + ecs_table_diff_t *diff; /* Index into diff vector, if non trivial edge */ + ecs_id_t id; /* Id associated with edge */ +} ecs_graph_edge_t; + +/* Edges to other tables. */ +typedef struct ecs_graph_edges_t { + ecs_graph_edge_t *lo; /* Small array optimized for low edges */ + ecs_map_t *hi; /* Map for hi edges (map) */ +} ecs_graph_edges_t; + +/* Table graph node */ +typedef struct ecs_graph_node_t { + /* Outgoing edges */ + ecs_graph_edges_t add; + ecs_graph_edges_t remove; + + /* Incoming edges (next = add edges, prev = remove edges) */ + ecs_graph_edge_hdr_t refs; +} ecs_graph_node_t; + +/* Find table by adding id to current table */ +ecs_table_t *flecs_table_traverse_add( + ecs_world_t *world, + ecs_table_t *table, + ecs_id_t *id_ptr, + ecs_table_diff_t *diff); + +/* Find table by removing id from current table */ +ecs_table_t *flecs_table_traverse_remove( + ecs_world_t *world, + ecs_table_t *table, + ecs_id_t *id_ptr, + ecs_table_diff_t *diff); + +/* Cleanup incoming and outgoing edges for table */ +void flecs_table_clear_edges( + ecs_world_t *world, + ecs_table_t *table); + +/* Table diff builder, used to build id lists that indicate the difference in + * ids between two tables. */ +void flecs_table_diff_builder_init( + ecs_world_t *world, + ecs_table_diff_builder_t *builder); + +void flecs_table_diff_builder_fini( + ecs_world_t *world, + ecs_table_diff_builder_t *builder); + +void flecs_table_diff_builder_clear( + ecs_table_diff_builder_t *builder); + +void flecs_table_diff_build_append_table( + ecs_world_t *world, + ecs_table_diff_builder_t *dst, + ecs_table_diff_t *src); + +void flecs_table_diff_build( + ecs_world_t *world, + ecs_table_diff_builder_t *builder, + ecs_table_diff_t *diff, + int32_t added_offset, + int32_t removed_offset); + +void flecs_table_diff_build_noalloc( + ecs_table_diff_builder_t *builder, + ecs_table_diff_t *diff); + +#endif