Add set_s_to_vector() API

This commit is contained in:
pelijah 2024-05-09 14:46:22 +03:00 committed by Anton Kochkov
parent e80c45038a
commit 61c8074cbf
2 changed files with 26 additions and 0 deletions

View file

@ -7,6 +7,7 @@
#include <rz_util/ht_sp.h>
#include <rz_util/ht_up.h>
#include <rz_vector.h>
#ifdef __cplusplus
extern "C" {
@ -19,6 +20,7 @@ RZ_API void set_s_add(RZ_NONNULL SetS *set, const char *str);
RZ_API bool set_s_contains(RZ_NONNULL SetS *set, const char *str);
RZ_API void set_s_delete(RZ_NONNULL SetS *set, const char *str);
RZ_API void set_s_free(RZ_NULLABLE SetS *set);
RZ_API RZ_OWN RzPVector /*<char *>*/ *set_s_to_vector(RZ_NONNULL SetS *set);
typedef HtUP SetU;

View file

@ -37,6 +37,30 @@ RZ_API void set_s_delete(RZ_NONNULL SetS *set, const char *str) {
ht_sp_delete(set, str);
}
static bool push_to_pvector(void *user, const char *k, RZ_UNUSED const void *v) {
RzPVector *vec = (RzPVector *)user;
return !!rz_pvector_push(vec, (void *)k);
}
/**
* \brief Create a vector from elements of hash set \p set
*
* If a hash set owns stored strings the ownership will be transferred.
*/
RZ_API RZ_OWN RzPVector /*<char *>*/ *set_s_to_vector(RZ_NONNULL SetS *set) {
rz_return_val_if_fail(set, NULL);
RzPVector *vec = rz_pvector_new(set->opt.finiKV ? free : NULL);
if (!vec || !rz_pvector_reserve(vec, set->count)) {
rz_pvector_free(vec);
return NULL;
}
ht_sp_foreach(set, push_to_pvector, vec);
set->opt.finiKV = NULL;
set->opt.finiKV_user = NULL;
return vec;
}
RZ_API void set_s_free(RZ_NULLABLE SetS *set) {
ht_sp_free((HtSP *)set);
}