#include "storage.h" #include "bitset.h" component_pair_t * findPair(storage_t *this, const char *name) { for (int i = 0; i < this->componentsStored; ++i) { component_pair_t *pair = &this->objects[i]; if (strcmp(name, pair->name) == 0) { return pair; } } return NULL; } entity_t createEntity(storage_t *this) { entity_t idx = this->objectsStored++; for (int i = 0; i < this->componentsStored; ++i) { component_pair_t pair = this->objects[i]; memset(&pair.objects[idx], 0, pair.objectSize); } return idx; } void registerSystem(storage_t *storage, system_t system, bitset_t components) { int idx = storage->systemsStored++; storage->systems[idx] = system; bitarena_copy(&storage->systemSignatures, components, idx); } bitset_t createSignature(storage_t *storage, char **components) { bitset_t bitset = bitset_create(); for (int i = 0; components[i] != NULL; ++i) { const char *componentName = components[i]; component_pair_t *pair = findPair(storage, componentName); if (pair == NULL) { return NULL; } else { bitset_set(bitset, pair->idx); } } return bitset; } // Not intended for use outside of macros void internal_registerComponent(storage_t *storage, const char *name, size_t size) { unsigned int componentIdx = storage->componentsStored++; storage->objects[componentIdx] = (component_pair_t) { .idx = componentIdx, .name = name, .objectSize = size, .objects = malloc(sizeof(char) * size * MAX_OBJECTS) }; } void * // NULL if component with such name is not found internal_addComponent(storage_t *this, entity_t idx, const char *name) { component_pair_t *pair = findPair(this, name); if (pair == NULL) { return NULL; } // TODO: add bitset implementation bitset_t bitset = bitarena_at(&this->objectSignatures, idx); bitset_set(bitset, pair->idx); return &pair->objects[idx]; } // Not intended for use outside of macros void * // NULL if component is not found internal_getComponent(storage_t *this, entity_t idx, const char *name) { for (int i = 0; i < this->componentsStored; ++i) { component_pair_t *pair = &this->objects[i]; if (strcmp(name, pair->name) == 0) { return &pair->objects[idx]; } } return NULL; }