diff --git a/core.h b/core.h index e5315b0..1dbf644 100644 --- a/core.h +++ b/core.h @@ -158,6 +158,8 @@ DefineList(void, Void); #define PushListZero(arena, type, size) (type){ .data=pushSizeFill(arena, ListElementSize(type)*(size), 0), .length=0, .capacity=(size) } #define PushFullList(arena, type, size) (type){ .data=pushSize(arena, ListElementSize(type)*size), .length=(size), .capacity=(size) } #define PushFullListZero(arena, type, size) (type){ .data=pushSizeFill(arena, ListElementSize(type)*(size), 0), .length=(size), .capacity=(size) } +void *__listcopyhelper__; +#define PushListCopy(arena, type, source) (__listcopyhelper__ = pushSize(arena, ListElementSize(type)*(source).length), memcpy(__listcopyhelper__, (source).data, sizeof((source).data[0])*(source).length), (type){ .data=__listcopyhelper__, .length=(source).length, .capacity=(source).length }) #define EmptyList() { NULL, 0, 0 } #define __ArrayAsList(array) { .data=(array), .length=ArrayCount(array), .capacity=ArrayCount(array) } @@ -183,13 +185,13 @@ inline VoidList __cloneList(Arena *arena, VoidList list, size_t underlyingSize) .length=list.length, }; } -#define CloneList(arena, type, list) (type)cloneList((arena), (VoidList)(list), (MemberSizeUnderlying(list))) +#define CloneList(arena, type, list) (type)cloneList((arena), (VoidList)(list), (sizeof((list).data[0])) #define ListAppendList(appendee, list)\ if ((appendee).capacity - (appendee).length >= list.length) {\ - memcpy((appendee).data + (appendee).length, (list).data, MemberSizeUnderlying(list)*(list).length);\ + memcpy((appendee).data + (appendee).length, (list).data, sizeof((list).data[0])*(list).length);\ (appendee).length += (list).length;\ } - + // Following two macros do not use pointers due to copying #define ListSlice(list, start, stop) {\