clay/src/clay-property.c

88 lines
2.5 KiB
C

#include <string.h>
#include "clay-property.h"
struct clay_property {
int tag;
struct clay_property_value value;
};
struct clay_property_set_t {
struct clay_property *props;
size_t length;
size_t size;
};
static struct clay_property_value empty_property_value = {
.type = CLAY_PROPERTY_NOT_SET,
};
clay_property_set clay_propset_create(void) {
clay_property_set propset = malloc(sizeof(*propset));
assert(propset != NULL);
propset->length = 0;
propset->size = 16;
propset->props = malloc(sizeof(*propset->props) * 16);
assert(propset->props != NULL);
return propset;
}
clay_property_set clay_propset_clone(clay_property_set propset) {
clay_property_set cloned = malloc(sizeof(*cloned));
assert(propset != NULL);
cloned->length = propset->length;
cloned->size = propset->size;
cloned->props = malloc(sizeof(*cloned->props) * cloned->size);
memcpy(cloned->props, propset->props, sizeof(*cloned->props) * cloned->size);
return cloned;
}
void clay_propset_destroy(clay_property_set propset) {
free(propset->props);
free(propset);
}
clay_property_value clay_property_get_by_tag(clay_property_set propset, int tag) {
for (size_t i = 0; i < propset->length; ++i) {
struct clay_property *prop = &propset->props[i];
if (prop->tag == tag) {
return &prop->value;
}
}
return &empty_property_value;
}
void clay_property_set_by_tag(clay_property_set propset, int tag, struct clay_property_value value) {
struct clay_property *prop = NULL;
for (size_t i = 0; i < propset->length; ++i) {
if (propset->props[i].tag == tag) {
prop = &propset->props[i];
break;
}
}
if (prop == NULL) {
assert(propset->length <= propset->size);
if (propset->length == propset->size) {
size_t new_size = propset->size * 2;
propset->props = realloc(propset->props, sizeof(*propset->props) * new_size);
assert(propset->props != NULL);
propset->size = new_size;
}
propset->length += 1;
prop = &propset->props[propset->length - 1];
}
prop->tag = tag;
prop->value = value;
}
void clay_property_delete_by_tag(clay_property_set propset, int tag) {
for (size_t i = 0; i < propset->length; ++i) {
struct clay_property *prop = &propset->props[i];
if (prop->tag == tag) {
prop->value = empty_property_value;
}
}
}