source: mainline/uspace/lib/c/include/adt/hash_set.h@ 00d7e1b

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since 00d7e1b was e2c50e1, checked in by Martin Decky <martin@…>, 14 years ago

cherrypick hashset implementation from lp:~helenos-nicf/helenos/nicf

  • Property mode set to 100644
File size: 2.9 KB
Line 
1/*
2 * Copyright (c) 2006 Jakub Jermar
3 * Copyright (c) 2011 Radim Vansa
4 * All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * - Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * - The name of the author may not be used to endorse or promote products
16 * derived from this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30/** @addtogroup libc
31 * @{
32 */
33/** @file
34 */
35
36#ifndef LIBC_HASH_SET_H_
37#define LIBC_HASH_SET_H_
38
39#include <adt/list.h>
40#include <unistd.h>
41
42#define HASH_SET_MIN_SIZE 8
43
44typedef unsigned long (*hash_set_hash)(const link_t *);
45typedef int (*hash_set_equals)(const link_t *, const link_t *);
46
47/** Hash table structure. */
48typedef struct {
49 list_t *table;
50
51 /** Current table size */
52 size_t size;
53
54 /**
55 * Current number of entries. If count > size,
56 * the table is rehashed into table with double
57 * size. If (4 * count < size) && (size > min_size),
58 * the table is rehashed into table with half the size.
59 */
60 size_t count;
61
62 /** Hash function */
63 hash_set_hash hash;
64
65 /** Hash table item equals function */
66 hash_set_equals equals;
67} hash_set_t;
68
69extern int hash_set_init(hash_set_t *, hash_set_hash, hash_set_equals, size_t);
70extern int hash_set_insert(hash_set_t *, link_t *);
71extern link_t *hash_set_find(hash_set_t *, const link_t *);
72extern int hash_set_contains(const hash_set_t *, const link_t *);
73extern size_t hash_set_count(const hash_set_t *);
74extern link_t *hash_set_remove(hash_set_t *, const link_t *);
75extern void hash_set_remove_selected(hash_set_t *,
76 int (*)(link_t *, void *), void *);
77extern void hash_set_destroy(hash_set_t *);
78extern void hash_set_apply(hash_set_t *, void (*)(link_t *, void *), void *);
79extern void hash_set_clear(hash_set_t *, void (*)(link_t *, void *), void *);
80
81#endif
82
83/** @}
84 */
Note: See TracBrowser for help on using the repository browser.