Skip to content

Commit

Permalink
feat: add use elem f in svec
Browse files Browse the repository at this point in the history
  • Loading branch information
jean-roland committed Nov 2, 2024
1 parent 23ef6ab commit b806bc6
Show file tree
Hide file tree
Showing 6 changed files with 39 additions and 37 deletions.
2 changes: 1 addition & 1 deletion include/zenoh-pico/collections/bytes.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ inline size_t _z_arc_slice_size(const _z_arc_slice_t *s) {
return sizeof(_z_arc_slice_t);
}
_Z_ELEM_DEFINE(_z_arc_slice, _z_arc_slice_t, _z_arc_slice_size, _z_arc_slice_drop, _z_arc_slice_copy, _z_arc_slice_move)
_Z_SVEC_DEFINE(_z_arc_slice, _z_arc_slice_t)
_Z_SVEC_DEFINE(_z_arc_slice, _z_arc_slice_t, true)

/*-------- Bytes --------*/
/**
Expand Down
2 changes: 1 addition & 1 deletion include/zenoh-pico/collections/string.h
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ _z_string_t _z_string_convert_bytes(const _z_slice_t *bs);
_z_string_t _z_string_preallocate(const size_t len);

_Z_ELEM_DEFINE(_z_string, _z_string_t, _z_string_len, _z_string_clear, _z_string_copy, _z_string_move)
_Z_SVEC_DEFINE(_z_string, _z_string_t)
_Z_SVEC_DEFINE(_z_string, _z_string_t, true)
_Z_LIST_DEFINE(_z_string, _z_string_t)
_Z_INT_MAP_DEFINE(_z_string, _z_string_t)

Expand Down
20 changes: 11 additions & 9 deletions include/zenoh-pico/collections/vec.h
Original file line number Diff line number Diff line change
Expand Up @@ -82,35 +82,37 @@ typedef struct {
static inline _z_svec_t _z_svec_null(void) { return (_z_svec_t){0}; }
static inline _z_svec_t _z_svec_alias(const _z_svec_t *src) { return *src; }
_z_svec_t _z_svec_make(size_t capacity, size_t element_size);
z_result_t _z_svec_copy(_z_svec_t *dst, const _z_svec_t *src, z_element_copy_f copy, size_t element_size);
z_result_t _z_svec_copy(_z_svec_t *dst, const _z_svec_t *src, z_element_copy_f copy, size_t element_size,
bool use_elem_f);
void _z_svec_move(_z_svec_t *dst, _z_svec_t *src);

size_t _z_svec_len(const _z_svec_t *v);
bool _z_svec_is_empty(const _z_svec_t *v);

z_result_t _z_svec_expand(_z_svec_t *v, z_element_move_f move, size_t element_size);
z_result_t _z_svec_append(_z_svec_t *v, const void *e, z_element_move_f m, size_t element_size);
z_result_t _z_svec_expand(_z_svec_t *v, z_element_move_f move, size_t element_size, bool use_elem_f);
z_result_t _z_svec_append(_z_svec_t *v, const void *e, z_element_move_f m, size_t element_size, bool use_elem_f);
void *_z_svec_get(const _z_svec_t *v, size_t pos, size_t element_size);
void *_z_svec_get_mut(_z_svec_t *v, size_t i, size_t element_size);
void _z_svec_set(_z_svec_t *sv, size_t pos, void *e, z_element_clear_f f, size_t element_size);
void _z_svec_remove(_z_svec_t *sv, size_t pos, z_element_clear_f f, z_element_move_f m, size_t element_size);
void _z_svec_remove(_z_svec_t *sv, size_t pos, z_element_clear_f f, z_element_move_f m, size_t element_size,
bool use_elem_f);

void _z_svec_reset(_z_svec_t *v, z_element_clear_f f, size_t element_size);
void _z_svec_clear(_z_svec_t *v, z_element_clear_f f, size_t element_size);
void _z_svec_free(_z_svec_t **v, z_element_clear_f f, size_t element_size);
void _z_svec_release(_z_svec_t *v);

#define _Z_SVEC_DEFINE(name, type) \
#define _Z_SVEC_DEFINE(name, type, use_elem_f) \
typedef _z_svec_t name##_svec_t; \
static inline name##_svec_t name##_svec_null(void) { return _z_svec_null(); } \
static inline name##_svec_t name##_svec_make(size_t capacity) { return _z_svec_make(capacity, sizeof(type)); } \
static inline size_t name##_svec_len(const name##_svec_t *v) { return _z_svec_len(v); } \
static inline bool name##_svec_is_empty(const name##_svec_t *v) { return _z_svec_is_empty(v); } \
static inline z_result_t name##_svec_expand(name##_svec_t *v) { \
return _z_svec_expand(v, name##_elem_move, sizeof(type)); \
return _z_svec_expand(v, name##_elem_move, sizeof(type), use_elem_f); \
} \
static inline z_result_t name##_svec_append(name##_svec_t *v, const type *e) { \
return _z_svec_append(v, e, name##_elem_move, sizeof(type)); \
return _z_svec_append(v, e, name##_elem_move, sizeof(type), use_elem_f); \
} \
static inline type *name##_svec_get(const name##_svec_t *v, size_t pos) { \
return (type *)_z_svec_get(v, pos, sizeof(type)); \
Expand All @@ -122,10 +124,10 @@ void _z_svec_release(_z_svec_t *v);
_z_svec_set(v, pos, e, name##_elem_clear, sizeof(type)); \
} \
static inline void name##_svec_remove(name##_svec_t *v, size_t pos) { \
_z_svec_remove(v, pos, name##_elem_clear, name##_elem_move, sizeof(type)); \
_z_svec_remove(v, pos, name##_elem_clear, name##_elem_move, sizeof(type), use_elem_f); \
} \
static inline z_result_t name##_svec_copy(name##_svec_t *dst, const name##_svec_t *src) { \
return _z_svec_copy(dst, src, name##_elem_copy, sizeof(type)); \
return _z_svec_copy(dst, src, name##_elem_copy, sizeof(type), use_elem_f); \
} \
static inline name##_svec_t name##_svec_alias(const name##_svec_t *v) { return _z_svec_alias(v); } \
static inline void name##_svec_move(name##_svec_t *dst, name##_svec_t *src) { _z_svec_move(dst, src); } \
Expand Down
2 changes: 1 addition & 1 deletion include/zenoh-pico/protocol/definitions/network.h
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ void _z_n_msg_free(_z_network_message_t **m);
inline static void _z_msg_clear(_z_zenoh_message_t *msg) { _z_n_msg_clear(msg); }
inline static void _z_msg_free(_z_zenoh_message_t **msg) { _z_n_msg_free(msg); }
_Z_ELEM_DEFINE(_z_network_message, _z_network_message_t, _z_noop_size, _z_n_msg_clear, _z_noop_copy, _z_noop_move)
_Z_VEC_DEFINE(_z_network_message, _z_network_message_t)
_Z_SVEC_DEFINE(_z_network_message, _z_network_message_t, false)

void _z_msg_fix_mapping(_z_zenoh_message_t *msg, uint16_t mapping);
_z_network_message_t _z_msg_make_query(_Z_MOVE(_z_keyexpr_t) key, _Z_MOVE(_z_slice_t) parameters, _z_zint_t qid,
Expand Down
2 changes: 1 addition & 1 deletion include/zenoh-pico/session/subscription.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ typedef struct {
} _z_subscription_infos_t;

_Z_ELEM_DEFINE(_z_subscription_infos, _z_subscription_infos_t, _z_noop_size, _z_noop_clear, _z_noop_copy, _z_noop_move)
_Z_SVEC_DEFINE(_z_subscription_infos, _z_subscription_infos_t)
_Z_SVEC_DEFINE(_z_subscription_infos, _z_subscription_infos_t, false)

typedef struct {
_z_keyexpr_t ke_in;
Expand Down
48 changes: 24 additions & 24 deletions src/collections/vec.c
Original file line number Diff line number Diff line change
Expand Up @@ -145,27 +145,16 @@ _z_svec_t _z_svec_make(size_t capacity, size_t element_size) {
return v;
}

void __z_svec_copy_inner(void *dst, const void *src, z_element_copy_f copy, size_t num_elements, size_t element_size) {
if (copy == _z_noop_copy) {
memcpy(dst, src, num_elements * element_size);
} else {
size_t offset = 0;
for (size_t i = 0; i < num_elements; i++) {
copy((uint8_t *)dst + offset, (uint8_t *)src + offset);
offset += element_size;
}
}
}

void __z_svec_move_inner(void *dst, void *src, z_element_move_f move, size_t num_elements, size_t element_size) {
if (move == _z_noop_move) {
memcpy(dst, src, num_elements * element_size);
} else {
static inline void __z_svec_move_inner(void *dst, void *src, z_element_move_f move, size_t num_elements,
size_t element_size, bool use_elem_f) {
if (use_elem_f) {
size_t offset = 0;
for (size_t i = 0; i < num_elements; i++) {
move((uint8_t *)dst + offset, (uint8_t *)src + offset);
offset += element_size;
}
} else {
memcpy(dst, src, num_elements * element_size);
}
}

Expand All @@ -174,7 +163,8 @@ void _z_svec_move(_z_svec_t *dst, _z_svec_t *src) {
*src = _z_svec_null();
}

z_result_t _z_svec_copy(_z_svec_t *dst, const _z_svec_t *src, z_element_copy_f copy, size_t element_size) {
z_result_t _z_svec_copy(_z_svec_t *dst, const _z_svec_t *src, z_element_copy_f copy, size_t element_size,
bool use_elem_f) {
dst->_capacity = 0;
dst->_len = 0;
dst->_val = z_malloc(element_size * src->_capacity);
Expand All @@ -183,7 +173,16 @@ z_result_t _z_svec_copy(_z_svec_t *dst, const _z_svec_t *src, z_element_copy_f c
}
dst->_capacity = src->_capacity;
dst->_len = src->_len;
__z_svec_copy_inner(dst->_val, src->_val, copy, src->_len, element_size);
// Copy data to new vector
if (use_elem_f) {
size_t offset = 0;
for (size_t i = 0; i < src->_len; i++) {
copy((uint8_t *)dst->_val + offset, (uint8_t *)src->_val + offset);
offset += element_size;
}
} else {
memcpy(dst->_val, src->_val, src->_len * element_size);
}
return _Z_RES_OK;
}

Expand Down Expand Up @@ -226,14 +225,14 @@ size_t _z_svec_len(const _z_svec_t *v) { return v->_len; }

bool _z_svec_is_empty(const _z_svec_t *v) { return v->_len == 0; }

z_result_t _z_svec_expand(_z_svec_t *v, z_element_move_f move, size_t element_size) {
z_result_t _z_svec_expand(_z_svec_t *v, z_element_move_f move, size_t element_size, bool use_elem_f) {
// Allocate a new vector
size_t _capacity = v->_capacity == 0 ? 1 : (v->_capacity << 1);
void *_val = (void *)z_malloc(_capacity * element_size);
if (_val == NULL) {
return _Z_ERR_SYSTEM_OUT_OF_MEMORY;
}
__z_svec_move_inner(_val, v->_val, move, v->_len, element_size);
__z_svec_move_inner(_val, v->_val, move, v->_len, element_size, use_elem_f);
// Free the old data
z_free(v->_val);
// Update the current vector
Expand All @@ -242,9 +241,9 @@ z_result_t _z_svec_expand(_z_svec_t *v, z_element_move_f move, size_t element_si
return _Z_RES_OK;
}

z_result_t _z_svec_append(_z_svec_t *v, const void *e, z_element_move_f move, size_t element_size) {
z_result_t _z_svec_append(_z_svec_t *v, const void *e, z_element_move_f move, size_t element_size, bool use_elem_f) {
if (v->_len == v->_capacity) {
_Z_RETURN_IF_ERR(_z_svec_expand(v, move, element_size));
_Z_RETURN_IF_ERR(_z_svec_expand(v, move, element_size, use_elem_f));
}
// Append element
memcpy((uint8_t *)v->_val + v->_len * element_size, e, element_size);
Expand All @@ -265,11 +264,12 @@ void _z_svec_set(_z_svec_t *v, size_t i, void *e, z_element_clear_f clear, size_
memcpy((uint8_t *)v->_val + i * element_size, e, element_size);
}

void _z_svec_remove(_z_svec_t *v, size_t pos, z_element_clear_f clear, z_element_move_f move, size_t element_size) {
void _z_svec_remove(_z_svec_t *v, size_t pos, z_element_clear_f clear, z_element_move_f move, size_t element_size,
bool use_elem_f) {
assert(pos < v->_len);
clear((uint8_t *)v->_val + pos * element_size);
__z_svec_move_inner((uint8_t *)v->_val + pos * element_size, (uint8_t *)v->_val + (pos + 1) * element_size, move,
(v->_len - pos - 1) * element_size, element_size);
(v->_len - pos - 1) * element_size, element_size, use_elem_f);

v->_len--;
}

0 comments on commit b806bc6

Please sign in to comment.