#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, see <http://www.gnu.org/licenses/>.
***/
#include <inttypes.h>
#include <pulse/def.h>
#include <pulsecore/macro.h>
* both through an automatically generated numeric index and the
* entry's data pointer. As usual, memory management is the user's
* job. */
#define PA_IDXSET_INVALID ((uint32_t) -1)
* compares the pointer or calculates the hash value directly from the
* pointer value. */
unsigned pa_idxset_trivial_hash_func(const void *p);
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 void *(*pa_copy_func_t)(const void *p);
typedef struct pa_idxset pa_idxset;
pa_idxset* pa_idxset_new(pa_hash_func_t hash_func, pa_compare_func_t compare_func);
void pa_idxset_free(pa_idxset *s, pa_free_cb_t free_cb);
int pa_idxset_put(pa_idxset*s, void *p, uint32_t *idx);
void* pa_idxset_get_by_index(pa_idxset*s, uint32_t idx);
void* pa_idxset_get_by_data(pa_idxset*s, const void *p, uint32_t *idx);
bool pa_idxset_contains(pa_idxset *s, const void *p);
void* pa_idxset_remove_by_index(pa_idxset*s, uint32_t idx);
void* pa_idxset_remove_by_data(pa_idxset*s, const void *p, uint32_t *idx);
void pa_idxset_remove_all(pa_idxset *s, pa_free_cb_t free_cb);
an invalid index value it returns the first entry, otherwise the
next following. The function is best called with *idx =
PA_IDXSET_VALID first. It is safe to manipulate the idxset between
the calls. It is not guaranteed that all entries have already been
returned before the an entry is returned the second time.*/
void* pa_idxset_rrobin(pa_idxset *s, uint32_t *idx);
void *pa_idxset_iterate(pa_idxset *s, void **state, uint32_t *idx);
void *pa_idxset_reverse_iterate(pa_idxset *s, void **state, uint32_t *idx);
* If idx is not NULL fill in its index in *idx */
void* pa_idxset_steal_first(pa_idxset *s, uint32_t *idx);
void* pa_idxset_steal_last(pa_idxset *s, uint32_t *idx);
* Fill in its index in *idx. */
void* pa_idxset_first(pa_idxset *s, uint32_t *idx);
void* pa_idxset_last(pa_idxset *s, uint32_t *idx);
* After the call *index contains the index of the returned object.
* pa_idxset_first() and pa_idxset_next() may be used to iterate through
* the set. pa_idxset_last() and pa_idxset_previous() may be used to
* iterate through the set in reverse. */
void *pa_idxset_next(pa_idxset *s, uint32_t *idx);
void *pa_idxset_previous(pa_idxset *s, uint32_t *idx);
unsigned pa_idxset_size(pa_idxset*s);
bool pa_idxset_isempty(pa_idxset *s);
bool pa_idxset_isdisjoint(pa_idxset *s, pa_idxset *t);
bool pa_idxset_issubset(pa_idxset *s, pa_idxset *t);
bool pa_idxset_issuperset(pa_idxset *s, pa_idxset *t);
bool pa_idxset_equals(pa_idxset *s, pa_idxset *t);
* set, each entry is copied using the provided function, otherwise a shallow
* copy will be made. */
pa_idxset *pa_idxset_copy(pa_idxset *s, pa_copy_func_t copy_func);
#define PA_IDXSET_FOREACH(e, s, idx) \
for ((e) = pa_idxset_first((s), &(idx)); (e); (e) = pa_idxset_next((s), &(idx)))
#endif