diff --git a/da.h b/da.h index f54fbe6..35854b5 100644 --- a/da.h +++ b/da.h @@ -19,6 +19,8 @@ enum daFields { typedef void * dynarr; GenericReturn _daCreate(size_t initCapacity, size_t type, size_t size); 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 daResize(dynarr da); void _daPop(dynarr da, void * element); @@ -42,6 +44,8 @@ void daBzero(dynarr da); #define dynarr(type) type * #define daCreate(type, cap) _daCreate(cap, sizeof(type), 0) #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) #endif // DA_H_ @@ -116,7 +120,65 @@ GenericReturn _daPush(dynarr * da, void * item) memcpy((char *)(*da) + daSize(*da) * daType(*da), item, daType(*da)); *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) diff --git a/example.c b/example.c index 55eae8c..c1285f2 100644 --- a/example.c +++ b/example.c @@ -6,6 +6,24 @@ #define EHAN_IMPLEMENTATION #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) { printf("%hu\n", *((unsigned short *) item)); @@ -31,19 +49,16 @@ int main(void) dynarr(unsigned short) da = resultGeneric(dynarr(unsigned short), gr); - unsigned short x = 69; - daPush(da, x); - x = 42069; - daPush(da, x); - x = 1337; - daPush(da, x); - x = 34; - daPush(da, x); - x = 35; - daPush(da, x); - x = 1667; + daPushLit(da, 69); + daPushLit(da, 420); + daPushLit(da, 1337); + daPushLit(da, 34); + daPushLit(da, 35); + + daPushLit(da, 1667); + + unsigned short x = 0; - daPush(da, x); daPop(da, x); printf("x: %hu\n", x); @@ -57,22 +72,14 @@ int main(void) dynarr(char) da2 = daCreate(char, 1).val; - char y = 'H'; - daPush(da2, y); - y = 'i'; - daPush(da2, y); - y = ' '; - daPush(da2, y); - y = 'm'; - daPush(da2, y); - y = 'o'; - daPush(da2, y); - y = 'm'; - daPush(da2, y); - y = '?'; - daPush(da2, y); - y = '?'; - daPush(da2, y); + daPushLit(da2, 'H'); + daPushLit(da2, 'i'); + daPushLit(da2, ' '); + daPushLit(da2, 'm'); + daPushLit(da2, 'o'); + daPushLit(da2, 'm'); + daPushLit(da2, '?'); + daPushLit(da2, '?'); *(char *)daGetRef(da2, 6) = '!'; @@ -88,15 +95,16 @@ int main(void) dynarr(char *) da3 = daCreate(char *, 1).val; - const char * someString = "Test"; - for (size_t i = 0; i < 100000000; ++i) { - daPush(da3, someString); + for (size_t i = 0; i < 1000000; ++i) { + daPushStr(da3, "Test"); } char * str; daPop(da3, str); printf("%s\n", str); + +cleanup: daFree(da3); free(message); daFree(da2); @@ -104,3 +112,4 @@ int main(void) return 0; } +#endif