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: pike_types.c,v 1.182 2001/10/05 01:30:13 hubbe Exp $"); + RCSID("$Id: pike_types.c,v 1.183 2001/12/10 02:08:16 mast Exp $");   #include <ctype.h>   #include "svalue.h"   #include "pike_types.h"
3945:    }    return ret;    -  case T_MULTISET: +     case T_ARRAY:    {    struct pike_type *arg_type; -  struct array *a; -  -  if (s->type == T_MULTISET) { -  a = s->u.multiset->ind; -  } else { -  a = s->u.array; -  } +  struct array *a = s->u.array;   #if 0    int i;   
3981:    return pop_unfinished_type();    }    +  case T_MULTISET: +  type_stack_mark(); +  if (multiset_sizeof(s->u.multiset)) { +  push_type(T_MIXED); +  } +  else { +  push_type(T_ZERO); +  } +  push_type(T_MULTISET); +  return pop_unfinished_type();       case T_MAPPING:    type_stack_mark();