Add 'stage0/' from commit 'b3d106ec971300a9c745f4681fab3df7518c4346'
git-subtree-dir: stage0 git-subtree-mainline:3db960767dgit-subtree-split:b3d106ec97
This commit is contained in:
54
stage0/common.h
Normal file
54
stage0/common.h
Normal file
@@ -0,0 +1,54 @@
|
||||
// common.h — must be included before any system headers.
|
||||
#ifndef _ZIG0_COMMON_H__
|
||||
#define _ZIG0_COMMON_H__
|
||||
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define SLICE(Type) \
|
||||
struct Type##Slice { \
|
||||
uint32_t len; \
|
||||
uint32_t cap; \
|
||||
Type* arr; \
|
||||
}
|
||||
|
||||
#define ARR_INIT(Type, initial_cap) \
|
||||
({ \
|
||||
Type* arr = calloc(initial_cap, sizeof(Type)); \
|
||||
if (!arr) \
|
||||
exit(1); \
|
||||
arr; \
|
||||
})
|
||||
|
||||
#define SLICE_INIT(Type, initial_cap) \
|
||||
{ .len = 0, .cap = (initial_cap), .arr = ARR_INIT(Type, initial_cap) }
|
||||
|
||||
#define SLICE_RESIZE(Type, slice, new_cap) \
|
||||
({ \
|
||||
const uint32_t cap = (new_cap); \
|
||||
Type* new_arr = realloc((slice)->arr, cap * sizeof(Type)); \
|
||||
if (new_arr == NULL) { \
|
||||
free((slice)->arr); \
|
||||
exit(1); \
|
||||
} \
|
||||
(slice)->arr = new_arr; \
|
||||
(slice)->cap = cap; \
|
||||
})
|
||||
|
||||
#define SLICE_ENSURE_CAPACITY(Type, slice, additional) \
|
||||
({ \
|
||||
if ((slice)->len + (additional) > (slice)->cap) { \
|
||||
SLICE_RESIZE(Type, slice, \
|
||||
((slice)->cap * 2 > (slice)->len + (additional)) \
|
||||
? (slice)->cap * 2 \
|
||||
: (slice)->len + (additional)); \
|
||||
} \
|
||||
})
|
||||
|
||||
#define SLICE_APPEND(Type, slice, item) \
|
||||
({ \
|
||||
SLICE_ENSURE_CAPACITY(Type, slice, 1); \
|
||||
(slice)->arr[(slice)->len++] = (item); \
|
||||
})
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user