From df957fa0783f65a1702db912a9d28642b2fd388e Mon Sep 17 00:00:00 2001 From: Maciej Samborski Date: Sat, 12 Oct 2024 15:20:13 +0200 Subject: [PATCH] Fixed floating point number support --- da.h | 56 +++++++++++++++++++++++++++++++++++++------------------ example.c | 22 ++++++++++++++++++++++ 2 files changed, 60 insertions(+), 18 deletions(-) diff --git a/da.h b/da.h index 0775089..a3868df 100644 --- a/da.h +++ b/da.h @@ -19,6 +19,7 @@ enum daFields { typedef void * dynarr; GenericReturn _daCreate(size_t initCapacity, size_t type, size_t size); GenericReturn _daPushLit(dynarr * da, size_t item); +GenericReturn _daPushFlt(dynarr * da, float item); GenericReturn _daPushStr(dynarr * da, const char * str); GenericReturn daCopy(dynarr da); GenericReturn daResize(dynarr da); @@ -44,9 +45,12 @@ void daBzero(dynarr da); #define daCreate(type, cap) _daCreate(cap, sizeof(type), 0) #define daPush(da, item) _Generic((item), \ char *: _daPushStr, \ + float: _daPushFlt, \ + double: _daPushFlt, \ default: _daPushLit \ )((void *)&da, item) #define daPop(da, item) _daPop(da, &item) +#define daGet(da, index) (da[index]) #endif // DA_H_ @@ -106,23 +110,6 @@ GenericReturn daResize(dynarr da) return ehanValue(newArr); } -GenericReturn _daPush(dynarr * da, void * item) -{ - if (daSize(*da) >= daCap(*da)) - { - GenericReturn temp = daResize(*da); - - if (ehanCheck(temp)) - return ehanError(resultError(temp)); - - *da = resultGeneric(dynarr, temp); - } - - memcpy((char *)(*da) + daSize(*da) * daType(*da), item, daType(*da)); - *daField(*da, SIZE) += 1; - return ehanValue(0); -} - GenericReturn _daPushLit(dynarr * da, size_t item) { if (daSize(*da) >= daCap(*da)) @@ -135,7 +122,6 @@ GenericReturn _daPushLit(dynarr * da, size_t item) *da = resultGeneric(dynarr, temp); } - //TODO: Rewrite this switch (daType(*da)) { case 1: { @@ -154,10 +140,44 @@ GenericReturn _daPushLit(dynarr * da, size_t item) *(long long int *)((char *)*da + daType(*da) * daSize(*da)) = item; } break; + default: + return ehanError("Wrong type size"); + } + *daField(*da, SIZE) += 1; + + return ehanValue(0); +} + +GenericReturn _daPushFlt(dynarr * da, float item) +{ + if (daSize(*da) >= daCap(*da)) + { + GenericReturn temp = daResize(*da); + + if (ehanCheck(temp)) + return ehanError(resultError(temp)); + + *da = resultGeneric(dynarr, temp); + } + + switch (daType(*da)) + { + case 4: { + *(float *)((char *)*da + daType(*da) * daSize(*da)) = item; + } break; + + case 8: { + *(double *)((char *)*da + daType(*da) * daSize(*da)) = item; + } break; + case 16: { *(long double *)((char *)*da + daType(*da) * daSize(*da)) = item; } break; + + default: + return ehanError("Wrong type size"); } + *daField(*da, SIZE) += 1; return ehanValue(0); diff --git a/example.c b/example.c index ff50085..cac68d0 100644 --- a/example.c +++ b/example.c @@ -1,3 +1,4 @@ +#include #define DA_IMPLEMENTATION #include "da.h" @@ -101,8 +102,29 @@ int main(void) daPop(da3, str); printf("%s\n", str); + printf("----------\n"); + printf("DA4\n"); + printf("----------\n"); + + dynarr(double) da4 = daCreate(double, 1).val; + + daPush(da4, 69.692343); + printf("float: %F\n", da4[0]); + + printf("----------\n"); + printf("DA5\n"); + printf("----------\n"); + + dynarr(char *) da5 = daCreate(char *, 1).val; + + daPush(da5, "Hello, "); + daPush(da5, "World!"); + + DLog("%s%s\n", da5[0], da5[1]); cleanup: + daFree(da5); + daFree(da4); daFree(da3); free(message); daFree(da2);