summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <sandmann@daimi.au.dk>2009-04-17 19:48:14 -0400
committerSøren Sandmann Pedersen <sandmann@daimi.au.dk>2009-04-17 19:48:14 -0400
commit1a7c6eb8edfeb315b291bd3c8dbdf9b24b52b321 (patch)
treeb077fee8a28b7e1fa5883836b42989147c0b96b8
parent64ddf6f684492152bc78269dca51725c0e285b86 (diff)
Don't expose the array bookkeeping to individual array implementations
-rw-r--r--array.c70
1 files changed, 35 insertions, 35 deletions
diff --git a/array.c b/array.c
index 5f9f800..3f80d0d 100644
--- a/array.c
+++ b/array.c
@@ -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);
}
/*