Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add alignment support to vec #1110

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
513 changes: 295 additions & 218 deletions flecs.c

Large diffs are not rendered by default.

72 changes: 49 additions & 23 deletions flecs.h
Original file line number Diff line number Diff line change
Expand Up @@ -957,8 +957,10 @@ typedef struct ecs_vec_t {
void *array;
int32_t count;
int32_t size;
void *mem;
#ifdef FLECS_SANITIZE
ecs_size_t elem_size;
ecs_size_t elem_alignment;
#endif
} ecs_vec_t;

Expand All @@ -967,36 +969,40 @@ ecs_vec_t* ecs_vec_init(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size,
ecs_size_t alignment,
int32_t elem_count);

#define ecs_vec_init_t(allocator, vec, T, elem_count) \
ecs_vec_init(allocator, vec, ECS_SIZEOF(T), elem_count)
ecs_vec_init(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T), elem_count)

FLECS_API
void ecs_vec_init_if(
ecs_vec_t *vec,
ecs_size_t size);
ecs_size_t size,
ecs_size_t alignment);

#define ecs_vec_init_if_t(vec, T) \
ecs_vec_init_if(vec, ECS_SIZEOF(T))
ecs_vec_init_if(vec, ECS_SIZEOF(T), ECS_ALIGNOF(T))

FLECS_API
void ecs_vec_fini(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size);
ecs_size_t size,
ecs_size_t alignment);

#define ecs_vec_fini_t(allocator, vec, T) \
ecs_vec_fini(allocator, vec, ECS_SIZEOF(T))
ecs_vec_fini(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T))

FLECS_API
ecs_vec_t* ecs_vec_reset(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size);
ecs_size_t size,
ecs_size_t alignment);

#define ecs_vec_reset_t(allocator, vec, T) \
ecs_vec_reset(allocator, vec, ECS_SIZEOF(T))
ecs_vec_reset(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T))

FLECS_API
void ecs_vec_clear(
Expand All @@ -1006,10 +1012,11 @@ FLECS_API
void* ecs_vec_append(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size);
ecs_size_t size,
ecs_size_t alignment);

#define ecs_vec_append_t(allocator, vec, T) \
ECS_CAST(T*, ecs_vec_append(allocator, vec, ECS_SIZEOF(T)))
ECS_CAST(T*, ecs_vec_append(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T)))

FLECS_API
void ecs_vec_remove(
Expand All @@ -1028,79 +1035,87 @@ FLECS_API
ecs_vec_t ecs_vec_copy(
struct ecs_allocator_t *allocator,
const ecs_vec_t *vec,
ecs_size_t size);
ecs_size_t size,
ecs_size_t alignment);

#define ecs_vec_copy_t(allocator, vec, T) \
ecs_vec_copy(allocator, vec, ECS_SIZEOF(T))
ecs_vec_copy(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T))

FLECS_API
void ecs_vec_reclaim(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size);
ecs_size_t size,
ecs_size_t alignment);

#define ecs_vec_reclaim_t(allocator, vec, T) \
ecs_vec_reclaim(allocator, vec, ECS_SIZEOF(T))
ecs_vec_reclaim(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T))

FLECS_API
void ecs_vec_set_size(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size,
ecs_size_t alignment,
int32_t elem_count);

#define ecs_vec_set_size_t(allocator, vec, T, elem_count) \
ecs_vec_set_size(allocator, vec, ECS_SIZEOF(T), elem_count)
ecs_vec_set_size(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T), elem_count)

FLECS_API
void ecs_vec_set_min_size(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size,
ecs_size_t alignment,
int32_t elem_count);

#define ecs_vec_set_min_size_t(allocator, vec, T, elem_count) \
ecs_vec_set_min_size(allocator, vec, ECS_SIZEOF(T), elem_count)
ecs_vec_set_min_size(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T), elem_count)

FLECS_API
void ecs_vec_set_min_count(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size,
ecs_size_t alignment,
int32_t elem_count);

#define ecs_vec_set_min_count_t(allocator, vec, T, elem_count) \
ecs_vec_set_min_count(allocator, vec, ECS_SIZEOF(T), elem_count)
ecs_vec_set_min_count(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T), elem_count)

FLECS_API
void ecs_vec_set_min_count_zeromem(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size,
ecs_size_t alignment,
int32_t elem_count);

#define ecs_vec_set_min_count_zeromem_t(allocator, vec, T, elem_count) \
ecs_vec_set_min_count_zeromem(allocator, vec, ECS_SIZEOF(T), elem_count)
ecs_vec_set_min_count_zeromem(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T), elem_count)

FLECS_API
void ecs_vec_set_count(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size,
ecs_size_t alignment,
int32_t elem_count);

#define ecs_vec_set_count_t(allocator, vec, T, elem_count) \
ecs_vec_set_count(allocator, vec, ECS_SIZEOF(T), elem_count)
ecs_vec_set_count(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T), elem_count)

FLECS_API
void* ecs_vec_grow(
struct ecs_allocator_t *allocator,
ecs_vec_t *vec,
ecs_size_t size,
ecs_size_t alignment,
int32_t elem_count);

#define ecs_vec_grow_t(allocator, vec, T, elem_count) \
ecs_vec_grow(allocator, vec, ECS_SIZEOF(T), elem_count)
ecs_vec_grow(allocator, vec, ECS_SIZEOF(T), ECS_ALIGNOF(T), elem_count)

FLECS_API
int32_t ecs_vec_count(
Expand Down Expand Up @@ -1138,7 +1153,7 @@ void* ecs_vec_last(
}
#endif

#endif
#endif

/**
* @file sparse.h
Expand Down Expand Up @@ -3524,6 +3539,12 @@ void flecs_dump_backtrace(
#endif
#define ECS_OFFSET_T(o, T) ECS_OFFSET(o, ECS_SIZEOF(T))

#ifdef __cplusplus
#define ECS_ALIGN_PTR(ptr, alignment) reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(ptr) + reinterpret_cast<uintptr_t>((alignment) - 1)) & ~reinterpret_cast<uintptr_t>((alignment) - 1))
#else
#define ECS_ALIGN_PTR(ptr, alignment) (void*)(((uintptr_t)(ptr) + (uintptr_t)((alignment) - 1)) & ~(uintptr_t)((alignment) - 1))
#endif

#define ECS_ELEM(ptr, size, index) ECS_OFFSET(ptr, (size) * (index))
#define ECS_ELEM_T(o, T, index) ECS_ELEM(o, ECS_SIZEOF(T), index)

Expand Down Expand Up @@ -3563,7 +3584,9 @@ typedef struct {
ecs_hash_value_action_t hash;
ecs_compare_action_t compare;
ecs_size_t key_size;
ecs_size_t key_alignment;
ecs_size_t value_size;
ecs_size_t value_alignment;
ecs_block_allocator_t *hashmap_allocator;
ecs_block_allocator_t bucket_allocator;
ecs_map_t impl;
Expand All @@ -3585,13 +3608,15 @@ FLECS_DBG_API
void flecs_hashmap_init_(
ecs_hashmap_t *hm,
ecs_size_t key_size,
ecs_size_t key_alignment,
ecs_size_t value_size,
ecs_size_t value_alignment,
ecs_hash_value_action_t hash,
ecs_compare_action_t compare,
ecs_allocator_t *allocator);

#define flecs_hashmap_init(hm, K, V, hash, compare, allocator)\
flecs_hashmap_init_(hm, ECS_SIZEOF(K), ECS_SIZEOF(V), hash, compare, allocator)
flecs_hashmap_init_(hm, ECS_SIZEOF(K), ECS_ALIGNOF(K), ECS_SIZEOF(V), ECS_ALIGNOF(V), hash, compare, allocator)

FLECS_DBG_API
void flecs_hashmap_fini(
Expand All @@ -3612,10 +3637,11 @@ flecs_hashmap_result_t flecs_hashmap_ensure_(
ecs_hashmap_t *map,
ecs_size_t key_size,
const void *key,
ecs_size_t value_size);
ecs_size_t value_size,
ecs_size_t value_alignment);

#define flecs_hashmap_ensure(map, key, V)\
flecs_hashmap_ensure_(map, ECS_SIZEOF(*key), key, ECS_SIZEOF(V))
flecs_hashmap_ensure_(map, ECS_SIZEOF(*key), key, ECS_SIZEOF(V), ECS_ALIGNOF(V))

FLECS_DBG_API
void flecs_hashmap_set_(
Expand Down
6 changes: 6 additions & 0 deletions include/flecs/private/api_support.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,12 @@ void flecs_dump_backtrace(
#endif
#define ECS_OFFSET_T(o, T) ECS_OFFSET(o, ECS_SIZEOF(T))

#ifdef __cplusplus
#define ECS_ALIGN_PTR(ptr, alignment) reinterpret_cast<void*>((reinterpret_cast<uintptr_t>(ptr) + reinterpret_cast<uintptr_t>((alignment) - 1)) & ~reinterpret_cast<uintptr_t>((alignment) - 1))
#else
#define ECS_ALIGN_PTR(ptr, alignment) (void*)(((uintptr_t)(ptr) + (uintptr_t)((alignment) - 1)) & ~(uintptr_t)((alignment) - 1))
#endif

#define ECS_ELEM(ptr, size, index) ECS_OFFSET(ptr, (size) * (index))
#define ECS_ELEM_T(o, T, index) ECS_ELEM(o, ECS_SIZEOF(T), index)

Expand Down
11 changes: 8 additions & 3 deletions include/flecs/private/hashmap.h
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,9 @@ typedef struct {
ecs_hash_value_action_t hash;
ecs_compare_action_t compare;
ecs_size_t key_size;
ecs_size_t key_alignment;
ecs_size_t value_size;
ecs_size_t value_alignment;
ecs_block_allocator_t *hashmap_allocator;
ecs_block_allocator_t bucket_allocator;
ecs_map_t impl;
Expand All @@ -43,13 +45,15 @@ FLECS_DBG_API
void flecs_hashmap_init_(
ecs_hashmap_t *hm,
ecs_size_t key_size,
ecs_size_t key_alignment,
ecs_size_t value_size,
ecs_size_t value_alignment,
ecs_hash_value_action_t hash,
ecs_compare_action_t compare,
ecs_allocator_t *allocator);

#define flecs_hashmap_init(hm, K, V, hash, compare, allocator)\
flecs_hashmap_init_(hm, ECS_SIZEOF(K), ECS_SIZEOF(V), hash, compare, allocator)
flecs_hashmap_init_(hm, ECS_SIZEOF(K), ECS_ALIGNOF(K), ECS_SIZEOF(V), ECS_ALIGNOF(V), hash, compare, allocator)

FLECS_DBG_API
void flecs_hashmap_fini(
Expand All @@ -70,10 +74,11 @@ flecs_hashmap_result_t flecs_hashmap_ensure_(
ecs_hashmap_t *map,
ecs_size_t key_size,
const void *key,
ecs_size_t value_size);
ecs_size_t value_size,
ecs_size_t value_alignment);

#define flecs_hashmap_ensure(map, key, V)\
flecs_hashmap_ensure_(map, ECS_SIZEOF(*key), key, ECS_SIZEOF(V))
flecs_hashmap_ensure_(map, ECS_SIZEOF(*key), key, ECS_SIZEOF(V), ECS_ALIGNOF(V))

FLECS_DBG_API
void flecs_hashmap_set_(
Expand Down
Loading