| 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 | |