mirror of
https://github.com/ibm-s390-linux/s390-tools.git
synced 2026-08-05 02:14:52 +00:00
This commit is based on the s390-tools-1.39.0 version. Changes on top of s390-tools-1.39.0: - Add MIT license to all source files - Add LICENSE file - Transform REAMDE to README.md (markdown) - Add AUTHORS.md file - Add CONTRIBUTING.md file - Move changelog from README to CHANGELOG.md file Reviewed-by: Stefan Haberland <sth@linux.vnet.ibm.com> Signed-off-by: Michael Holzheu <holzheu@linux.vnet.ibm.com>
66 lines
2.2 KiB
C
66 lines
2.2 KiB
C
/*
|
|
* 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 */
|