diff options
Diffstat (limited to 'src/pulsecore/idxset.h')
| -rw-r--r-- | src/pulsecore/idxset.h | 57 |
1 files changed, 38 insertions, 19 deletions
diff --git a/src/pulsecore/idxset.h b/src/pulsecore/idxset.h index 3d0bc75f..2d01fb47 100644 --- a/src/pulsecore/idxset.h +++ b/src/pulsecore/idxset.h @@ -1,21 +1,22 @@ -#ifndef fooidxsethfoo -#define fooidxsethfoo - -/* $Id$ */ +#ifndef foopulsecoreidxsethfoo +#define foopulsecoreidxsethfoo /*** This file is part of PulseAudio. - + + Copyright 2004-2008 Lennart Poettering + Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB + 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 @@ -24,13 +25,19 @@ #include <inttypes.h> +#include <pulsecore/macro.h> + /* A combination of a set and a dynamic array. Entries are indexable - * both through a numeric automatically generated index and the entry's - * data pointer. As usual, memory management is the user's job. */ + * both through an automatically generated numeric index and the + * entry's data pointer. As usual, memory management is the user's + * job. */ /* A special index value denoting the invalid index. */ #define PA_IDXSET_INVALID ((uint32_t) -1) +/* Similar to pa_free_cb_t, but takes a userdata argument */ +typedef void (*pa_free2_cb_t)(void *p, void *userdata); + /* Generic implementations for hash and comparison functions. Just * compares the pointer or calculates the hash value directly from the * pointer value. */ @@ -41,13 +48,16 @@ int pa_idxset_trivial_compare_func(const void *a, const void *b); unsigned pa_idxset_string_hash_func(const void *p); int pa_idxset_string_compare_func(const void *a, const void *b); +typedef unsigned (*pa_hash_func_t)(const void *p); +typedef int (*pa_compare_func_t)(const void *a, const void *b); + typedef struct pa_idxset pa_idxset; /* Instantiate a new idxset with the specified hash and comparison functions */ -pa_idxset* pa_idxset_new(unsigned (*hash_func) (const void *p), int (*compare_func) (const void*a, const void*b)); +pa_idxset* pa_idxset_new(pa_hash_func_t hash_func, pa_compare_func_t compare_func); /* Free the idxset. When the idxset is not empty the specified function is called for every entry contained */ -void pa_idxset_free(pa_idxset *s, void (*free_func) (void *p, void *userdata), void *userdata); +void pa_idxset_free(pa_idxset *s, pa_free2_cb_t free_cb, void *userdata); /* Store a new item in the idxset. The index of the item is returned in *idx */ int pa_idxset_put(pa_idxset*s, void *p, uint32_t *idx); @@ -55,7 +65,7 @@ int pa_idxset_put(pa_idxset*s, void *p, uint32_t *idx); /* Get the entry by its idx */ void* pa_idxset_get_by_index(pa_idxset*s, uint32_t idx); -/* Get the entry by its data. The idx is returned in *index */ +/* Get the entry by its data. The index is returned in *idx */ void* pa_idxset_get_by_data(pa_idxset*s, const void *p, uint32_t *idx); /* Similar to pa_idxset_get_by_index(), but removes the entry from the idxset. */ @@ -72,6 +82,12 @@ void* pa_idxset_remove_by_data(pa_idxset*s, const void *p, uint32_t *idx); returned before the an entry is returned the second time.*/ void* pa_idxset_rrobin(pa_idxset *s, uint32_t *idx); +/* Iterate through the idxset. At first iteration state should be NULL */ +void *pa_idxset_iterate(pa_idxset *s, void **state, uint32_t *idx); + +/* Return the oldest entry in the idxset and remove it. If idx is not NULL fill in its index in *idx */ +void* pa_idxset_steal_first(pa_idxset *s, uint32_t *idx); + /* Return the oldest entry in the idxset. Fill in its index in *idx. */ void* pa_idxset_first(pa_idxset *s, uint32_t *idx); @@ -81,14 +97,17 @@ void* pa_idxset_first(pa_idxset *s, uint32_t *idx); * iterate through the set.*/ void *pa_idxset_next(pa_idxset *s, uint32_t *idx); -/* Call a function for every item in the set. If the callback function - returns -1, the loop is terminated. If *del is set to non-zero that - specific item is removed. It is not safe to call any other - functions on the idxset while pa_idxset_foreach is executed. */ -int pa_idxset_foreach(pa_idxset*s, int (*func)(void *p, uint32_t idx, int *del, void*userdata), void *userdata); - +/* Return the current number of entries in the idxset */ unsigned pa_idxset_size(pa_idxset*s); -int pa_idxset_isempty(pa_idxset *s); +/* Return TRUE of the idxset is empty */ +pa_bool_t pa_idxset_isempty(pa_idxset *s); + +/* Duplicate the idxset. This will not copy the actual indexes */ +pa_idxset *pa_idxset_copy(pa_idxset *s); + +/* A macro to ease iteration through all entries */ +#define PA_IDXSET_FOREACH(e, s, idx) \ + for ((e) = pa_idxset_first((s), &(idx)); (e); (e) = pa_idxset_next((s), &(idx))) #endif |
