1 | #include "dthdr.h" |
2 | |
3 | |
4 | /* Renew the object at the current finger. |
5 | ** |
6 | ** Written by Kiem-Phong Vo (5/25/96) |
7 | */ |
8 | |
9 | void* dtrenew(Dt_t* dt, reg void* obj) |
10 | { |
11 | reg void* key; |
12 | reg Dtlink_t *e, *t, **s; |
13 | reg Dtdisc_t* disc = dt->disc; |
14 | |
15 | UNFLATTEN(dt); |
16 | |
17 | if(!(e = dt->data->here) || _DTOBJ(e,disc->link) != obj) |
18 | return NIL(void*); |
19 | |
20 | if(dt->data->type&(DT_STACK|DT_QUEUE|DT_LIST)) |
21 | return obj; |
22 | else if(dt->data->type&(DT_OSET|DT_OBAG) ) |
23 | { if(!e->right ) /* make left child the new root */ |
24 | dt->data->here = e->left; |
25 | else /* make right child the new root */ |
26 | { dt->data->here = e->right; |
27 | |
28 | /* merge left subtree to right subtree */ |
29 | if(e->left) |
30 | { for(t = e->right; t->left; t = t->left) |
31 | ; |
32 | t->left = e->left; |
33 | } |
34 | } |
35 | } |
36 | else /*if(dt->data->type&(DT_SET|DT_BAG))*/ |
37 | { s = dt->data->htab + HINDEX(dt->data->ntab,e->hash); |
38 | if((t = *s) == e) |
39 | *s = e->right; |
40 | else |
41 | { for(; t->right != e; t = t->right) |
42 | ; |
43 | t->right = e->right; |
44 | } |
45 | key = _DTKEY(obj,disc->key,disc->size); |
46 | e->hash = _DTHSH(dt,key,disc,disc->size); |
47 | dt->data->here = NIL(Dtlink_t*); |
48 | } |
49 | |
50 | dt->data->size -= 1; |
51 | return (*dt->meth->searchf)(dt,(void*)e,DT_RENEW) ? obj : NIL(void*); |
52 | } |
53 | |