#include #include #include #include #include vecs_s * vecs_new(vx_uuid_table_s *uuid_table) { if( ! uuid_table) { uuid_table = vx_new_uuid_table(); } vecs_s *ecs = malloc(sizeof(vecs_s)); ecs->resolver = vecs_create_tag_name_resolver(uuid_table); ecs->lookup_map = vecs_create_lookup_map(uuid_table); ecs->uuid_table = uuid_table; ecs->shadow_pool = vx_new_pool(sizeof(vecs_shadow_s), 8192); ecs->tag_pool = vx_new_pool(sizeof(vecs_tag_s), 32768); ecs->type_resolver.num_types = 0; ecs->type_resolver.types_capacity = 256; ecs->type_resolver.types = malloc(ecs->type_resolver.types_capacity * sizeof(vecs_type_s)); return ecs; } void vecs_free(vecs_s *ecs) { vecs_delete_tag_name_resolver(&ecs->resolver); vx_free_pool(ecs->shadow_pool); vx_free_pool(ecs->tag_pool); } vecs_type_s * vecs_resolve_type( vecs_s *ecs, const char *name ) { uint16_t len_name = strlen(name); uint32_t type_index = 0; while(type_index < ecs->type_resolver.num_types) { vecs_type_s *type = &ecs->type_resolver.types[type_index]; if(type->len_name != len_name) { ++type_index; continue; } if( ! memcmp(type->name, name, type->len_name)) { return type; } ++type_index; } return NULL; } void vecs_remark( vecs_s *ecs, char *type_name, uint32_t size ) { if(vecs_resolve_type(ecs, type_name)) { return; } if(ecs->type_resolver.num_types >= ecs->type_resolver.types_capacity) { ecs->type_resolver.types_capacity *= 2; ecs->type_resolver.types = realloc(ecs->type_resolver.types, ecs->type_resolver.types_capacity * sizeof(vecs_type_s)); } vecs_type_s *type = &ecs->type_resolver.types[ecs->type_resolver.num_types++]; type->size = size; type->len_name = strlen(type_name); type->name = vx_arena_dupe_string(ecs->static_arena, type_name); }