Branch: Tag:

2001-12-10

2001-12-10 02:08:17 by Martin Stjernholm <mast@lysator.liu.se>

Multiset implementation using rbtree. --with-new-multisets required to
enable it. There's still no glue to use most of the new features, except
that the iterator (and foreach) works without locking the multiset index,
and that multiset data blocks use copy-on-write (just like mappings).

Rev: src/acconfig.h:1.94
Rev: src/builtin.cmod:1.71
Rev: src/builtin_functions.c:1.416
Rev: src/configure.in:1.562
Rev: src/docode.c:1.137
Rev: src/encode.c:1.133
Rev: src/gc.c:1.178
Rev: src/interpret.c:1.253
Rev: src/iterators.cmod:1.15
Rev: src/main.c:1.138
Rev: src/multiset.c:1.40
Rev: src/multiset.h:1.20
Rev: src/opcodes.c:1.117
Rev: src/operators.c:1.143
Rev: src/pike_types.c:1.183

5:   \*/   /**/   #include "global.h" - RCSID("$Id: builtin_functions.c,v 1.415 2001/12/03 15:46:54 grubba Exp $"); + RCSID("$Id: builtin_functions.c,v 1.416 2001/12/10 02:08:12 mast Exp $");   #include "interpret.h"   #include "svalue.h"   #include "pike_macros.h"
2167:    break;       case T_MULTISET: + #ifdef PIKE_NEW_MULTISETS +  a = multiset_indices (Pike_sp[-args].u.multiset); + #else    a=copy_array(Pike_sp[-args].u.multiset->ind); -  + #endif    break;       case T_OBJECT:
2479:    break;       case T_MULTISET: + #ifdef PIKE_NEW_MULTISETS +  a = multiset_values (Pike_sp[-args].u.multiset); + #else    size=Pike_sp[-args].u.multiset->ind->size;    a=allocate_array_no_init(size,0);    while(--size>=0)
2487:    ITEM(a)[size].subtype=NUMBER_NUMBER;    ITEM(a)[size].u.integer=1;    } + #endif    break;       case T_OBJECT:
3199:    mapping_set_flags(s->u.mapping, flags);    break;    case T_MULTISET: + #ifdef PIKE_NEW_MULTISETS +  flags = multiset_get_flags (s->u.multiset); +  flags = (flags & ~PIKE_WEAK_BOTH) | (ret & PIKE_WEAK_BOTH); +  multiset_set_flags (s->u.multiset, flags); + #else    flags = array_get_flags(s->u.multiset->ind);    SETFLAG(flags,(ARRAY_WEAK_FLAG|ARRAY_WEAK_SHRINK), ret & PIKE_WEAK_INDICES);    s->u.multiset->ind = array_set_flags(s->u.multiset->ind, flags); -  + #endif    break;    default:    SIMPLE_BAD_ARG_ERROR("set_weak_flag",1,"array|mapping|multiset");
6523:    dmalloc_touch_svalue(Pike_sp);    Pike_sp[-args]=Pike_sp[0]; /* move it back */    f_map(args); + #ifdef PIKE_NEW_MULTISETS +  /* FIXME: Handle multisets with values like mappings. */ +  push_multiset (mkmultiset_2 (Pike_sp[-1].u.array, NULL, NULL)); +  free_array (Pike_sp[-2].u.array); +  Pike_sp[-2] = Pike_sp[-1]; +  Pike_sp--; + #else    Pike_sp--; /* allocate_multiset is destructive */    dmalloc_touch_svalue(Pike_sp);    push_multiset(allocate_multiset(Pike_sp->u.array));    order_multiset(sp[-1].u.multiset); -  + #endif    return;       case T_STRING:
6914:    dmalloc_touch_svalue(Pike_sp);    Pike_sp[-args]=Pike_sp[0]; /* move it back */    f_filter(args); + #ifdef PIKE_NEW_MULTISETS +  /* FIXME: Handle multisets with values like mappings. */ +  push_multiset (mkmultiset_2 (Pike_sp[-1].u.array, NULL, NULL)); +  free_array (Pike_sp[-2].u.array); +  Pike_sp[-2] = Pike_sp[-1]; +  Pike_sp--; + #else    Pike_sp--; /* allocate_multiset is destructive */    dmalloc_touch_svalue(Pike_sp);    push_multiset(allocate_multiset(Pike_sp->u.array));    order_multiset(sp[-1].u.multiset); -  + #endif    return;       case T_STRING: