pipewire/spa/plugins/alsa/acp/idxset.h
Wim Taymans a66d5b90f9 Revert "alsa: UCM conflicting devices changes"
If needs some more work

This reverts commit aae770f18b.
This reverts commit 2216956e05.
This reverts commit 1d3c4501ef.
This reverts commit c7ca024607.
This reverts commit 8e4a5f5d5e.
This reverts commit 8b20675ad1.
This reverts commit ebe6f8b51a.
This reverts commit 4b97da1277.
This reverts commit 7c46a656c7.
This reverts commit 96ed03e1fc.
This reverts commit 43770c533c.
This reverts commit ccb2fce054.
This reverts commit 93d0ddc8b3.
This reverts commit 815e8c8fa0.
This reverts commit 97b99a0f7c.
This reverts commit 7e4d87402b.
This reverts commit 168b3ee22c.
This reverts commit 5128cdba31.
This reverts commit 31cde774c5.
This reverts commit b02c8ba153.
This reverts commit 68ac72d098.
This reverts commit 96cfc9bc1a.
This reverts commit e2d642a20b.
This reverts commit 80fc80c343.
This reverts commit 3a68905c7c.
This reverts commit 7e64680a65.
This reverts commit 8d1e38a281.
This reverts commit 591188195c.
This reverts commit 973fe0cb79.
This reverts commit 4d08c9ad60.
This reverts commit 3dce92e580.
This reverts commit 6b5e232c5c.
This reverts commit b1286c62c9.
2023-04-12 13:05:08 +02:00

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 */