diff --git a/src/guf_math.h b/src/guf_math.h index e65a316..445de81 100644 --- a/src/guf_math.h +++ b/src/guf_math.h @@ -5,6 +5,32 @@ #define GUF_PI 3.14159265358979323846264338327950288 #define GUF_PI_F32 3.14159265358979323846264338327950288f + +typedef struct guf_vec2_i32 { + int32_t x, y; +} guf_vec2_i32; + +typedef struct guf_vec2_f32 { + float x, y; +} guf_vec2_32; + +typedef struct guf_vec2_f64 { + double x, y; +} guf_vec2; + + +typedef struct guf_vec3_i32 { + int32_t x, y, z; +} guf_vec3_i32; + +typedef struct guf_vec3_f32 { + float x, y, z; +} guf_vec3_32; + +typedef struct guf_vec3_f64 { + double x, y, z; +} guf_vec3; + // Rotate left. static inline uint64_t guf_rotl_u64(uint64_t x, int k) {return (x << k) | (x >> (64 - k));} static inline uint32_t guf_rotl_u32(uint32_t x, int k) {return (x << k) | (x >> (32 - k));} diff --git a/src/guf_str.h b/src/guf_str.h index 880b07c..4005b64 100644 --- a/src/guf_str.h +++ b/src/guf_str.h @@ -40,6 +40,10 @@ typedef struct guf_str { #define GUF_CSTR_TO_VIEW(CSTR) ((guf_str_view){.str = (CSTR), .len = strlen((CSTR))}) #define GUF_STR_TO_VIEW(GUF_STR_PTR) ((guf_str_view){.str = guf_str_const_cstr((GUF_STR_PTR)), .len = guf_str_len((GUF_STR_PTR))}) #define GUF_CSTR_TO_READONLY_STR(CSTR) ((guf_str){.state = GUF_STR_STATE_VIEW, .allocator = NULL, .data.heap.c_str = CSTR, .data.heap.len = strlen(CSTR), .data.heap.capacity = 0}) +#ifdef __cplusplus + // Standard C++ does not have compound literals like C99... + #define GUF_CSTR_TO_VIEW_CPP(CSTR) guf_str_view{.str = (CSTR), .len = (ptrdiff_t)strlen(CSTR)} +#endif // Creation: GUF_STR_KWRDS guf_str *guf_str_init(guf_str *str, guf_str_view str_view); diff --git a/src/test/test_dict.hpp b/src/test/test_dict.hpp index 8a8c7d1..adcf5f6 100644 --- a/src/test/test_dict.hpp +++ b/src/test/test_dict.hpp @@ -198,23 +198,23 @@ struct DictSvToIntTest : public Test TEST_CHECK(word_cnt_dict.num_tombstones == 0); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == 0); - dict_sv_i32_insert_val_arg(&word_cnt_dict, {.str = "Hej", .len = (ptrdiff_t)strlen("Hej")}, (size_t)64, GUF_CPY_VALUE, GUF_CPY_VALUE); - dict_sv_i32_insert_val_arg(&word_cnt_dict, {.str = "verden!", .len = (ptrdiff_t)strlen("verden!")}, (size_t)128, GUF_CPY_VALUE, GUF_CPY_VALUE); - dict_sv_i32_insert_val_arg(&word_cnt_dict, {.str = "Flødeskum", .len = (ptrdiff_t)strlen("Flødeskum")}, (size_t)256, GUF_CPY_VALUE, GUF_CPY_VALUE); - dict_sv_i32_insert_val_arg(&word_cnt_dict, {.str = "med", .len = (ptrdiff_t)strlen("med")}, (size_t)512, GUF_CPY_VALUE, GUF_CPY_VALUE); - dict_sv_i32_insert_val_arg(&word_cnt_dict, {.str = "Faxe Kondi.", .len = (ptrdiff_t)strlen("Faxe Kondi.")}, (size_t)1024, GUF_CPY_VALUE, GUF_CPY_VALUE); + dict_sv_i32_insert_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Hej"), (size_t)64, GUF_CPY_VALUE, GUF_CPY_VALUE); + dict_sv_i32_insert_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("verden!"), (size_t)128, GUF_CPY_VALUE, GUF_CPY_VALUE); + dict_sv_i32_insert_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Flødeskum"), (size_t)256, GUF_CPY_VALUE, GUF_CPY_VALUE); + dict_sv_i32_insert_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("med"), (size_t)512, GUF_CPY_VALUE, GUF_CPY_VALUE); + dict_sv_i32_insert_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Faxe Kondi."), (size_t)1024, GUF_CPY_VALUE, GUF_CPY_VALUE); TEST_CHECK(dict_sv_i32_size(&word_cnt_dict) == 5); - int32_t *val = dict_sv_i32_at_val_arg(&word_cnt_dict, {.str = "Hej", .len = (ptrdiff_t)strlen("Hej")}); + int32_t *val = dict_sv_i32_at_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Hej")); TEST_CHECK(val && *val == 64); - val = dict_sv_i32_at_val_arg(&word_cnt_dict, {.str = "Flødeskum", .len = (ptrdiff_t)strlen("Flødeskum")}); + val = dict_sv_i32_at_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Flødeskum")); TEST_CHECK(val && *val == 256); - val = dict_sv_i32_at_val_arg(&word_cnt_dict, {.str = "Faxe Kondi.", .len = (ptrdiff_t)strlen("Faxe Kondi.")}); + val = dict_sv_i32_at_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Faxe Kondi.")); TEST_CHECK(val && *val == 1024); - val = dict_sv_i32_at_val_arg(&word_cnt_dict, {.str = "verden!", .len = (ptrdiff_t)strlen("verden!")}); + val = dict_sv_i32_at_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("verden!")); TEST_CHECK(val && *val == 128); - val = dict_sv_i32_at_val_arg(&word_cnt_dict, {.str = "med", .len = (ptrdiff_t)strlen("med")}); + val = dict_sv_i32_at_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("med")); TEST_CHECK(val && *val == 512); TEST_CHECK(word_cnt_dict.kv_elems.size == 5); @@ -225,78 +225,76 @@ struct DictSvToIntTest : public Test TEST_CHECK(word_cnt_dict.kv_elems.data[3].val == 512 && std::strcmp(word_cnt_dict.kv_elems.data[3].key.str, "med") == 0); TEST_CHECK(word_cnt_dict.kv_elems.data[4].val == 1024 && std::strcmp(word_cnt_dict.kv_elems.data[4].key.str, "Faxe Kondi.") == 0); - - ptrdiff_t del = 0; - const double load_fac_beg = dict_sv_i32_load_factor(&word_cnt_dict); const ptrdiff_t cap_begin = word_cnt_dict.kv_indices_cap; + ptrdiff_t del = 0; - TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, {.str = "Hej", .len = (ptrdiff_t)strlen("Hej")})); + TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Hej"))); TEST_CHECK(word_cnt_dict.num_tombstones == ++del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); for (ptrdiff_t n = 0; n < cap_begin + 128; ++n) { - dict_sv_i32_insert_val_arg(&word_cnt_dict, {.str = "Hej", .len = (ptrdiff_t)strlen("Hej")}, 64, GUF_CPY_VALUE, GUF_CPY_VALUE); + dict_sv_i32_insert_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Hej"), 64, GUF_CPY_VALUE, GUF_CPY_VALUE); TEST_CHECK(word_cnt_dict.num_tombstones == --del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); - TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, {.str = "Hej", .len = (ptrdiff_t)strlen("Hej")})); + TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Hej"))); TEST_CHECK(word_cnt_dict.num_tombstones == ++del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); } TEST_CHECK(word_cnt_dict.kv_indices_cap == cap_begin); - TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, {.str = "Faxe Kondi.", .len = (ptrdiff_t)strlen("Faxe Kondi.")})); + TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Faxe Kondi."))); TEST_CHECK(word_cnt_dict.num_tombstones == ++del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); for (ptrdiff_t n = 0; n < 256; ++n) { - dict_sv_i32_insert_val_arg(&word_cnt_dict, {.str = "Faxe Kondi.", .len = (ptrdiff_t)strlen("Faxe Kondi.")}, 128, GUF_CPY_VALUE, GUF_CPY_VALUE); + dict_sv_i32_insert_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Faxe Kondi."), 128, GUF_CPY_VALUE, GUF_CPY_VALUE); TEST_CHECK(word_cnt_dict.num_tombstones == --del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); - TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, {.str = "Faxe Kondi.", .len = (ptrdiff_t)strlen("Faxe Kondi.")})); + TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Faxe Kondi."))); TEST_CHECK(word_cnt_dict.num_tombstones == ++del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); } TEST_CHECK(word_cnt_dict.kv_indices_cap == cap_begin); - TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, {.str = "med", .len = (ptrdiff_t)strlen("med")})); + TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("med"))); TEST_CHECK(word_cnt_dict.num_tombstones == ++del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); - for (ptrdiff_t n = 0; n < 512; ++n) { - dict_sv_i32_insert_val_arg(&word_cnt_dict, {.str = "med", .len = (ptrdiff_t)strlen("med")}, 256, GUF_CPY_VALUE, GUF_CPY_VALUE); + for (ptrdiff_t n = 0; n < 512 + cap_begin; ++n) { + dict_sv_i32_insert_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("med"), 256, GUF_CPY_VALUE, GUF_CPY_VALUE); TEST_CHECK(word_cnt_dict.num_tombstones == --del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); - TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, {.str = "med", .len = (ptrdiff_t)strlen("med")})); + TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("med"))); TEST_CHECK(word_cnt_dict.num_tombstones == ++del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); } TEST_CHECK(word_cnt_dict.kv_indices_cap == cap_begin); - TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, {.str = "Flødeskum", .len = (ptrdiff_t)strlen("Flødeskum")})); + TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Flødeskum"))); TEST_CHECK(word_cnt_dict.num_tombstones == ++del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); for (ptrdiff_t n = 0; n < 71; ++n) { - dict_sv_i32_insert_val_arg(&word_cnt_dict, {.str = "Flødeskum", .len = (ptrdiff_t)strlen("Flødeskum")}, 512, GUF_CPY_VALUE, GUF_CPY_VALUE); + dict_sv_i32_insert_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Flødeskum"), 512, GUF_CPY_VALUE, GUF_CPY_VALUE); TEST_CHECK(word_cnt_dict.num_tombstones == --del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); - TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, {.str = "Flødeskum", .len = (ptrdiff_t)strlen("Flødeskum")})); + TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("Flødeskum"))); TEST_CHECK(word_cnt_dict.num_tombstones == ++del); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == load_fac_beg); } TEST_CHECK(word_cnt_dict.kv_indices_cap == cap_begin); - TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, {.str = "verden!", .len = (ptrdiff_t)strlen("verden!")})); + TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("verden!"))); TEST_CHECK(word_cnt_dict.num_tombstones == 0); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == 0); for (ptrdiff_t n = 0; n < 201; ++n) { - dict_sv_i32_insert_val_arg(&word_cnt_dict, {.str = "verden!", .len = (ptrdiff_t)strlen("verden!")}, 128, GUF_CPY_VALUE, GUF_CPY_VALUE); + dict_sv_i32_insert_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("verden!"), 128, GUF_CPY_VALUE, GUF_CPY_VALUE); TEST_CHECK(word_cnt_dict.num_tombstones == 0); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) > 0); - TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, {.str = "verden!", .len = (ptrdiff_t)strlen("verden!")})); + TEST_CHECK(dict_sv_i32_erase_val_arg(&word_cnt_dict, GUF_CSTR_TO_VIEW_CPP("verden!"))); TEST_CHECK(word_cnt_dict.num_tombstones == 0); TEST_CHECK(dict_sv_i32_load_factor(&word_cnt_dict) == 0); } @@ -305,7 +303,6 @@ struct DictSvToIntTest : public Test TEST_CHECK(word_cnt_dict.kv_elems.size == 0); TEST_CHECK(dict_sv_i32_size(&word_cnt_dict) == 0); - dict_sv_i32_free(&word_cnt_dict, NULL); bool dbuf_null = !word_cnt_dict.kv_elems.data && !word_cnt_dict.kv_elems.allocator && !word_cnt_dict.kv_elems.capacity && !word_cnt_dict.kv_elems.size; TEST_CHECK(dbuf_null && !word_cnt_dict.kv_indices && !word_cnt_dict.kv_indices_cap && !word_cnt_dict.max_probelen && !word_cnt_dict.num_tombstones);