mirror of
https://gitlab.freedesktop.org/pipewire/pipewire.git
synced 2025-10-31 22:25:38 -04:00
If needs some more work This reverts commitaae770f18b. This reverts commit2216956e05. This reverts commit1d3c4501ef. This reverts commitc7ca024607. This reverts commit8e4a5f5d5e. This reverts commit8b20675ad1. This reverts commitebe6f8b51a. This reverts commit4b97da1277. This reverts commit7c46a656c7. This reverts commit96ed03e1fc. This reverts commit43770c533c. This reverts commitccb2fce054. This reverts commit93d0ddc8b3. This reverts commit815e8c8fa0. This reverts commit97b99a0f7c. This reverts commit7e4d87402b. This reverts commit168b3ee22c. This reverts commit5128cdba31. This reverts commit31cde774c5. This reverts commitb02c8ba153. This reverts commit68ac72d098. This reverts commit96cfc9bc1a. This reverts commite2d642a20b. This reverts commit80fc80c343. This reverts commit3a68905c7c. This reverts commit7e64680a65. This reverts commit8d1e38a281. This reverts commit591188195c. This reverts commit973fe0cb79. This reverts commit4d08c9ad60. This reverts commit3dce92e580. This reverts commit6b5e232c5c. This reverts commitb1286c62c9.
186 lines
4.1 KiB
C
186 lines
4.1 KiB
C
/* ALSA Card Profile */
|
|
/* SPDX-FileCopyrightText: Copyright © 2020 Wim Taymans */
|
|
/* SPDX-License-Identifier: MIT */
|
|
|
|
#ifndef PA_IDXSET_H
|
|
#define PA_IDXSET_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#include "array.h"
|
|
|
|
#define PA_IDXSET_INVALID ((uint32_t) -1)
|
|
|
|
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_item {
|
|
void *ptr;
|
|
} pa_idxset_item;
|
|
|
|
typedef struct pa_idxset {
|
|
pa_array array;
|
|
pa_hash_func_t hash_func;
|
|
pa_compare_func_t compare_func;
|
|
} pa_idxset;
|
|
|
|
static inline unsigned pa_idxset_trivial_hash_func(const void *p)
|
|
{
|
|
return PA_PTR_TO_UINT(p);
|
|
}
|
|
|
|
static inline int pa_idxset_trivial_compare_func(const void *a, const void *b)
|
|
{
|
|
return a < b ? -1 : (a > b ? 1 : 0);
|
|
}
|
|
|
|
static inline unsigned pa_idxset_string_hash_func(const void *p)
|
|
{
|
|
unsigned hash = 0;
|
|
const char *c;
|
|
for (c = p; *c; c++)
|
|
hash = 31 * hash + (unsigned) *c;
|
|
return hash;
|
|
}
|
|
|
|
static inline int pa_idxset_string_compare_func(const void *a, const void *b)
|
|
{
|
|
return strcmp(a, b);
|
|
}
|
|
|
|
static inline pa_idxset *pa_idxset_new(pa_hash_func_t hash_func, pa_compare_func_t compare_func)
|
|
{
|
|
pa_idxset *s = calloc(1, sizeof(pa_idxset));
|
|
pa_array_init(&s->array, 16);
|
|
s->hash_func = hash_func;
|
|
s->compare_func = compare_func;
|
|
return s;
|
|
}
|
|
|
|
static inline void pa_idxset_free(pa_idxset *s, pa_free_cb_t free_cb)
|
|
{
|
|
if (free_cb) {
|
|
pa_idxset_item *item;
|
|
pa_array_for_each(item, &s->array)
|
|
free_cb(item->ptr);
|
|
}
|
|
pa_array_clear(&s->array);
|
|
free(s);
|
|
}
|
|
|
|
static inline pa_idxset_item* pa_idxset_find(const pa_idxset *s, const void *ptr)
|
|
{
|
|
pa_idxset_item *item;
|
|
pa_array_for_each(item, &s->array) {
|
|
if (item->ptr == NULL) {
|
|
if (ptr == NULL)
|
|
return item;
|
|
else
|
|
continue;
|
|
}
|
|
if (s->compare_func(item->ptr, ptr) == 0)
|
|
return item;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
static inline int pa_idxset_put(pa_idxset*s, void *p, uint32_t *idx)
|
|
{
|
|
pa_idxset_item *item = pa_idxset_find(s, p);
|
|
int res = item ? -1 : 0;
|
|
if (item == NULL) {
|
|
item = pa_idxset_find(s, NULL);
|
|
if (item == NULL)
|
|
item = pa_array_add(&s->array, sizeof(*item));
|
|
item->ptr = p;
|
|
}
|
|
if (idx)
|
|
*idx = item - (pa_idxset_item*)s->array.data;
|
|
return res;
|
|
}
|
|
|
|
static inline pa_idxset *pa_idxset_copy(pa_idxset *s, pa_copy_func_t copy_func)
|
|
{
|
|
pa_idxset_item *item;
|
|
pa_idxset *copy = pa_idxset_new(s->hash_func, s->compare_func);
|
|
pa_array_for_each(item, &s->array) {
|
|
if (item->ptr)
|
|
pa_idxset_put(copy, copy_func ? copy_func(item->ptr) : item->ptr, NULL);
|
|
}
|
|
return copy;
|
|
}
|
|
|
|
static inline bool pa_idxset_isempty(const pa_idxset *s)
|
|
{
|
|
pa_idxset_item *item;
|
|
pa_array_for_each(item, &s->array)
|
|
if (item->ptr != NULL)
|
|
return false;
|
|
return true;
|
|
}
|
|
static inline unsigned pa_idxset_size(pa_idxset*s)
|
|
{
|
|
unsigned count = 0;
|
|
pa_idxset_item *item;
|
|
pa_array_for_each(item, &s->array)
|
|
if (item->ptr != NULL)
|
|
count++;
|
|
return count;
|
|
}
|
|
|
|
static inline void *pa_idxset_search(pa_idxset *s, uint32_t *idx)
|
|
{
|
|
pa_idxset_item *item;
|
|
for (item = pa_array_get_unchecked(&s->array, *idx, pa_idxset_item);
|
|
pa_array_check(&s->array, item); item++, (*idx)++) {
|
|
if (item->ptr != NULL)
|
|
return item->ptr;
|
|
}
|
|
*idx = PA_IDXSET_INVALID;
|
|
return NULL;
|
|
}
|
|
|
|
static inline void *pa_idxset_next(pa_idxset *s, uint32_t *idx)
|
|
{
|
|
(*idx)++;;
|
|
return pa_idxset_search(s, idx);
|
|
}
|
|
|
|
static inline void* pa_idxset_first(pa_idxset *s, uint32_t *idx)
|
|
{
|
|
uint32_t i = 0;
|
|
void *ptr = pa_idxset_search(s, &i);
|
|
if (idx)
|
|
*idx = i;
|
|
return ptr;
|
|
}
|
|
|
|
static inline void* pa_idxset_get_by_data(pa_idxset*s, const void *p, uint32_t *idx)
|
|
{
|
|
pa_idxset_item *item = pa_idxset_find(s, p);
|
|
if (item == NULL)
|
|
return NULL;
|
|
if (idx)
|
|
*idx = item - (pa_idxset_item*)s->array.data;
|
|
return item->ptr;
|
|
}
|
|
|
|
static inline void* pa_idxset_get_by_index(pa_idxset*s, uint32_t idx)
|
|
{
|
|
pa_idxset_item *item;
|
|
if (!pa_array_check_index(&s->array, idx, pa_idxset_item))
|
|
return NULL;
|
|
item = pa_array_get_unchecked(&s->array, idx, pa_idxset_item);
|
|
return item->ptr;
|
|
}
|
|
|
|
#define PA_IDXSET_FOREACH(e, s, idx) \
|
|
for ((e) = pa_idxset_first((s), &(idx)); (e); (e) = pa_idxset_next((s), &(idx)))
|
|
|
|
#ifdef __cplusplus
|
|
} /* extern "C" */
|
|
#endif
|
|
|
|
#endif /* PA_IDXSET_H */
|