From 29a5b222868f6b6efd01b313971b5e8b85052ab4 Mon Sep 17 00:00:00 2001 From: timerix Date: Fri, 20 Jan 2023 19:57:37 +0600 Subject: [PATCH] some Array improvements --- src/Array/Array.c | 10 ++++++++++ src/Array/Array.h | 4 ++++ src/Array/Array_declare.h | 2 +- src/String/string.c | 1 + src/String/string.h | 2 ++ src/base/endian.h | 10 ++++++++++ src/base/type_system/init.c | 27 ++++++++++++++------------- 7 files changed, 42 insertions(+), 14 deletions(-) diff --git a/src/Array/Array.c b/src/Array/Array.c index c669459..f7d4030 100644 --- a/src/Array/Array.c +++ b/src/Array/Array.c @@ -14,3 +14,13 @@ Array_define(int64) Array_define(uint64) Array_define(Unitype) + +void Array_Unitype_free_(Array_Unitype* array, bool freeMembers){ + if(freeMembers) for (int32 i; ilength; i++) + Unitype_free(array->values[i]); + if(array->allocatedOnHeap) + free(array->values); +} + +void __Array_Unitype_free_(void* ar) +{ Array_Unitype_free_(ar, true); } diff --git a/src/Array/Array.h b/src/Array/Array.h index 016d0ed..5c8f388 100644 --- a/src/Array/Array.h +++ b/src/Array/Array.h @@ -22,6 +22,10 @@ Array_declare(uint64) Array_declare(Unitype) +/// use this function instead of auto generated +void Array_Unitype_free_(Array_Unitype* array, bool freeMembers); +void __Array_Unitype_free_(void* ar); + #if __cplusplus } #endif \ No newline at end of file diff --git a/src/Array/Array_declare.h b/src/Array/Array_declare.h index e7139b3..2c7a37f 100644 --- a/src/Array/Array_declare.h +++ b/src/Array/Array_declare.h @@ -31,7 +31,7 @@ static inline Array_##type Array_##type##_fromBuffer(type* buffer, uint32 buffer };\ }\ \ -static inline void Array_##type##_freeValues(Array_##type* array){\ +static inline void Array_##type##_free(Array_##type* array){\ if(array->allocatedOnHeap)\ free(array->values);\ } diff --git a/src/String/string.c b/src/String/string.c index 81d61de..9864fb1 100644 --- a/src/String/string.c +++ b/src/String/string.c @@ -1,6 +1,7 @@ #include "string.h" ktid_define(string); +Array_define(string); // copies str content to new char pointer value (adding '\0' at the end) char* string_extract(string str){ diff --git a/src/String/string.h b/src/String/string.h index 0b8716e..e934376 100644 --- a/src/String/string.h +++ b/src/String/string.h @@ -5,6 +5,7 @@ extern "C" { #endif #include "../base/base.h" +#include "../Array/Array.h" // my fixed length string struct // doesn't store '\0' at the end @@ -13,6 +14,7 @@ typedef struct string{ uint64 length; // amount of chars in ptr value } string; ktid_declare(string); +Array_declare(string); static const string stringNull={NULL,0}; diff --git a/src/base/endian.h b/src/base/endian.h index 9d9d1e7..5fb2603 100644 --- a/src/base/endian.h +++ b/src/base/endian.h @@ -1,3 +1,9 @@ +#pragma once + +#if __cplusplus +extern "C" { +#endif + #include "std.h" PACK_ENUM(Endian, @@ -7,3 +13,7 @@ PACK_ENUM(Endian, ); Endian getEndian(); + +#if __cplusplus +} +#endif diff --git a/src/base/type_system/init.c b/src/base/type_system/init.c index 4f1a2fd..0c85ce9 100644 --- a/src/base/type_system/init.c +++ b/src/base/type_system/init.c @@ -29,18 +29,18 @@ void ktDescriptors_initKerepTypes(){ // base type arrays - kt_register(Array_char, (freeMembers_t)Array_char_freeValues, NULL); - kt_register(Array_bool, (freeMembers_t)Array_bool_freeValues, NULL); - kt_register(Array_float32, (freeMembers_t)Array_float32_freeValues, NULL); - kt_register(Array_float64, (freeMembers_t)Array_float64_freeValues, NULL); - kt_register(Array_int8, (freeMembers_t)Array_int8_freeValues, NULL); - kt_register(Array_uint8, (freeMembers_t)Array_uint8_freeValues, NULL); - kt_register(Array_int16, (freeMembers_t)Array_int16_freeValues, NULL); - kt_register(Array_uint16, (freeMembers_t)Array_uint16_freeValues, NULL); - kt_register(Array_int32, (freeMembers_t)Array_int32_freeValues, NULL); - kt_register(Array_uint32, (freeMembers_t)Array_uint32_freeValues, NULL); - kt_register(Array_int64, (freeMembers_t)Array_int64_freeValues, NULL); - kt_register(Array_uint64, (freeMembers_t)Array_uint64_freeValues, NULL); + kt_register(Array_char, (freeMembers_t)Array_char_free, NULL); + kt_register(Array_bool, (freeMembers_t)Array_bool_free, NULL); + kt_register(Array_float32, (freeMembers_t)Array_float32_free, NULL); + kt_register(Array_float64, (freeMembers_t)Array_float64_free, NULL); + kt_register(Array_int8, (freeMembers_t)Array_int8_free, NULL); + kt_register(Array_uint8, (freeMembers_t)Array_uint8_free, NULL); + kt_register(Array_int16, (freeMembers_t)Array_int16_free, NULL); + kt_register(Array_uint16, (freeMembers_t)Array_uint16_free, NULL); + kt_register(Array_int32, (freeMembers_t)Array_int32_free, NULL); + kt_register(Array_uint32, (freeMembers_t)Array_uint32_free, NULL); + kt_register(Array_int64, (freeMembers_t)Array_int64_free, NULL); + kt_register(Array_uint64, (freeMembers_t)Array_uint64_free, NULL); // base type autoarrs kt_register(Autoarr_char, ____Autoarr_free_char, NULL); @@ -58,7 +58,7 @@ void ktDescriptors_initKerepTypes(){ // Unitype kt_register(Unitype, __UnitypePtr_free, NULL); - kt_register(Array_Unitype, (freeMembers_t)Array_Unitype_freeValues, NULL); + kt_register(Array_Unitype, __Array_Unitype_free_, NULL); kt_register(Autoarr_Unitype, ____Autoarr_free_Unitype_, NULL); // replacing autogenerated freear() function to custom Autoarr_Unitype* _uar=Autoarr_create(Unitype, 1, 1); @@ -81,6 +81,7 @@ void ktDescriptors_initKerepTypes(){ // string kt_register(string, NULL, NULL); + kt_register(Array_string, (freeMembers_t)Array_string_free, NULL); kt_register(Autoarr_string, ____Autoarr_free_string, NULL); // StringBuilder kt_register(StringBuilder, __StringBuilder_free, NULL);