X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=common%2Farray.h;h=4a5b88dc89728dcb75420f4cb7d0d4bda7ebac90;hb=b0194db8ea91d49b9e50319f6e20b8f580e338ed;hp=0ca70ded3d7aaf82b2101f86189fa80d4d34e091;hpb=5973bedba6892b8100467801c39d1364a5bfd617;p=apps%2Fpfixtools.git diff --git a/common/array.h b/common/array.h index 0ca70de..4a5b88d 100644 --- a/common/array.h +++ b/common/array.h @@ -111,9 +111,9 @@ array_ensure_capacity_delta(array, 1); \ (array).data[(array).len++] = (obj); \ } while (0) -#define array_append(array, objs, len) \ +#define array_append(array, objs, Len) \ do { \ - const typeof((array).len) __len = (len); \ + const typeof((array).len) __len = (Len); \ array_ensure_capacity_delta(array, __len); \ memcpy((array).data + (array).len, objs, \ __len * sizeof(*(array).data)); \ @@ -138,13 +138,20 @@ array_ensure_can_edit(array); \ p_allocgrow(&(array).data, (goal), &(array).size); \ } -#define array_adjust(array) \ +#define array_shrink(array, cap) \ do { \ array_ensure_can_edit(array); \ - p_shrink(&(array).data, (array).len, &(array).size); \ + if ((cap) < (array).size && (array).size != (array).len) { \ + p_shrink(&(array).data, MAX((array).len, (cap)), &(array).size); \ + } \ } while (0) -#define array_elt(array, n) (array).data[(n)] -#define array_ptr(array, n) (array).data + (n) +#define array_adjust(array) array_shrink(array, 0) + +#define array_elt(array, n) ((array).data[(n)]) +#define array_last(array) array_elt(array, (array).len - 1) +#define array_pop_last(array) array_elt(array, --((array).len)) + +#define array_ptr(array, n) ((array).data + (n)) #define foreach(var, array) \ for (uint32_t __Ai = 0 ; __Ai < (array).len ; ++__Ai) { \ @@ -160,26 +167,25 @@ array_wipe(array); \ } while (0) -#define array_byte_len(array) (array).len * sizeof(*(array).data) +#define array_len(array) (array).len +#define array_size(array) (array).size +#define array_elt_len(array) sizeof(*(array).data) +#define array_byte_len(array) ((array).len * array_elt_len(array)) #define array_lock(array) \ ((array).locked \ - || (mprotect((array).data, array_byte_len(array), PROT_READ) == 0 \ - && mlock((array).data, array_byte_len(array)) == 0 \ - && ((array).locked = true)) \ - || (mprotect((array).data, array_byte_len(array), \ - PROT_READ | PROT_WRITE) > 0)) + || (mlock((array).data, array_byte_len(array)) == 0 \ + && ((array).locked = true))) #define array_unlock(array) \ if ((array).locked) { \ (void)munlock((array).data, array_byte_len(array)); \ - (void)mprotect((array).data, array_byte_len(array), \ - PROT_READ | PROT_WRITE); \ (array).locked = false; \ } ARRAY(char) ARRAY(int) ARRAY(bool) +ARRAY(uint16_t) ARRAY(uint32_t) PARRAY(void)