GCC Code Coverage Report


Directory: ./
File: submodules/ECS/source/world_entity.c
Date: 2023-09-29 04:53:15
Exec Total Coverage
Lines: 0 54 0.0%
Branches: 0 32 0.0%

Line Branch Exec Source
1 /*
2 * Filename: /workspaces/our_rpg/lib/ECS/source/world_entity.c
3 * Path: /workspaces/our_rpg/lib/ECS/source
4 * Created Date: Sunday, January 15th 2023, 3:59:16 pm
5 * Author: osvegn
6 *
7 * Copyright (c) 2023 our_rpg
8 */
9
10 #include "world.h"
11 #include "component.h"
12 #include <stdarg.h>
13
14 /// @brief It returns the index of the entity in the entity list if it exists, or the size of the entity list
15 /// if it doesn't
16 /// @param entity_list The list of entities to search through.
17 /// @param entity The entity to find.
18 /// @return The index of the entity in the entity list.
19 static unsigned int find_entity(vector_t *entity_list, entity_t *entity)
20 {
21 for (unsigned int i = 0; i < entity_list->size(entity_list); i++) {
22 if (entity->id == (*(entity_t *)(entity_list->at(entity_list, i))).id)
23 return i;
24 }
25 return entity_list->size(entity_list);
26 }
27
28 static unsigned int find_entity_by_id(vector_t *entity_list, unsigned int id)
29 {
30 for (unsigned int i = 0; i < entity_list->size(entity_list); i++) {
31 if (id == (*(entity_t *)(entity_list->at(entity_list, i))).id)
32 return i;
33 }
34 return entity_list->size(entity_list);
35 }
36
37 int world_add_entity(world_t *world, entity_t *entity)
38 {
39 unsigned int index = find_entity(&world->entity_list, entity);
40
41 if (index < world->entity_list.size(&world->entity_list)) {
42 return -1;
43 }
44 world->entity_list.emplace_back(&world->entity_list, entity);
45 return 0;
46 }
47
48 int world_remove_entity(world_t *world, entity_t *entity)
49 {
50 unsigned int index = find_entity(&world->entity_list, entity);
51
52 if (index < world->entity_list.size(&world->entity_list)) {
53 world->entity_list.erase(&world->entity_list, index);
54 return 0;
55 }
56 return -1;
57 }
58
59 int world_remove_entity_by_id(world_t *world, unsigned int id)
60 {
61 unsigned int index = find_entity_by_id(&world->entity_list, id);
62
63 if (index < world->entity_list.size(&world->entity_list)) {
64 world->entity_list.erase(&world->entity_list, index);
65 return 0;
66 }
67 return -1;
68 }
69
70 bool world_contains_entity(world_t *world, entity_t *entity)
71 {
72 unsigned int index = find_entity(&world->entity_list, entity);
73
74 if (index < world->entity_list.size(&world->entity_list))
75 return true;
76 return false;
77 }
78
79 bool world_contains_entity_by_id(world_t *world, unsigned int id)
80 {
81 unsigned int index = find_entity_by_id(&world->entity_list, id);
82
83 if (index < world->entity_list.size(&world->entity_list))
84 return true;
85 return false;
86 }
87
88 entity_t *world_get_entity_by_id(world_t *world, unsigned int id)
89 {
90 unsigned int index = 0;
91
92 index = find_entity_by_id(&world->entity_list, id);
93 return world->entity_list.at(&world->entity_list, index);
94 }
95
96 int world_join_entities(world_t *world, vector_t *entities, unsigned int type, ...)
97 {
98 va_list argptr;
99 int component;
100 bool first_element = true;
101 void *ptr;
102
103 vector_constructor(entities, sizeof(entity_t *), 0);
104 va_start(argptr, type);
105 for (unsigned index = 0; index < type; index++) {
106 component = va_arg(argptr, int);
107 if (first_element) {
108 for (unsigned int i = 0; i < world->entity_list.size(&world->entity_list); i++) {
109 if (entity_contains_component_by_type(world->entity_list.at(&world->entity_list, i), component)) {
110 ptr = world->entity_list.at(&world->entity_list, i);
111 entities->emplace_back(entities, &ptr);
112 }
113 }
114 first_element = false;
115 } else {
116 for (unsigned int i = 0; i < entities->size(entities); i++) {
117 if (!entity_contains_component_by_type(*(entity_t **)entities->at(entities, i), component)) {
118 entities->erase(entities, i);
119 i--;
120 }
121 }
122 entities->shrink_to_fit(entities);
123 }
124 }
125 va_end(argptr);
126 if (first_element)
127 return -1;
128 return entities->size(entities);
129 }
130