Files
PixelDefense/engine/libs/flecs/src/value.c

233 lines
5.1 KiB
C

/**
* @file value.c
* @brief Utility functions to work with non-trivial pointers of user types.
*/
#include "private_api.h"
int ecs_value_init_w_type_info(
const ecs_world_t *world,
const ecs_type_info_t *ti,
void *ptr)
{
ecs_poly_assert(world, ecs_world_t);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, NULL);
(void)world;
ecs_xtor_t ctor;
if ((ctor = ti->hooks.ctor)) {
ctor(ptr, 1, ti);
} else {
ecs_os_memset(ptr, 0, ti->size);
}
return 0;
error:
return -1;
}
int ecs_value_init(
const ecs_world_t *world,
ecs_entity_t type,
void *ptr)
{
ecs_poly_assert(world, ecs_world_t);
const ecs_type_info_t *ti = ecs_get_type_info(world, type);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, "entity is not a type");
return ecs_value_init_w_type_info(world, ti, ptr);
error:
return -1;
}
void* ecs_value_new_w_type_info(
ecs_world_t *world,
const ecs_type_info_t *ti)
{
ecs_poly_assert(world, ecs_world_t);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, NULL);
(void)world;
void *result = flecs_alloc(&world->allocator, ti->size);
if (ecs_value_init_w_type_info(world, ti, result) != 0) {
flecs_free(&world->allocator, ti->size, result);
goto error;
}
return result;
error:
return NULL;
}
void* ecs_value_new(
ecs_world_t *world,
ecs_entity_t type)
{
ecs_poly_assert(world, ecs_world_t);
const ecs_type_info_t *ti = ecs_get_type_info(world, type);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, "entity is not a type");
return ecs_value_new_w_type_info(world, ti);
error:
return NULL;
}
int ecs_value_fini_w_type_info(
const ecs_world_t *world,
const ecs_type_info_t *ti,
void *ptr)
{
ecs_poly_assert(world, ecs_world_t);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, NULL);
(void)world;
ecs_xtor_t dtor;
if ((dtor = ti->hooks.dtor)) {
dtor(ptr, 1, ti);
}
return 0;
error:
return -1;
}
int ecs_value_fini(
const ecs_world_t *world,
ecs_entity_t type,
void* ptr)
{
ecs_poly_assert(world, ecs_world_t);
(void)world;
const ecs_type_info_t *ti = ecs_get_type_info(world, type);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, "entity is not a type");
return ecs_value_fini_w_type_info(world, ti, ptr);
error:
return -1;
}
int ecs_value_free(
ecs_world_t *world,
ecs_entity_t type,
void* ptr)
{
ecs_poly_assert(world, ecs_world_t);
const ecs_type_info_t *ti = ecs_get_type_info(world, type);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, "entity is not a type");
if (ecs_value_fini_w_type_info(world, ti, ptr) != 0) {
goto error;
}
flecs_free(&world->allocator, ti->size, ptr);
return 0;
error:
return -1;
}
int ecs_value_copy_w_type_info(
const ecs_world_t *world,
const ecs_type_info_t *ti,
void* dst,
const void *src)
{
ecs_poly_assert(world, ecs_world_t);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, NULL);
(void)world;
ecs_copy_t copy;
if ((copy = ti->hooks.copy)) {
copy(dst, src, 1, ti);
} else {
ecs_os_memcpy(dst, src, ti->size);
}
return 0;
error:
return -1;
}
int ecs_value_copy(
const ecs_world_t *world,
ecs_entity_t type,
void* dst,
const void *src)
{
ecs_poly_assert(world, ecs_world_t);
const ecs_type_info_t *ti = ecs_get_type_info(world, type);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, "entity is not a type");
return ecs_value_copy_w_type_info(world, ti, dst, src);
error:
return -1;
}
int ecs_value_move_w_type_info(
const ecs_world_t *world,
const ecs_type_info_t *ti,
void* dst,
void *src)
{
ecs_poly_assert(world, ecs_world_t);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, NULL);
(void)world;
ecs_move_t move;
if ((move = ti->hooks.move)) {
move(dst, src, 1, ti);
} else {
ecs_os_memcpy(dst, src, ti->size);
}
return 0;
error:
return -1;
}
int ecs_value_move(
const ecs_world_t *world,
ecs_entity_t type,
void* dst,
void *src)
{
ecs_poly_assert(world, ecs_world_t);
const ecs_type_info_t *ti = ecs_get_type_info(world, type);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, "entity is not a type");
return ecs_value_move_w_type_info(world, ti, dst, src);
error:
return -1;
}
int ecs_value_move_ctor_w_type_info(
const ecs_world_t *world,
const ecs_type_info_t *ti,
void* dst,
void *src)
{
ecs_poly_assert(world, ecs_world_t);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, NULL);
(void)world;
ecs_move_t move;
if ((move = ti->hooks.move_ctor)) {
move(dst, src, 1, ti);
} else {
ecs_os_memcpy(dst, src, ti->size);
}
return 0;
error:
return -1;
}
int ecs_value_move_ctor(
const ecs_world_t *world,
ecs_entity_t type,
void* dst,
void *src)
{
ecs_poly_assert(world, ecs_world_t);
const ecs_type_info_t *ti = ecs_get_type_info(world, type);
ecs_check(ti != NULL, ECS_INVALID_PARAMETER, "entity is not a type");
return ecs_value_move_w_type_info(world, ti, dst, src);
error:
return -1;
}