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
9void* 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