diff --git a/src/guf_id_pool.h b/src/guf_id_pool.h index 2c672be..1f9b739 100644 --- a/src/guf_id_pool.h +++ b/src/guf_id_pool.h @@ -13,13 +13,13 @@ #include "guf_common.h" #include "guf_assert.h" - #define GUF_ID_i32_NULL (-1) - #define GUF_ID_i16_NULL (-1) - #define GUF_ID_i8_NULL (-1) + #define GUF_ID_I32_NULL (-1) + #define GUF_ID_I16_NULL (-1) + #define GUF_ID_I8_NULL (-1) - #define GUF_ID_u32_NULL (UINT32_MAX) - #define GUF_ID_u16_NULL (UINT16_MAX) - #define GUF_ID_u8_NULL (UINT8_MAX) + #define GUF_ID_U32_NULL (GUF_UINT32_MAX) + #define GUF_ID_U16_NULL (GUF_UINT16_MAX) + #define GUF_ID_U8_NULL (GUF_UINT8_MAX) #endif /* @@ -34,49 +34,49 @@ #if defined(GUF_ID_POOL_i32) #undef GUF_ID_POOL_i32 - #define GUF_ID_POOL_T int32_t - #define GUF_ID_POOL_T_MAX INT32_MAX - #define GUF_ID_POOL_NULL GUF_ID_i32_NULL + #define GUF_ID_POOL_T int_least32_t + #define GUF_ID_POOL_T_MAX GUF_INT32_MAX + #define GUF_ID_POOL_NULL GUF_ID_I32_NULL #ifndef GUF_ID_POOL_NAME #define GUF_ID_POOL_NAME guf_idpool_i32 #endif #elif defined(GUF_ID_POOL_i16) #undef GUF_ID_POOL_i16 - #define GUF_ID_POOL_T int16_t - #define GUF_ID_POOL_T_MAX INT16_MAX - #define GUF_ID_POOL_NULL GUF_ID_i16_NULL + #define GUF_ID_POOL_T int_least16_t + #define GUF_ID_POOL_T_MAX GUF_INT16_MAX + #define GUF_ID_POOL_NULL GUF_ID_I16_NULL #ifndef GUF_ID_POOL_NAME #define GUF_ID_POOL_NAME guf_idpool_i16 #endif #elif defined(GUF_ID_POOL_i8) #undef GUF_ID_POOL_i8 - #define GUF_ID_POOL_T int8_t - #define GUF_ID_POOL_T_MAX INT8_MAX - #define GUF_ID_POOL_NULL GUF_ID_i8_NULL + #define GUF_ID_POOL_T int_least8_t + #define GUF_ID_POOL_T_MAX GUF_INT8_MAX + #define GUF_ID_POOL_NULL GUF_ID_I8_NULL #ifndef GUF_ID_POOL_NAME #define GUF_ID_POOL_NAME guf_idpool_i8 #endif #elif defined(GUF_ID_POOL_u32) #undef GUF_ID_POOL_u32 - #define GUF_ID_POOL_T uint32_t - #define GUF_ID_POOL_T_MAX (UINT32_MAX - 1) - #define GUF_ID_POOL_NULL GUF_ID_u32_NULL + #define GUF_ID_POOL_T uint_least32_t + #define GUF_ID_POOL_T_MAX (GUF_UINT32_MAX - 1) + #define GUF_ID_POOL_NULL GUF_ID_U32_NULL #ifndef GUF_ID_POOL_NAME #define GUF_ID_POOL_NAME guf_idpool_u32 #endif #elif defined(GUF_ID_POOL_u16) #undef GUF_ID_POOL_u16 - #define GUF_ID_POOL_T uint16_t - #define GUF_ID_POOL_T_MAX (UINT16_MAX - 1) - #define GUF_ID_POOL_NULL GUF_ID_u16_NULL + #define GUF_ID_POOL_T uint_least16_t + #define GUF_ID_POOL_T_MAX (GUF_UINT16_MAX - 1) + #define GUF_ID_POOL_NULL GUF_ID_U16_NULL #ifndef GUF_ID_POOL_NAME #define GUF_ID_POOL_NAME guf_idpool_u16 #endif #elif defined(GUF_ID_POOL_u8) #undef GUF_ID_POOL_u8 - #define GUF_ID_POOL_T uint8_t - #define GUF_ID_POOL_T_MAX (UINT8_MAX - 1) - #define GUF_ID_POOL_NULL GUF_ID_u8_NULL + #define GUF_ID_POOL_T uint_least8_t + #define GUF_ID_POOL_T_MAX (GUF_UINT8_MAX - 1) + #define GUF_ID_POOL_NULL GUF_ID_U8_NULL #ifndef GUF_ID_POOL_NAME #define GUF_ID_POOL_NAME guf_idpool_u8 #endif @@ -116,6 +116,9 @@ void GUF_CAT(GUF_ID_POOL_NAME, _try_free_id)(GUF_ID_POOL_NAME *pool, GUF_ID_POOL_T id, guf_err *err); void GUF_CAT(GUF_ID_POOL_NAME, _free_id)(GUF_ID_POOL_NAME *pool, GUF_ID_POOL_T id); + + GUF_ID_POOL_NAME ptrdiff_t GUF_CAT(GUF_ID_POOL_NAME, _num_allocated)(const GUF_ID_POOL_NAME *pool); // TODO: test + #endif #if defined(GUF_ID_POOL_IMPL) || defined(GUF_ID_POOL_IMPL_STATIC) @@ -137,6 +140,12 @@ static bool GUF_CAT(GUF_ID_POOL_NAME, _is_valid)(const GUF_ID_POOL_NAME *pool) return valid_next_id && valid_bufsize && GUF_CAT(GUF_ID_POOL_DBUF, _valid)(&pool->free_id_dbuf) && pool->free_id_dbuf.size >= 0; } +GUF_ID_POOL_NAME ptrdiff_t GUF_CAT(GUF_ID_POOL_NAME, _num_allocated)(const GUF_ID_POOL_NAME *pool) +{ + GUF_ASSERT((ptrdiff_t)pool->next_id >= free_id_dbuf.size) + return pool->next_id - free_id_dbuf.size; +} + GUF_ID_POOL_NAME *GUF_CAT(GUF_ID_POOL_NAME, _try_init)(GUF_ID_POOL_NAME *pool, ptrdiff_t initial_cap, guf_allocator *allocator, guf_err *err) { if (!pool) { diff --git a/src/guf_math.h b/src/guf_math.h index fa0f0ad..26e6226 100644 --- a/src/guf_math.h +++ b/src/guf_math.h @@ -222,16 +222,16 @@ static inline unsigned long long guf_uabs_long_long(long long x) {if (x >= 0 static inline size_t guf_uabs_ptrdiff_t(ptrdiff_t x) {if (x >= 0) {return x;} else if (x == PTRDIFF_MIN && -PTRDIFF_MAX != PTRDIFF_MIN) {return (size_t)PTRDIFF_MAX + 1u;} else {return -x;}} #if defined(UINT8_MAX) && defined(INT8_MAX) - static inline uint8_t guf_uabs_i8(int8_t x) {if (x >= 0) {return x;} else if (x == INT8_MIN && -INT8_MAX != INT8_MIN) {return (uint8_t)INT8_MAX + 1u;} else {return -x;}} + static inline uint8_t guf_uabs_i8(int8_t x) {if (x >= 0) {return x;} else if (x == INT8_MIN) {return (uint8_t)INT8_MAX + 1u;} else {return -x;}} #endif #if defined(UINT16_MAX) && defined(INT16_MAX) - static inline uint16_t guf_uabs_i16(int16_t x) {if (x >= 0) {return x;} else if (x == INT16_MIN && -INT16_MAX != INT16_MIN) {return (uint16_t)INT16_MAX + 1u;} else {return -x;}} + static inline uint16_t guf_uabs_i16(int16_t x) {if (x >= 0) {return x;} else if (x == INT16_MIN) {return (uint16_t)INT16_MAX + 1u;} else {return -x;}} #endif #if defined(UINT32_MAX) && defined(INT32_MAX) - static inline uint32_t guf_uabs_i32(int32_t x) {if (x >= 0) {return x;} else if (x == INT32_MIN && -INT32_MAX != INT32_MIN) {return (uint32_t)INT32_MAX + 1u;} else {return -x;}} + static inline uint32_t guf_uabs_i32(int32_t x) {if (x >= 0) {return x;} else if (x == INT32_MIN) {return (uint32_t)INT32_MAX + 1u;} else {return -x;}} #endif #if defined(UINT64_MAX) && defined(INT64_MAX) - static inline uint64_t guf_uabs_i64(int64_t x) {if (x >= 0) {return x;} else if (x == INT64_MIN && -INT64_MAX != INT64_MIN) {return (uint64_t)INT64_MAX + 1u;} else {return -x;}} + static inline uint64_t guf_uabs_i64(int64_t x) {if (x >= 0) {return x;} else if (x == INT64_MIN) {return (uint64_t)INT64_MAX + 1u;} else {return -x;}} #endif // absdiff functions with unsigned result (cannot fail) diff --git a/src/guf_str.h b/src/guf_str.h index 8e1d9a5..50e699e 100644 --- a/src/guf_str.h +++ b/src/guf_str.h @@ -68,7 +68,7 @@ typedef struct guf_str_tok_state { #define GUF_CSTR_TO_VIEW(CSTR) ((guf_str_view){.str = (CSTR), .len = (ptrdiff_t)strlen((CSTR))}) #define GUF_CSTR_LIT_TO_VIEW(CSTR) ((guf_str_view){.str = (CSTR), .len = (ptrdiff_t)sizeof((CSTR)) - 1}) #define GUF_STR_TO_VIEW(GUF_STR_PTR) ((guf_str_view){.str = guf_str_const_cstr((GUF_STR_PTR)), .len = (ptrdiff_t)guf_str_len((GUF_STR_PTR))}) -// TODO: #define GUF_CSTR_TO_READONLY_STR(CSTR) ((guf_str){.allocator = NULL, .data.lng.c_str = (CSTR), .data.lng.size = strlen(CSTR) + 1, .data.lng.capacity = 0}) +#define GUF_CSTR_TO_READONLY_STR(CSTR) ((guf_str){.allocator = NULL, .data.lng.c_str = (CSTR), .data.lng.size = strlen(CSTR) + 1, .data.lng.capacity = 0}) #define GUF_STR_UNINITIALISED (guf_str){.allocator = NULL, .data.lng.size = 0, .data.lng.capacity = 0, .data.lng.c_str = NULL} @@ -724,7 +724,7 @@ GUF_STR_KWRDS guf_str *guf_str_init_from_cstr(guf_str *str, const char* c_str, g GUF_STR_KWRDS guf_str *guf_str_init_readonly(guf_str *str, guf_str_view sv) { // #define GUF_STR_UNINITIALISED (guf_str){.allocator = NULL, .data.lng.size = 0, .data.lng.capacity = 0, .data.lng.c_str = NULL} - + // #define GUF_CSTR_TO_READONLY_STR(CSTR) ((guf_str){.allocator = NULL, .data.lng.c_str = (CSTR), .data.lng.size = strlen(CSTR) + 1, .data.lng.capacity = 0}) GUF_ASSERT(str); GUF_ASSERT(guf_str_view_is_valid(sv)); str->allocator = NULL; diff --git a/todo.txt b/todo.txt index f05acef..bd98bc3 100644 --- a/todo.txt +++ b/todo.txt @@ -1,4 +1,6 @@ -- fix readonly str +- rename int_fastN function to iN and delete the fixed-width ones? + +- fix readonly str/uninit ? - make guf_utf8_char 4 bytes (non-null terminated)