88 lines
2.5 KiB
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;
|
|
}
|
|
}
|
|
}
|