21#include "icalerror_p.h"
29#ifndef ICALARRAY_DEFAULT_INCREMENT_SIZE
30#define ICALARRAY_DEFAULT_INCREMENT_SIZE 4
34static void icalarray_expand(icalarray *array,
size_t space_needed);
46 if (!increment_size) {
47 increment_size = ICALARRAY_DEFAULT_INCREMENT_SIZE;
50 array->element_size = element_size;
51 array->increment_size = increment_size;
52 array->num_elements = 0;
53 array->space_allocated = 0;
59static void *icalarray_alloc_chunk(
const icalarray *array)
71 icalarray *array =
icalarray_new(originalarray->element_size, originalarray->increment_size);
72 size_t chunks = originalarray->space_allocated / originalarray->increment_size;
79 for (
size_t chunk = 0; chunk < chunks; chunk++) {
80 array->chunks[chunk] = icalarray_alloc_chunk(array);
81 if (array->chunks[chunk]) {
82 memcpy(array->chunks[chunk], originalarray->chunks[chunk],
83 array->increment_size * array->element_size);
85 array->space_allocated += array->increment_size;
99 array->num_elements = originalarray->num_elements;
107 size_t chunks = array->space_allocated / array->increment_size;
110 for (chunk = 0; chunk < chunks; chunk++) {
123 if (array->num_elements >= array->space_allocated) {
124 icalarray_expand(array, 1);
125 if (array->num_elements >= array->space_allocated) {
131 pos = array->num_elements++;
137 size_t chunk = position / array->increment_size;
138 size_t offset = position % array->increment_size;
140 return (
char *)(array->chunks[chunk]) + (offset * array->element_size);
150 while (position < array->num_elements - 1) {
156 array->num_elements--;
159struct _icalarray_sort_context {
161 int (*compare)(
const void *,
const void *);
164static int icalarray_fcompare(
const void *context,
size_t i,
size_t j)
166 struct _icalarray_sort_context *sort_context = (
struct _icalarray_sort_context *)context;
170 return sort_context->compare(pI, pJ);
173static void icalarray_fswap(
void *context,
size_t i,
size_t j)
175 struct _icalarray_sort_context *sort_context = (
struct _icalarray_sort_context *)context;
179 qsort_gen_memswap(pI, pJ, sort_context->array->element_size);
184 struct _icalarray_sort_context sort_context;
185 sort_context.array = array;
186 sort_context.compare = compare;
188 if (array->num_elements <= 1) {
192 qsort_gen(&sort_context, array->num_elements, icalarray_fcompare, icalarray_fswap);
195static void icalarray_expand(icalarray *array,
size_t space_needed)
197 size_t num_chunks = array->space_allocated / array->increment_size;
198 size_t num_new_chunks;
201 num_new_chunks = (space_needed + array->increment_size - 1) / array->increment_size;
202 if (!num_new_chunks) {
209 if (array->chunks && num_chunks) {
210 memcpy((
void *)new_chunks, (
void *)array->chunks, num_chunks *
sizeof(
void *));
212 for (
size_t c = 0; c < num_new_chunks; c++) {
213 new_chunks[c + num_chunks] = icalarray_alloc_chunk(array);
214 if (!new_chunks[c + num_chunks]) {
222 array->chunks = new_chunks;
223 array->space_allocated = array->space_allocated + num_new_chunks * array->increment_size;
icalarray * icalarray_copy(const icalarray *originalarray)
void * icalarray_element_at(icalarray *array, size_t position)
Access an array element.
void icalarray_free(icalarray *array)
void icalarray_sort(icalarray *array, int(*compare)(const void *, const void *))
Sorts the elements of an icalarray using the given comparison function.
void icalarray_append(icalarray *array, const void *element)
Appends an element to an array.
void icalarray_set_element_at(icalarray *array, const void *element, size_t position)
Overwrites an existing element in an array with a new value.
icalarray * icalarray_new(size_t element_size, size_t increment_size)
void icalarray_remove_element_at(icalarray *array, size_t position)
Removes a given element from an array.
An array of arbitrarily-sized elements which grows dynamically as elements are added.
void icalerror_set_errno(icalerrorenum x)
Sets the icalerrno to a given error.
void icalmemory_free_buffer(void *buf)
Releases a buffer.
void * icalmemory_new_buffer(size_t size)
Creates new buffer with the specified size.
Common memory management routines.