| @@ -44,9 +44,7 @@ typedef struct string string; | |||
| #define ArrayCount(arr) (sizeof(arr) / sizeof((arr)[0])) | |||
| #define MemberSize(type, memberName) sizeof(((type *)0)->memberName) | |||
| #define MemberType(type, memberName) typeof(((type *)0)->memberName) | |||
| #define MemberSizeUnderlying(type, memberName) sizeof(*((type *)0)->memberName) | |||
| #define MemberTypeUnderlying(type, memberName) typeof(*((type *)0)->memberName) | |||
| // ### Arenas ### | |||
| typedef struct { | |||
| @@ -139,27 +137,32 @@ inline function Vec4 vec4(real32 x, real32 y, real32 z, real32 w) { | |||
| size_t length;\ | |||
| size_t capacity;\ | |||
| } prefix ## List | |||
| #define ListElementType(list) MemberTypeUnderlying(type, data) | |||
| #define ListElementSize(list) MemberSizeUnderlying(type, data) | |||
| #define ListElementSize(list) MemberSizeUnderlying(list, data) | |||
| DefineList(string, String); | |||
| #define PushList(arena, type, size) (type){ (ListElementType(type) *)pushSize(arena, ListElementSize(type)*size), size, 0 } | |||
| #define PushList(arena, type, size) (type){ pushSize(arena, ListElementSize(type)*size), 0, size } | |||
| #define EmptyList(type) (type){ NULL, 0, 0 } | |||
| #define PushListZero(arena, type, size) (type){ (ListElementType(type) *)pushSizeFill(arena, ListElementSize(type)*size, 0), size, 0 } | |||
| #define PushFullList(arena, type, size) (type){ (ListElementType(type) *)pushSize(arena, ListElementSize(type)*size), size, size } | |||
| #define PushFullListZero(arena, type, size) (type){ (ListElementType(type) *)pushSizeFill(arena, ListElementSize(type)*size, 0), size, size } | |||
| #define PushListZero(arena, type, size) (type){ pushSizeFill(arena, ListElementSize(type)*size, 0), 0, size } | |||
| #define PushFullList(arena, type, size) (type){ pushSize(arena, ListElementSize(type)*size), size, size } | |||
| #define PushFullListZero(arena, type, size) (type){ pushSizeFill(arena, ListElementSize(type)*size, 0), size, size } | |||
| #define ArrayAsList(type, array) (type){ array, ArrayCount(array), ArrayCount(array) } | |||
| #define AppendList(list, element) \ | |||
| if ((list)->length < (list)->capacity) { \ | |||
| (list)->data[(list)->length++] = (element); \ | |||
| } | |||
| #define ZeroListFull(list) memset((list)->data, 0, (list)->length * ListElementSize(*(list))) | |||
| #define ZeroListFull(list) memset((list)->data, 0, (list)->length * sizeof((list)->data[0])) | |||
| #define ZeroList(list) (list)->length = 0; \ | |||
| memset((list)->data, 0, (list)->length * ListElementType(*(list))); | |||
| #define ListSlice(list, start, stop) (stop > (list)->length || start > stop ? {0} : { (list)->data + start, stop - start, stop - start, }) | |||
| #define ListTail(list, start) ListSlice(list, (list)->length) | |||
| memset((list)->data, 0, (list)->length * sizeof((list)->data[0])) | |||
| // Following two macros do not use pointers due to copying | |||
| #define ListSlice(list, start, stop) {\ | |||
| .data= (stop > (list).length || start > stop) ? 0 : (list).data + start,\ | |||
| .length=(stop > (list).length || start > stop) ? 0 : stop - start,\ | |||
| .capacity=(stop > (list).length || start > stop) ? 0 : stop - start,\ | |||
| } | |||
| #define ListTail(list, start) ListSlice(list, start, (list).length) | |||
| // ### Strings ### | |||
| struct string { | |||
| @@ -230,8 +233,8 @@ typedef enum { | |||
| } StdStream; | |||
| #define ANSI_INSTRUCTION_FROM_ENUM(ansiCodeEnum) ANSI_INSTRUCTION(ansiCodeEnum) | |||
| #define ANSI_INSTRUCTION(ansiCode) "\u001b[" #ansiCode "m" | |||
| #define ANSI_INSTRUCTION_STR(ansiCodeStr) "\u001b[" ansiCodeStr "m" | |||
| #define ANSI_INSTRUCTION(ansiCode) "\x1b[" #ansiCode "m" | |||
| #define ANSI_INSTRUCTION_STR(ansiCodeStr) "\x1b[" ansiCodeStr "m" | |||
| #define ANSI_RESET ANSI_INSTRUCTION(0) | |||
| #define ANSI_fg_black 30 | |||