mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
A dynamic array is a nice simple container, but the old interface wasn't quite what I wanted it to be. I like GLib's way of providing the free callback at the container creation time, because that way the free callback doesn't have to be given every time something is removed from the array. The allocation pattern was changed too: instead of increasing the array size always by 25 when the array gets full, the size gets doubled now (the lowest non-zero size is still 25). The array can't store NULL pointers anymore, and pa_dynarray_get() was changed so that it's forbidden to try to access elements outside the valid range. The set of supported operations may seem a bit arbitrary. The operation set is by no means complete at this point. I have included only those operations that are required by the current code and some unpublished code of mine.
95 lines
2.2 KiB
C
95 lines
2.2 KiB
C
/***
|
|
This file is part of PulseAudio.
|
|
|
|
Copyright 2004-2008 Lennart Poettering
|
|
|
|
PulseAudio is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU Lesser General Public License as
|
|
published by the Free Software Foundation; either version 2.1 of the
|
|
License, or (at your option) any later version.
|
|
|
|
PulseAudio is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Lesser General Public License for more details.
|
|
|
|
You should have received a copy of the GNU Lesser General Public
|
|
License along with PulseAudio; if not, write to the Free Software
|
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
USA.
|
|
***/
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
#include <config.h>
|
|
#endif
|
|
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <pulse/xmalloc.h>
|
|
#include <pulsecore/macro.h>
|
|
|
|
#include "dynarray.h"
|
|
|
|
struct pa_dynarray {
|
|
void **data;
|
|
unsigned n_allocated, n_entries;
|
|
pa_free_cb_t free_cb;
|
|
};
|
|
|
|
pa_dynarray* pa_dynarray_new(pa_free_cb_t free_cb) {
|
|
pa_dynarray *array;
|
|
|
|
array = pa_xnew0(pa_dynarray, 1);
|
|
array->free_cb = free_cb;
|
|
|
|
return array;
|
|
}
|
|
|
|
void pa_dynarray_free(pa_dynarray *array) {
|
|
unsigned i;
|
|
pa_assert(array);
|
|
|
|
if (array->free_cb)
|
|
for (i = 0; i < array->n_entries; i++)
|
|
array->free_cb(array->data[i]);
|
|
|
|
pa_xfree(array->data);
|
|
pa_xfree(array);
|
|
}
|
|
|
|
void pa_dynarray_append(pa_dynarray *array, void *p) {
|
|
pa_assert(array);
|
|
pa_assert(p);
|
|
|
|
if (array->n_entries == array->n_allocated) {
|
|
unsigned n = PA_MAX(array->n_allocated * 2, 25U);
|
|
|
|
array->data = pa_xrealloc(array->data, sizeof(void *) * n);
|
|
array->n_allocated = n;
|
|
}
|
|
|
|
array->data[array->n_entries++] = p;
|
|
}
|
|
|
|
void *pa_dynarray_get(pa_dynarray *array, unsigned i) {
|
|
pa_assert(array);
|
|
pa_assert(i < array->n_entries);
|
|
|
|
return array->data[i];
|
|
}
|
|
|
|
void *pa_dynarray_steal_last(pa_dynarray *array) {
|
|
pa_assert(array);
|
|
|
|
if (array->n_entries > 0)
|
|
return array->data[--array->n_entries];
|
|
else
|
|
return NULL;
|
|
}
|
|
|
|
unsigned pa_dynarray_size(pa_dynarray *array) {
|
|
pa_assert(array);
|
|
|
|
return array->n_entries;
|
|
}
|