92 lines
2.5 KiB
C
92 lines
2.5 KiB
C
/**
|
|
* \file
|
|
* \brief Barrelfish collections library hash table
|
|
*/
|
|
/*
|
|
* Copyright (c) 2010, ETH Zurich.
|
|
* All rights reserved.
|
|
*
|
|
* This file is distributed under the terms in the attached LICENSE file.
|
|
* If you do not find this file, copies can be found by writing to:
|
|
* ETH Zurich D-INFK, Universitaetstrasse 6, CH-8092 Zurich. Attn: Systems Group.
|
|
*/
|
|
|
|
#ifndef _HASH_TABLE_H_
|
|
#define _HASH_TABLE_H_
|
|
|
|
#include "collections/list.h"
|
|
|
|
/*
|
|
* a simple hash table.
|
|
*/
|
|
|
|
typedef void (* collections_hash_data_free)(void *);
|
|
|
|
typedef struct _collections_hash_table {
|
|
// number of buckets in the table.
|
|
int num_buckets;
|
|
|
|
// pointer to the buckets.
|
|
collections_listnode **buckets;
|
|
|
|
// total number of elements in the table.
|
|
uint32_t num_elems;
|
|
|
|
// function that knows how to free inserted data resources
|
|
collections_hash_data_free data_free;
|
|
|
|
// a pointer to keep track of
|
|
// traversing the hash table
|
|
int32_t cur_bucket_num;
|
|
} collections_hash_table;
|
|
|
|
/*
|
|
* Structure of a hash table element.
|
|
*/
|
|
typedef struct _collections_hash_elem {
|
|
|
|
uint64_t key;
|
|
|
|
void *data;
|
|
} collections_hash_elem;
|
|
|
|
#define NUM_BUCKETS 1013
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif // __cplusplus
|
|
|
|
|
|
/*
|
|
* functions ...
|
|
*/
|
|
void collections_hash_create(collections_hash_table **t, collections_hash_data_free f);
|
|
void collections_hash_create_with_buckets(collections_hash_table **t, int num_buckets, collections_hash_data_free f);
|
|
void collections_hash_release(collections_hash_table *t);
|
|
void collections_hash_insert(collections_hash_table *t, uint64_t key, void *data);
|
|
void* collections_hash_find(collections_hash_table *t, uint64_t key);
|
|
void collections_hash_delete(collections_hash_table *t, uint64_t key);
|
|
uint32_t collections_hash_size(collections_hash_table *t);
|
|
int32_t collections_hash_traverse_start(collections_hash_table* t);
|
|
void* collections_hash_traverse_next(collections_hash_table* t, uint64_t *key);
|
|
int32_t collections_hash_traverse_end(collections_hash_table* t);
|
|
|
|
/*
|
|
* Visitor function: returns 0 when visit should be considered finish.
|
|
*/
|
|
typedef int (*collections_hash_visitor_func)(uint64_t key, void *data, void *arg);
|
|
|
|
/*
|
|
* Apply function to all elements in hash table or until function indicates
|
|
* function application should stop.
|
|
*
|
|
* Returns non-zero if all elements in table visited, 0 otherwise.
|
|
*/
|
|
int collections_hash_visit(collections_hash_table *t, collections_hash_visitor_func collections_hash_visitor, void *arg);
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif // __cplusplus
|
|
|
|
#endif
|