File: hash.h

package info (click to toggle)
s390-tools 2.35.0-3
  • links: PTS
  • area: main
  • in suites: forky, sid
  • size: 12,248 kB
  • sloc: ansic: 184,236; sh: 12,152; cpp: 4,954; makefile: 2,763; perl: 2,519; asm: 1,085; python: 697; xml: 29
file content (65 lines) | stat: -rw-r--r-- 2,245 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
/*
 * zdev - Modify and display the persistent configuration of devices
 *
 * Copyright IBM Corp. 2016, 2017
 *
 * s390-tools is free software; you can redistribute it and/or modify
 * it under the terms of the MIT license. See LICENSE for details.
 */

#ifndef HASH_H
#define HASH_H

#include "lib/util_list.h"

/* A hash is a list of entries. Each entry provides an ID. A hashing function
 * maps the ID to an integer bucket number. When adding entries to a hash, the
 * entry is stored in a list associated with this bucket number. This approach
 * can greatly reduce the effort needed to find an entry in a hash by ID. */

/* Return the ID of an entry. */
typedef const void *(*hash_id_fn_t)(void *);

/* Check if two IDs are identical. */
typedef int (*hash_cmp_fn_t)(const void *, const void *);

/* Return the bucket number for an ID. */
typedef int (*hash_fn_t)(const void *);

/**
 * hash - A hash supported list
 * @list: Sequential list of entries
 * @buckets: Number of hash buckets
 * @get_id: Return the ID of an entry
 * @cmp_id: Return 0 if two IDs are identical
 * @get_hash: Function that returns a hash index for an ID
 * @hash: Lists per hash index
 */
struct hash {
	struct util_list list;
	int buckets;
	hash_id_fn_t get_id;
	hash_cmp_fn_t cmp_id;
	hash_fn_t get_hash;
	struct util_list **hash;
};

#define hash_init(hash, buckets, get_id, cmp_id, get_hash, type, member) \
	_hash_init((hash), (buckets), (get_id), (cmp_id), (get_hash), \
	offsetof(type, member))
#define hash_new(buckets, get_id, cmp_id, get_hash, type, member) \
	_hash_new((buckets), (get_id), (cmp_id), (get_hash), \
	offsetof(type, member))

void _hash_init(struct hash *hash, int buckets, hash_id_fn_t get_id,
		hash_cmp_fn_t cmp_id, hash_fn_t get_hash, unsigned long offset);
struct hash *_hash_new(int buckets, hash_id_fn_t get_id, hash_cmp_fn_t cmp_id,
		       hash_fn_t get_hash, unsigned long offset);
void hash_clear(struct hash *hash, void (*free_fn)(void *));
void hash_free(struct hash *hash, void (*free_fn)(void *));
void hash_add(struct hash *hash, void *entry);
void hash_remove(struct hash *hash, void *entry);
void *hash_find_by_id(struct hash *hash, const void *id);
void hash_print(struct hash *hash, int ind);

#endif /* HASH_H */