rename shift to unshift and add real shift

This commit is contained in:
sam 2024-07-22 08:03:40 +12:00
parent ce1c05c6e6
commit 1de5b35258

218
slibs.h
View file

@ -11,75 +11,83 @@
#define sl_auto(name, x) typeof(x) name = x #define sl_auto(name, x) typeof(x) name = x
#define sl_new(type, ...) \ #define sl_new(type, ...) \
({ \ ({ \
type *ptr = malloc(sizeof(type)); \ type *ptr = malloc(sizeof(type)); \
*ptr = (type){__VA_ARGS__}; \ *ptr = (type){__VA_ARGS__}; \
ptr; \ ptr; \
}) })
#define sl_init(type, ...) \ #define sl_init(type, ...) \
(type) { __VA_ARGS__ } (type) { __VA_ARGS__ }
#define sl_array_len(arr) sizeof(arr) / sizeof(arr[0]) #define sl_array_len(arr) sizeof(arr) / sizeof(arr[0])
#define sl_fmt_spec(arg) \ #define sl_fmt_spec(arg) \
_Generic((arg), \ _Generic((arg), \
int8_t: "%d", \ int8_t: "%d", \
int16_t: "%d", \ int16_t: "%d", \
int32_t: "%d", \ int32_t: "%d", \
int64_t: "%lld", \ int64_t: "%lld", \
uint8_t: "%u", \ uint8_t: "%u", \
uint16_t: "%u", \ uint16_t: "%u", \
uint32_t: "%lu", \ uint32_t: "%lu", \
uint64_t: "%llu", \ uint64_t: "%llu", \
double: "%lf", \ double: "%lf", \
float: "%f", \ float: "%f", \
char: "%c", \ char: "%c", \
char *: "%s", \ char *: "%s", \
void *: "%p", \ void *: "%p", \
default: "Unknown") default: "Unknown")
#define sl_stringify(x) #x #define sl_stringify(x) #x
// Vector // Vector
#define sl_vec(type) \ #define sl_vec(type) \
struct { \ struct \
type *data; \ { \
size_t size; \ type *data; \
size_t capacity; \ size_t size; \
size_t capacity; \
} }
#define sl_vec_grow(vec) \ #define sl_vec_grow(vec) \
{ \ { \
(vec).capacity = (vec).capacity * 2 + 1; \ (vec).capacity = (vec).capacity * 2 + 1; \
void *ptr = realloc((vec).data, (vec).capacity * sizeof(*(vec).data)); \ void *ptr = realloc((vec).data, (vec).capacity * sizeof(*(vec).data)); \
if (ptr) \ if (ptr) \
(vec).data = ptr; \ (vec).data = ptr; \
} }
#define sl_vec_push(vec, element) \ #define sl_vec_push(vec, element) \
{ \ { \
if ((vec).size >= (vec).capacity) \ if ((vec).size >= (vec).capacity) \
sl_vec_grow(vec); \ sl_vec_grow(vec); \
(vec).data[(vec).size++] = (element); \ (vec).data[(vec).size++] = (element); \
} }
#define sl_vec_shift(vec, element) \ #define sl_vec_unshift(vec, element) \
{ \ { \
if ((vec).size >= (vec).capacity) \ if ((vec).size >= (vec).capacity) \
sl_vec_grow(vec); \ sl_vec_grow(vec); \
memmove((vec).data + 1, (vec).data, (vec).size * sizeof(*(vec).data)); \ memmove((vec).data + 1, (vec).data, (vec).size * sizeof(*(vec).data)); \
(vec).data[0] = (element); \ (vec).data[0] = (element); \
(vec).size++; \ (vec).size++; \
} }
#define sl_vec_pop(vec) \ #define sl_vec_shift(vec) \
{ \ { \
if ((vec).size > 0) { \ memmove((vec).data, (vec).data + 1, (vec).size * sizeof(*(vec).data)); \
(vec).size--; \ (vec).size--; \
} \ }
#define sl_vec_pop(vec) \
{ \
if ((vec).size > 0) \
{ \
(vec).size--; \
} \
} }
#define sl_vec_at(vec, index) ((vec).data[index]) #define sl_vec_at(vec, index) ((vec).data[index])
@ -94,47 +102,49 @@
#define sl_vec_end(vec) ((vec).data + (vec).size) #define sl_vec_end(vec) ((vec).data + (vec).size)
#define sl_vec_it(name, vec) \ #define sl_vec_it(name, vec) \
sl_auto((name), sl_vec_begin(vec)); \ sl_auto((name), sl_vec_begin(vec)); \
(name) != sl_vec_end(vec); \ (name) != sl_vec_end(vec); \
++(name) ++(name)
// String // String
typedef sl_vec(char) sl_string; typedef sl_vec(char) sl_string;
#define sl_string(c_str) \ #define sl_string(c_str) \
({ \ ({ \
sl_string str = {0}; \ sl_string str = {0}; \
for (size_t i = 0; i < strlen((c_str)); i++) \ for (size_t i = 0; i < strlen((c_str)); i++) \
sl_vec_push(str, (c_str)[i]); \ sl_vec_push(str, (c_str)[i]); \
str; \ str; \
}) })
#define sl_tostring(val) \ #define sl_tostring(val) \
({ \ ({ \
sl_auto(len, snprintf(NULL, 0, sl_fmt_spec(val), val) + 1); \ sl_auto(len, snprintf(NULL, 0, sl_fmt_spec(val), val) + 1); \
sl_auto(buf, (char *)malloc(len)); \ sl_auto(buf, (char *)malloc(len)); \
snprintf(buf, len, sl_fmt_spec(val), val); \ snprintf(buf, len, sl_fmt_spec(val), val); \
sl_auto(str, sl_string(buf)); \ sl_auto(str, sl_string(buf)); \
free(buf); \ free(buf); \
str; \ str; \
}) })
#define sl_str_free(str) sl_vec_free(str) #define sl_str_free(str) sl_vec_free(str)
#define sl_c_str(str) \ #define sl_c_str(str) \
({ \ ({ \
sl_vec_push((str), '\0'); \ sl_vec_push((str), '\0'); \
(str).size--; \ (str).size--; \
(str).data; \ (str).data; \
}) })
void sl_append_c_str(sl_string* sl_str, const char* c_str); void sl_append_c_str(sl_string *sl_str, const char *c_str);
#ifdef SL_IMPLEMENTATION #ifdef SL_IMPLEMENTATION
void sl_append_c_str(sl_string* sl_str, const char* c_str) { void sl_append_c_str(sl_string *sl_str, const char *c_str)
for(int i = 0; i < strlen(c_str); i++) { {
for (int i = 0; i < strlen(c_str); i++)
{
sl_vec_push(*sl_str, c_str[i]); sl_vec_push(*sl_str, c_str[i]);
} }
} }
@ -142,44 +152,50 @@ void sl_append_c_str(sl_string* sl_str, const char* c_str) {
// Pointers // Pointers
#define sl_ptr(type) \ #define sl_ptr(type) \
struct { \ struct \
type *ptr; \ { \
int ref_count; \ type *ptr; \
int ref_count; \
} }
#define sl_ptr_make(raw_ptr) \ #define sl_ptr_make(raw_ptr) \
{ raw_ptr, 1 } { \
raw_ptr, 1 \
}
#define sl_ptr_release(smart_ptr) \ #define sl_ptr_release(smart_ptr) \
({ \ ({ \
smart_ptr.ref_count--; \ smart_ptr.ref_count--; \
if (smart_ptr.ref_count <= 0) { \ if (smart_ptr.ref_count <= 0) \
free(smart_ptr.ptr); \ { \
} \ free(smart_ptr.ptr); \
} \
}) })
#define sl_ptr_get(smart_ptr, raw_ptr_name, scope) \ #define sl_ptr_get(smart_ptr, raw_ptr_name, scope) \
({ \ ({ \
assert(smart_ptr.ref_count > 0 && "Smart pointer already released!"); \ assert(smart_ptr.ref_count > 0 && "Smart pointer already released!"); \
sl_auto(raw_ptr_name, smart_ptr.ptr); \ sl_auto(raw_ptr_name, smart_ptr.ptr); \
smart_ptr.ref_count++; \ smart_ptr.ref_count++; \
scope; \ scope; \
sl_ptr_release(smart_ptr); \ sl_ptr_release(smart_ptr); \
}); });
#define sl_ptr_scope(smart_ptr, scope) \ #define sl_ptr_scope(smart_ptr, scope) \
({ \ ({ \
scope; \ scope; \
sl_ptr_release(smart_ptr); \ sl_ptr_release(smart_ptr); \
}); });
void sl_read_file(const char *filename, sl_string *buffer); void sl_read_file(const char *filename, sl_string *buffer);
#ifdef SL_IMPLEMENTATION #ifdef SL_IMPLEMENTATION
void sl_read_file(const char *filename, sl_string *buffer) { void sl_read_file(const char *filename, sl_string *buffer)
{
FILE *file = fopen(filename, "r"); FILE *file = fopen(filename, "r");
if (!file) { if (!file)
{
fprintf(stderr, "Error: could not open file %s\n", filename); fprintf(stderr, "Error: could not open file %s\n", filename);
exit(1); exit(1);
} }
@ -188,7 +204,8 @@ void sl_read_file(const char *filename, sl_string *buffer) {
size_t file_size = ftell(file); size_t file_size = ftell(file);
fseek(file, 0, SEEK_SET); fseek(file, 0, SEEK_SET);
for (size_t i = 0; i < file_size; i++) { for (size_t i = 0; i < file_size; i++)
{
sl_vec_push(*buffer, fgetc(file)); sl_vec_push(*buffer, fgetc(file));
} }
@ -197,3 +214,4 @@ void sl_read_file(const char *filename, sl_string *buffer) {
#endif #endif
#endif // SLIBS_H #endif // SLIBS_H