blob: 63fbe5600cfa48104238d850499570683b96e760 [file] [log] [blame]
/*
* Copyright (c) 2018 The Fuchsia Authors.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_SPARSE_ARRAY_H_
#define GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_SPARSE_ARRAY_H_
#include <stddef.h>
#include <sys/types.h>
// A sparse array provides an association between index values and payloads.
// The operations available and their time complexity are:
// add: add a new element, returning the index into which it was stored, O(1)
// get: return the value associated with an index, O(1)
// remove: remove the value associated with an index, O(1)
// for_each: call a function for each value in the used list, O(n), where n
// is the number of indices in use
// Note that concurrent accesses are unsupported, so the caller must provide
// their own mutex if it's needed.
struct sparse_array;
typedef struct sparse_array* sparse_array_t;
// Allocate a new sparse array into *psa. Sets to NULL if memory allocation fails.
void sa_init(sparse_array_t* psa, size_t size);
// Deallocate a sparse array.
void sa_free(sparse_array_t sa);
// Add an element to a sparse array, returns the index or -1 if no entries are available.
ssize_t sa_add(sparse_array_t sa, void* payload);
// Get the element at the specified index, which must be in the used list.
void* sa_get(sparse_array_t sa, ssize_t ndx);
// Remove an element from a sparse array, which must be in the used list.
void sa_remove(sparse_array_t sa, ssize_t ndx);
// Call a function on each element in a sparse array.
void sa_for_each(sparse_array_t sa, void (*fn)(ssize_t ndx, void* ptr, void* ctx), void* ctx);
#endif // GARNET_DRIVERS_WLAN_THIRD_PARTY_ATHEROS_ATH10K_SPARSE_ARRAY_H_