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