diff options
author | Søren Sandmann Pedersen <sandmann@daimi.au.dk> | 2009-04-17 19:48:14 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <sandmann@daimi.au.dk> | 2009-04-17 19:48:14 -0400 |
commit | 1a7c6eb8edfeb315b291bd3c8dbdf9b24b52b321 (patch) | |
tree | b077fee8a28b7e1fa5883836b42989147c0b96b8 | |
parent | 64ddf6f684492152bc78269dca51725c0e285b86 (diff) |
Don't expose the array bookkeeping to individual array implementations
-rw-r--r-- | array.c | 70 |
1 files changed, 35 insertions, 35 deletions
@@ -109,9 +109,10 @@ array_new (int element_size, const int *magic) return array->data; } -static array_t * -array_delete_head (array_t *array, gssize n_elements) +static void * +array_delete_head (void *data, const int *magic, gssize n_elements) { + array_t *array = get_array (data, magic); int n_bytes = n_elements * array->element_size; int n_total = array->n_elements * array->element_size; @@ -126,23 +127,28 @@ array_delete_head (array_t *array, gssize n_elements) nul_terminate (array); - return array; + return array->data; } -static array_t * -array_delete_tail (array_t *array, int n_elements) +static void * +array_delete_tail (void *data, const int *magic, int n_elements) { + array_t *array = get_array (data, magic); + array->n_elements -= n_elements; nul_terminate (array); - return array; + return array->data; } -static array_t * G_GNUC_WARN_UNUSED_RESULT -array_append_undefined (array_t *array, +static void * G_GNUC_WARN_UNUSED_RESULT +array_append_undefined (void *data, + const int *magic, int n_elements, void **tail) { + array_t *array = get_array (data, magic); + array = realloc_array (array, array->n_elements + n_elements); array->n_elements += n_elements; @@ -152,7 +158,21 @@ array_append_undefined (array_t *array, if (tail) *tail = (char *)array->data + array->element_size * (array->n_elements - n_elements); - return array; + return array->data; +} + +static void * +array_append (void *data, + const int *magic, + void *element) +{ + void *tail; + + data = array_append_undefined (data, magic, 1, &tail); + + memcpy (tail, element, get_array (data, magic)->element_size); + + return data; } /* Generic arrays @@ -179,14 +199,7 @@ nul_array_new (int element_size) nul_ptr_t nul_array_append (nul_ptr_t arr, nul_ptr_t element) { - array_t *array = get_array (arr, &arr_t_magic); - char *tail; - - array = array_append_undefined (array, 1, (void **)&tail); - - memcpy (tail, element, array->element_size); - - return array->data; + return array_append (arr, &arr_t_magic, element); } void @@ -237,14 +250,13 @@ nul_ptr_array_new (void) void ** nul_ptr_array_append (void **arr, gpointer data) { - array_t *array = get_array (arr, &parr_t_magic); nul_ptr_t *tail; - array = array_append_undefined (array, 1, (void **)&tail); + arr = array_append_undefined (arr, &parr_t_magic, 1, (void **)&tail); *tail = data; - return (void **)array->data; + return arr; } void @@ -293,11 +305,7 @@ nul_string_append_undefined (nul_string_t *str, gsize n_bytes, char **tail) { - array_t *array = get_array (str, &string_t_magic); - - array = array_append_undefined (array, n_bytes, (void **)tail); - - return (nul_string_t *)array->data; + return array_append_undefined (str, &string_t_magic, n_bytes, (void **)tail); } nul_string_t * @@ -353,22 +361,14 @@ nul_string_t * nul_string_delete_head (nul_string_t *str, gsize n_bytes) { - array_t *array = get_array (str, &string_t_magic); - - array = array_delete_head (array, n_bytes); - - return (nul_string_t *)array->data; + return array_delete_head (str, &string_t_magic, n_bytes); } nul_string_t * nul_string_delete_tail (nul_string_t *str, gsize n_bytes) { - array_t *array = get_array (str, &string_t_magic); - - array = array_delete_tail (array, n_bytes); - - return (nul_string_t *)array->data; + return array_delete_tail (str, &string_t_magic, n_bytes); } /* |