source: vis_dev/glu-2.3/src/cmuBdd/bddhash.c @ 88

Last change on this file since 88 was 13, checked in by cecile, 13 years ago

library glu 2.3

File size: 2.6 KB
RevLine 
[13]1/* BDD hash table routines */
2
3
4#include "bddint.h"
5
6
7#define HASH(d) ((INT_PTR)(d))
8
9
10/* bdd_rehash_hash_table(h) increases the size of h by roughly a */
11/* factor of 2 and rehashes all of its entries. */
12
13static
14void
15bdd_rehash_hash_table(hash_table h)
16{
17  long i;
18  long hash;
19  long oldsize;
20  hash_rec *newtable;
21  hash_rec p, q;
22
23  oldsize=h->size;
24  h->size_index++;
25  h->size=TABLE_SIZE(h->size_index);
26  newtable=(hash_rec *)mem_get_block((SIZE_T)(h->size*sizeof(hash_rec)));
27  for (i=0; i < h->size; ++i)
28    newtable[i]=0;
29  for (i=0; i < oldsize; ++i)
30    for (p=h->table[i]; p; p=q)
31      {
32        q=p->next;
33        hash=HASH(p->key);
34        BDD_REDUCE(hash, h->size);
35        p->next=newtable[hash];
36        newtable[hash]=p;
37      }
38  mem_free_block((pointer)h->table);
39  h->table=newtable;
40}
41
42
43/* bdd_insert_in_hash_table(h, f, data) associates the specified data */
44/* with f in h. */
45
46void
47bdd_insert_in_hash_table(hash_table h, bdd f, pointer data)
48{
49  long hash;
50  hash_rec p;
51
52  p=(hash_rec)BDD_NEW_REC(h->bddm, ALIGN(sizeof(struct hash_rec_))+h->item_size);
53  p->key=f;
54  mem_copy((pointer)(ALIGN(sizeof(struct hash_rec_))+(INT_PTR)p), data, (SIZE_T)h->item_size);
55  hash=HASH(f);
56  BDD_REDUCE(hash, h->size);
57  p->next=h->table[hash];
58  h->table[hash]=p;
59  h->entries++;
60  if ((h->size << 2) < h->entries)
61    bdd_rehash_hash_table(h);
62}
63
64
65/* bdd_lookup_in_hash_table(h, f) looks up f in h and returns either a */
66/* pointer to the associated data or null. */
67
68pointer
69bdd_lookup_in_hash_table(hash_table h, bdd f)
70{
71  long hash;
72  hash_rec p;
73
74  hash=HASH(f);
75  BDD_REDUCE(hash, h->size);
76  for (p=h->table[hash]; p; p=p->next)
77    if (p->key == f)
78      return ((pointer)(ALIGN(sizeof(struct hash_rec_))+(char *)p));
79  return ((pointer)0);
80}
81
82
83/* bdd_new_hash_table(bddm, item_size) creates a new hash table with */
84/* the specified data item size. */
85
86hash_table
87bdd_new_hash_table(cmu_bdd_manager bddm, int item_size)
88{
89  long i;
90  hash_table h;
91
92  h=(hash_table)BDD_NEW_REC(bddm, sizeof(struct hash_table_));
93  h->size_index=10;
94  h->size=TABLE_SIZE(h->size_index);
95  h->table=(hash_rec *)mem_get_block((SIZE_T)(h->size*sizeof(hash_rec)));
96  for (i=0; i < h->size; ++i)
97    h->table[i]=0;
98  h->entries=0;
99  h->item_size=item_size;
100  h->bddm=bddm;
101  return (h);
102}
103
104
105/* cmu_bdd_free_hash_table(h) frees up the storage associated with h. */
106
107void
108cmu_bdd_free_hash_table(hash_table h)
109{
110  long i;
111  hash_rec p, q;
112
113  for (i=0; i < h->size; ++i)
114    for (p=h->table[i]; p; p=q)
115      {
116        q=p->next;
117        BDD_FREE_REC(h->bddm, (pointer)p, ALIGN(sizeof(struct hash_rec_))+h->item_size);
118      }
119  mem_free_block((pointer)h->table);
120  BDD_FREE_REC(h->bddm, (pointer)h, sizeof(struct hash_table_));
121}
Note: See TracBrowser for help on using the repository browser.