diff --git a/example.c b/example.c index 2b05600..ff2f0fd 100644 --- a/example.c +++ b/example.c @@ -3,13 +3,6 @@ #define LL_IMPLEMENTATION #include "ll.h" -#define llPrint(type, format, list) do { \ - for (size_t i = 0; i < llLen(list); ++i) \ - { \ - printf(format"\n", llGet(type, list, i)); \ - } \ -} while (0) - int main(void) { llList list = llCreateList(); @@ -26,9 +19,21 @@ int main(void) float * y = llGetRef(float, list, 1); printf("*y: %f\n", *y); + llInsert(list, 3, 42.0f); + printf("%zu\n", llLen(list)); - llPrint(int, "%d", list); + for (size_t i = 0; i < llLen(list); ++i) + { + printf("%f\n", llGet(float, list, i)); + } + + printf("\n"); + + for (size_t i = 0; i < llLen(list); ++i) + { + printf("%d\n", llGet(int, list, i)); + } llList list2 = llCreateList(); diff --git a/ll.h b/ll.h index 32d2c71..fd91c34 100644 --- a/ll.h +++ b/ll.h @@ -24,16 +24,34 @@ void _llAppend(llList * list, void * value); llList * _llPrepend(llList * list, void * value); llList * _llInsert(llList * list, size_t id, void * value); llList * _llDelete(llList * list, size_t id); -size_t _llGet(llList * list, size_t id); +void * _llGet(llList * list, size_t id); void * _llGetRef(llList * list, size_t id); size_t llLen(llList list); -#define llAppend(list, value) _llAppend(&list, (void *)(uintptr_t) value) -#define llPrepend(list, value) list = *_llPrepend(&list, (void *)(uintptr_t) value) -#define llInsert(list, id, value) list = *_llInsert(&list, id, (void *)(uintptr_t) value) +#define llAppend(list, value) \ + do { \ + typeof(value) v1 = value; \ + void * v2 = (void *)*(uintptr_t *) &v1; \ + _llAppend(&list, v2); \ + } while (0) + +#define llPrepend(list, value) \ + do { \ + typeof(value) v1 = value; \ + void * v2 = (void *)*(uintptr_t *) &v1; \ + list = *_llPrepend(&list, v2); \ + } while (0) + +#define llInsert(list, id, value) \ + do { \ + typeof(value) v1 = value; \ + void * v2 = (void *)*(uintptr_t *) &v1; \ + list = *_llInsert(&list, id, v2); \ + } while (0) + #define llDelete(list, id) list = *_llDelete(&list, id) -#define llGet(type, list, id) (type) _llGet(&list, id) #define llGetRef(type, list, id) (type *) (_llGetRef(&list, id)) +#define llGet(type, list, id) *(type *) (_llGetRef(&list, id)) #define llCreateNode(value) _llCreateNode((void *)(uintptr_t) value) #ifdef LL_IMPLEMENTATION @@ -168,26 +186,6 @@ llList * _llDelete(llList * list, size_t id) return list; } -size_t _llGet(llList * list, size_t id) -{ - llNode * node = list->nodes; - - while (id > 0) - { - if (node->next == NULL) - { - fprintf(stderr, "ERROR: Index out of bounds\n"); - llFree(list); - exit(1); - } - - node = node->next; - --id; - } - - return (size_t) node->data; -} - //Todo fix with floating points void * _llGetRef(llList * list, size_t id) {