//
//  tb_list.h
//  Tightbeam

#ifndef __TIGHTBEAM_LIST_H
#define __TIGHTBEAM_LIST_H

#include <sys/cdefs.h>
__ptrcheck_abi_assume_single()

#include <Tightbeam/tightbeam.h>

#if !TARGET_RTKIT

TB_ASSUME_NONNULL_BEGIN
__TB_BEGIN_DECLS

typedef void (^tb_list_data_destructor_b)(void *value);

typedef struct tb_list_node_s * tb_list_node_t;

typedef struct tb_list_s * tb_list_t;

TB_EXPORT
tb_list_t
tb_list_create(void);

TB_EXPORT
void
tb_list_free(tb_list_t list);

TB_EXPORT
bool
tb_list_add(tb_list_t list, uint64_t identifier, void *value,
        tb_list_data_destructor_b destructor);

TB_EXPORT
void
tb_list_remove(tb_list_t list, uint64_t identifier);

TB_EXPORT
void * _Nullable 
tb_list_find(tb_list_t list, uint64_t identifier);

TB_EXPORT
uint64_t
tb_list_count(tb_list_t list);

TB_EXPORT
void
tb_list_clear(tb_list_t list);

__TB_END_DECLS
TB_ASSUME_NONNULL_END

#endif // !TARGET_RTKIT

#endif /* __TIGHTBEAM_LIST_H */
