Updated macros to have better redefinition guards
This commit is contained in:
parent
9c7147354a
commit
a884f13b35
1 changed files with 47 additions and 1 deletions
48
lazy.h
48
lazy.h
|
|
@ -4,8 +4,13 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#ifndef LZ_STR_FMT
|
||||||
#define LZ_STR_FMT "%.*s"
|
#define LZ_STR_FMT "%.*s"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef LZ_STR_PRINTF
|
||||||
#define LZ_STR_PRINTF(slc) (int)slc.cnt, slc.data
|
#define LZ_STR_PRINTF(slc) (int)slc.cnt, slc.data
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *data;
|
char *data;
|
||||||
|
|
@ -26,7 +31,11 @@ size_t lz_hm_hash_void_set(size_t cap, _Bool *exists, void* key, size_t k_s);
|
||||||
Lz_Slc lz_cstr_to_slc(char *dat);
|
Lz_Slc lz_cstr_to_slc(char *dat);
|
||||||
char *lz_cstr_dup(const char *s);
|
char *lz_cstr_dup(const char *s);
|
||||||
|
|
||||||
|
#ifndef Lz_DA
|
||||||
#define Lz_DA(T) struct {T *data; size_t cnt; size_t cap; }
|
#define Lz_DA(T) struct {T *data; size_t cnt; size_t cap; }
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_da_append
|
||||||
#define lz_da_append(da, x) do { \
|
#define lz_da_append(da, x) do { \
|
||||||
if ((da).cap > (da).cnt) {\
|
if ((da).cap > (da).cnt) {\
|
||||||
(da).data[(da).cnt++] = (x);\
|
(da).data[(da).cnt++] = (x);\
|
||||||
|
|
@ -41,6 +50,9 @@ char *lz_cstr_dup(const char *s);
|
||||||
(da).data[(da).cnt++] = (x);\
|
(da).data[(da).cnt++] = (x);\
|
||||||
}\
|
}\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_da_insert
|
||||||
#define lz_da_insert(da, i, x) do {\
|
#define lz_da_insert(da, i, x) do {\
|
||||||
if ((i) > (da).cnt) {\
|
if ((i) > (da).cnt) {\
|
||||||
assert(0 && "Insert out of dynamic array size");\
|
assert(0 && "Insert out of dynamic array size");\
|
||||||
|
|
@ -62,11 +74,17 @@ char *lz_cstr_dup(const char *s);
|
||||||
assert(0 && "Unreachable thru proper dynamic array functions");\
|
assert(0 && "Unreachable thru proper dynamic array functions");\
|
||||||
}\
|
}\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_da_pop
|
||||||
#define lz_da_pop(da) do {\
|
#define lz_da_pop(da) do {\
|
||||||
if ((da).cnt > 0) {\
|
if ((da).cnt > 0) {\
|
||||||
(da).cnt--;\
|
(da).cnt--;\
|
||||||
}\
|
}\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_da_concat
|
||||||
#define lz_da_concat(dst,src) do {\
|
#define lz_da_concat(dst,src) do {\
|
||||||
if (sizeof(*(dst).data) != sizeof(*(dst).data)) {\
|
if (sizeof(*(dst).data) != sizeof(*(dst).data)) {\
|
||||||
assert(0 && "Mismatched types of arrays being concatenated");\
|
assert(0 && "Mismatched types of arrays being concatenated");\
|
||||||
|
|
@ -75,23 +93,37 @@ char *lz_cstr_dup(const char *s);
|
||||||
memcpy((dst).data+(dst).cnt, (src).data, (src).cnt*sizeof(*(dst).data));\
|
memcpy((dst).data+(dst).cnt, (src).data, (src).cnt*sizeof(*(dst).data));\
|
||||||
(dst).cnt = ((src).cnt+(dst).cnt);\
|
(dst).cnt = ((src).cnt+(dst).cnt);\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_da_destroy
|
||||||
#define lz_da_destroy(da) do { free((da).data); } while (0);
|
#define lz_da_destroy(da) do { free((da).data); } while (0);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_da_reserve
|
||||||
#define lz_da_reserve(da, size) do {\
|
#define lz_da_reserve(da, size) do {\
|
||||||
if ((da).cap < (size)) {\
|
if ((da).cap < (size)) {\
|
||||||
(da).data = realloc((da).data, (size)*sizeof(*(da).data));\
|
(da).data = realloc((da).data, (size)*sizeof(*(da).data));\
|
||||||
(da).cap = (size);\
|
(da).cap = (size);\
|
||||||
}\
|
}\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_da_shrink_to_fit
|
||||||
#define lz_da_shrink_to_fit(da) do {\
|
#define lz_da_shrink_to_fit(da) do {\
|
||||||
if ((da).cnt == (da).cap) break;\
|
if ((da).cnt == (da).cap) break;\
|
||||||
(da).data = realloc((da).data, (da).cnt * sizeof(*(da).data));\
|
(da).data = realloc((da).data, (da).cnt * sizeof(*(da).data));\
|
||||||
(da).cap = (da).cnt;\
|
(da).cap = (da).cnt;\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_da_foreach
|
||||||
#define lz_da_foreach(T, name, da) \
|
#define lz_da_foreach(T, name, da) \
|
||||||
for (T *name = (da).data; name-(da).data < (da).cnt; ++name)
|
for (T *name = (da).data; name-(da).data < (da).cnt; ++name)
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef Lz_DA(char) Lz_SB;
|
typedef Lz_DA(char) Lz_SB;
|
||||||
|
|
||||||
|
#ifndef Lz_HM
|
||||||
#define Lz_HM(K_t, V_t) struct {\
|
#define Lz_HM(K_t, V_t) struct {\
|
||||||
size_t cap;\
|
size_t cap;\
|
||||||
size_t cnt;\
|
size_t cnt;\
|
||||||
|
|
@ -103,7 +135,9 @@ typedef Lz_DA(char) Lz_SB;
|
||||||
K_t *keys;\
|
K_t *keys;\
|
||||||
V_t *vals;\
|
V_t *vals;\
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_hm_init
|
||||||
#define lz_hm_init(hm) do {\
|
#define lz_hm_init(hm) do {\
|
||||||
(hm).cap = 256;\
|
(hm).cap = 256;\
|
||||||
(hm).cnt = 0;\
|
(hm).cnt = 0;\
|
||||||
|
|
@ -111,28 +145,37 @@ typedef Lz_DA(char) Lz_SB;
|
||||||
(hm).vals = malloc((hm).cap*sizeof(*(hm).vals));\
|
(hm).vals = malloc((hm).cap*sizeof(*(hm).vals));\
|
||||||
(hm).exists = malloc((hm).cap*sizeof(_Bool));\
|
(hm).exists = malloc((hm).cap*sizeof(_Bool));\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_hm_hash_set
|
||||||
#define lz_hm_hash_set(hm, k) (\
|
#define lz_hm_hash_set(hm, k) (\
|
||||||
(hm).tmpkey = k,\
|
(hm).tmpkey = k,\
|
||||||
lz_hm_hash_void_set((hm).cap, (hm).exists, &(hm).tmpkey, sizeof(*(hm).keys))\
|
lz_hm_hash_void_set((hm).cap, (hm).exists, &(hm).tmpkey, sizeof(*(hm).keys))\
|
||||||
)
|
)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_hm_hash_get
|
||||||
#define lz_hm_hash_get(hm, k) (\
|
#define lz_hm_hash_get(hm, k) (\
|
||||||
(hm).tmpkey = k,\
|
(hm).tmpkey = k,\
|
||||||
lz_hm_hash_void_get((hm).cap, (hm).exists, &(hm).tmpkey, (hm).keys, sizeof(*(hm).keys))\
|
lz_hm_hash_void_get((hm).cap, (hm).exists, &(hm).tmpkey, (hm).keys, sizeof(*(hm).keys))\
|
||||||
)
|
)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_hm_exists
|
||||||
#define lz_hm_exists(hm, k) (\
|
#define lz_hm_exists(hm, k) (\
|
||||||
(hm).tmphash = lz_hm_hash_get(hm, k),\
|
(hm).tmphash = lz_hm_hash_get(hm, k),\
|
||||||
((hm).tmphash != (size_t)-1)\
|
((hm).tmphash != (size_t)-1)\
|
||||||
)
|
)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_hm_get
|
||||||
#define lz_hm_get(hm, k) (\
|
#define lz_hm_get(hm, k) (\
|
||||||
(hm).tmphash = lz_hm_hash_get(hm, k),\
|
(hm).tmphash = lz_hm_hash_get(hm, k),\
|
||||||
((hm).tmphash == (size_t)-1) ? (hm).defval : ((hm).vals[(hm).tmphash])\
|
((hm).tmphash == (size_t)-1) ? (hm).defval : ((hm).vals[(hm).tmphash])\
|
||||||
)
|
)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_hm_grow
|
||||||
#define lz_hm_grow(hm) do {\
|
#define lz_hm_grow(hm) do {\
|
||||||
size_t newcap = (hm).cap*2;\
|
size_t newcap = (hm).cap*2;\
|
||||||
void *newkeys = malloc(newcap*sizeof(*(hm).keys));\
|
void *newkeys = malloc(newcap*sizeof(*(hm).keys));\
|
||||||
|
|
@ -158,7 +201,9 @@ typedef Lz_DA(char) Lz_SB;
|
||||||
(hm).exists = newexists;\
|
(hm).exists = newexists;\
|
||||||
(hm).cap = newcap;\
|
(hm).cap = newcap;\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef lz_hm_add
|
||||||
#define lz_hm_add(hm, k, v) do {\
|
#define lz_hm_add(hm, k, v) do {\
|
||||||
size_t idx = lz_hm_hash_set(hm, k);\
|
size_t idx = lz_hm_hash_set(hm, k);\
|
||||||
(hm).keys[idx] = k;\
|
(hm).keys[idx] = k;\
|
||||||
|
|
@ -169,6 +214,7 @@ typedef Lz_DA(char) Lz_SB;
|
||||||
lz_hm_grow(hm);\
|
lz_hm_grow(hm);\
|
||||||
}\
|
}\
|
||||||
} while(0)
|
} while(0)
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef LAZY_IMPL
|
#ifdef LAZY_IMPL
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue