Skip to content

Commit

Permalink
Move table graph types to separate header
Browse files Browse the repository at this point in the history
  • Loading branch information
SanderMertens committed Aug 19, 2023
1 parent 3f8452f commit 1d9f890
Show file tree
Hide file tree
Showing 3 changed files with 191 additions and 163 deletions.
156 changes: 85 additions & 71 deletions flecs.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
Expand All @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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,
Expand All @@ -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);
Expand All @@ -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


Expand Down
94 changes: 2 additions & 92 deletions src/storage/table.h
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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<id, edge_t>) */
} 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 */
Expand Down Expand Up @@ -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,
Expand All @@ -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);
Expand All @@ -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
Loading

0 comments on commit 1d9f890

Please sign in to comment.