Files
mercury/runtime/mercury_hash_table.h
Mark Brown d465fa53cb Update the COPYING.LIB file and references to it.
Discussion of these changes can be found on the Mercury developers
mailing list archives from June 2018.

COPYING.LIB:
    Add a special linking exception to the LGPL.

*:
    Update references to COPYING.LIB.

    Clean up some minor errors that have accumulated in copyright
    messages.
2018-06-09 17:43:12 +10:00

78 lines
2.9 KiB
C

// vim: ts=4 sw=4 expandtab ft=c
// Copyright (C) 1993-1995, 1997-1998,2000, 2004-2005 The University of Melbourne.
// Copyright (C) 2016, 2018 The Mercury team.
// This file is distributed under the terms specified in COPYING.LIB.
// Defines the interface to the hash table module.
//
// This file supplies data manipulation routines to other modules;
// it does not store any data itself. Its routines are generic,
// applicable to the storage of any kind of data structure with
// a primary key and a hash function on it.
//
// Note that this module has nothing to do with the implementation
// of the "tabling" pragmas such as `pragma memo' -- the implementation
// of those features mostly uses Tries, not hash tables, and is defined
// in mercury_tabling.h.
#ifndef MERCURY_HASH_TABLE_H
#define MERCURY_HASH_TABLE_H
#include "mercury_std.h" // for MR_bool
#include "mercury_dlist.h" // for MR_Dlist
typedef struct {
int MR_ht_size;
MR_Dlist **MR_ht_store;
const void *(*MR_ht_key)(const void *); // applied to entries
int (*MR_ht_hash)(const void *); // applied to keys
MR_bool (*MR_ht_equal)(const void *, const void *);
// applied to two keys
} MR_Hash_Table;
#define MR_tablekey(table) (*(table->MR_ht_key))
#define MR_tablehash(table) (*(table->MR_ht_hash))
#define MR_tableequal(table) (*(table->MR_ht_equal))
// Initialize a table.
extern void MR_ht_init_table(MR_Hash_Table *);
// Look up and return the entry corresponding to the key in a table.
extern void *MR_ht_lookup_table(const MR_Hash_Table *,
const void *);
// Try to insert a new entry into the table. If the table already had an entry
// with the same key, return the entry that was there before and do not insert
// the new entry. If the entry is new, return NULL.
extern const void *MR_ht_insert_table(const MR_Hash_Table *, void *);
// Return all table entries in a list.
extern MR_Dlist *MR_ht_get_all_entries(const MR_Hash_Table *);
// Process all table entries with the specified function.
extern void MR_ht_process_all_entries(const MR_Hash_Table *,
void f(const void *));
// Convert a string to a positive int. The return value mod the table size
// is a good hash value.
extern int MR_ht_str_to_int(const char *);
// These wrappers around calls to the above functions can avoid the need for
// explicit address-of operators and casts.
#define MR_init_hash_table(t) MR_ht_init_table(&t)
#define MR_lookup_hash_table(t, k) MR_ht_lookup_table(&t, (const void *) k)
#define MR_insert_hash_table(t, e) MR_ht_insert_table(&t, (void *) e)
#define MR_get_all_entries(t) MR_ht_get_all_entries(&t)
#define MR_process_all_entries(t, f) MR_ht_process_all_entries(&t, f)
#define MR_str_to_int(val) MR_ht_str_to_int(val)
#endif // not MERCURY_HASH_TABLE_H