linux-packaging-mono/mono/utils/mono-internal-hash.h
Xamarin Public Jenkins (auto-signing) 0b380204a4 Imported Upstream version 6.12.0.86
Former-commit-id: 7a84ce7d08c42c458ac8e74b27186ca863315d79
2020-07-10 08:44:59 +00:00

82 lines
2.5 KiB
C

/**
* \file
* A hash table which uses the values themselves as nodes.
*
* Author:
* Mark Probst (mark.probst@gmail.com)
*
* (C) 2007 Novell, Inc.
*
*/
#ifndef __MONO_UTILS_MONO_INTERNAL_HASH__
#define __MONO_UTILS_MONO_INTERNAL_HASH__
/* A MonoInternalHashTable is a hash table that does not allocate hash
nodes. It can be used if the following conditions are fulfilled:
* The key is contained (directly or indirectly) in the value.
* Each value is in at most one internal hash table at the same
time.
The value data structure must then be extended to contain a
pointer, used by the internal hash table to chain values in the
same bucket.
Apart from the hash function, two other functions must be provided,
namely for extracting the key out of a value, and for getting the
next value pointer. The latter must actually return a pointer to
the next value pointer, because the internal hash table must be
able to modify it.
See the class_cache internal hash table in MonoImage for an
example.
*/
typedef struct _MonoInternalHashTable MonoInternalHashTable;
typedef gpointer (*MonoInternalHashKeyExtractFunc) (gpointer value);
typedef gpointer* (*MonoInternalHashNextValueFunc) (gpointer value);
typedef void (*MonoInternalHashApplyFunc) (gpointer value);
struct _MonoInternalHashTable
{
GHashFunc hash_func;
MonoInternalHashKeyExtractFunc key_extract;
MonoInternalHashNextValueFunc next_value;
gint size;
gint num_entries;
gpointer *table;
};
void
mono_internal_hash_table_init (MonoInternalHashTable *table,
GHashFunc hash_func,
MonoInternalHashKeyExtractFunc key_extract,
MonoInternalHashNextValueFunc next_value);
void
mono_internal_hash_table_destroy (MonoInternalHashTable *table);
gpointer
mono_internal_hash_table_lookup (MonoInternalHashTable *table, gpointer key);
/* mono_internal_hash_table_insert requires that there is no entry for
key in the hash table. If you want to change the value for a key
already in the hash table, remove it first and then insert the new
one.
The key pointer is actually only passed here to check a debugging
assertion and to make the API look more familiar. */
void
mono_internal_hash_table_insert (MonoInternalHashTable *table,
gpointer key, gpointer value);
void
mono_internal_hash_table_apply (MonoInternalHashTable *table, MonoInternalHashApplyFunc func);
gboolean
mono_internal_hash_table_remove (MonoInternalHashTable *table, gpointer key);
#endif