Addec daPushLit and daPushStr

This commit is contained in:
Maciej Samborski 2024-10-01 23:53:04 +02:00
parent ae489f5cc4
commit 228cf01d8c
2 changed files with 103 additions and 32 deletions

64
da.h
View File

@ -19,6 +19,8 @@ enum daFields {
typedef void * dynarr; typedef void * dynarr;
GenericReturn _daCreate(size_t initCapacity, size_t type, size_t size); GenericReturn _daCreate(size_t initCapacity, size_t type, size_t size);
GenericReturn _daPush(dynarr * da, void * item); GenericReturn _daPush(dynarr * da, void * item);
GenericReturn _daPushLit(dynarr * da, size_t item);
GenericReturn _daPushStr(dynarr * da, const char * str);
GenericReturn daCopy(dynarr da); GenericReturn daCopy(dynarr da);
GenericReturn daResize(dynarr da); GenericReturn daResize(dynarr da);
void _daPop(dynarr da, void * element); void _daPop(dynarr da, void * element);
@ -42,6 +44,8 @@ void daBzero(dynarr da);
#define dynarr(type) type * #define dynarr(type) type *
#define daCreate(type, cap) _daCreate(cap, sizeof(type), 0) #define daCreate(type, cap) _daCreate(cap, sizeof(type), 0)
#define daPush(da, item) _daPush((void *)&da, &item) #define daPush(da, item) _daPush((void *)&da, &item)
#define daPushLit(da, item) _daPushLit((void *)&da, item)
#define daPushStr(da, str) _daPushStr((void *)&da, str)
#define daPop(da, item) _daPop(da, &item) #define daPop(da, item) _daPop(da, &item)
#endif // DA_H_ #endif // DA_H_
@ -116,7 +120,65 @@ GenericReturn _daPush(dynarr * da, void * item)
memcpy((char *)(*da) + daSize(*da) * daType(*da), item, daType(*da)); memcpy((char *)(*da) + daSize(*da) * daType(*da), item, daType(*da));
*daField(*da, SIZE) += 1; *daField(*da, SIZE) += 1;
return ehanValue(*da); return ehanValue(0);
}
GenericReturn _daPushLit(dynarr * da, size_t item)
{
if (daSize(*da) >= daCap(*da))
{
GenericReturn temp = daResize(*da);
if (ehanCheck(temp))
return ehanError(resultError(temp));
*da = resultGeneric(dynarr, temp);
}
#TODO: Rewrite this
switch (daType(*da))
{
case 1: {
*((char *)*da + daType(*da) * daSize(*da)) = item;
} break;
case 2: {
*(short *)((char *)*da + daType(*da) * daSize(*da)) = item;
} break;
case 4: {
*(int *)((char *)*da + daType(*da) * daSize(*da)) = item;
} break;
case 8: {
*(long long int *)((char *)*da + daType(*da) * daSize(*da)) = item;
} break;
case 16: {
*(long double *)((char *)*da + daType(*da) * daSize(*da)) = item;
} break;
}
*daField(*da, SIZE) += 1;
return ehanValue(0);
}
GenericReturn _daPushStr(dynarr * da, const char * str)
{
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), &str, daType(*da));
*daField(*da, SIZE) += 1;
return ehanValue(0);
} }
void _daPop(dynarr da, void * elem) void _daPop(dynarr da, void * elem)

View File

@ -6,6 +6,24 @@
#define EHAN_IMPLEMENTATION #define EHAN_IMPLEMENTATION
#include "ehan.h" #include "ehan.h"
#if 0
int main(void)
{
dynarr(char *) da = daCreate(char *,4).val;
for (size_t i = 0; i < 1000; ++i) {
daPushStr(da, "hi");
}
for (size_t i = 0; i < daSize(da); ++i) {
ILog("%zu: %s\n", i, da[i]);
}
daFree(da);
return 0;
}
#else
void printDaU16(void * item) void printDaU16(void * item)
{ {
printf("%hu\n", *((unsigned short *) item)); printf("%hu\n", *((unsigned short *) item));
@ -31,19 +49,16 @@ int main(void)
dynarr(unsigned short) da = resultGeneric(dynarr(unsigned short), gr); dynarr(unsigned short) da = resultGeneric(dynarr(unsigned short), gr);
unsigned short x = 69; daPushLit(da, 69);
daPush(da, x); daPushLit(da, 420);
x = 42069; daPushLit(da, 1337);
daPush(da, x); daPushLit(da, 34);
x = 1337; daPushLit(da, 35);
daPush(da, x);
x = 34; daPushLit(da, 1667);
daPush(da, x);
x = 35; unsigned short x = 0;
daPush(da, x);
x = 1667;
daPush(da, x);
daPop(da, x); daPop(da, x);
printf("x: %hu\n", x); printf("x: %hu\n", x);
@ -57,22 +72,14 @@ int main(void)
dynarr(char) da2 = daCreate(char, 1).val; dynarr(char) da2 = daCreate(char, 1).val;
char y = 'H'; daPushLit(da2, 'H');
daPush(da2, y); daPushLit(da2, 'i');
y = 'i'; daPushLit(da2, ' ');
daPush(da2, y); daPushLit(da2, 'm');
y = ' '; daPushLit(da2, 'o');
daPush(da2, y); daPushLit(da2, 'm');
y = 'm'; daPushLit(da2, '?');
daPush(da2, y); daPushLit(da2, '?');
y = 'o';
daPush(da2, y);
y = 'm';
daPush(da2, y);
y = '?';
daPush(da2, y);
y = '?';
daPush(da2, y);
*(char *)daGetRef(da2, 6) = '!'; *(char *)daGetRef(da2, 6) = '!';
@ -88,15 +95,16 @@ int main(void)
dynarr(char *) da3 = daCreate(char *, 1).val; dynarr(char *) da3 = daCreate(char *, 1).val;
const char * someString = "Test"; for (size_t i = 0; i < 1000000; ++i) {
for (size_t i = 0; i < 100000000; ++i) { daPushStr(da3, "Test");
daPush(da3, someString);
} }
char * str; char * str;
daPop(da3, str); daPop(da3, str);
printf("%s\n", str); printf("%s\n", str);
cleanup:
daFree(da3); daFree(da3);
free(message); free(message);
daFree(da2); daFree(da2);
@ -104,3 +112,4 @@ int main(void)
return 0; return 0;
} }
#endif