Branch: Tag:

1997-02-17

1997-02-17 20:47:13 by Fredrik Hübinette (Hubbe) <hubbe@hubbe.net>

mappings optimized

Rev: src/ChangeLog:1.77
Rev: src/mapping.c:1.13

4:   ||| See the files COPYING and DISCLAIMER for more information.   \*/   #include "global.h" - RCSID("$Id: mapping.c,v 1.12 1997/02/07 01:11:43 hubbe Exp $"); + RCSID("$Id: mapping.c,v 1.13 1997/02/17 20:47:13 hubbe Exp $");   #include "main.h"   #include "types.h"   #include "object.h"
22:      #define AVG_LINK_LENGTH 4   #define MIN_LINK_LENGTH 1 - #define MAP_SLOTS(X) ((X)+((X)>>4)+8) + #define MAP_SLOTS(X) ((X)?((X)+((X)>>4)+8):0)   #define LOOP(m) for(e=0;e<m->hashsize;e++) for(k=m->hash[e];k;k=k->next)      struct keypair
46: Inside #if defined(DEBUG)
      ind_types=val_types=0;    -  for(e=0;e<m->hashsize;e++) +  LOOP(m)    { -  for(k=m->hash[e];k;k=k->next) -  { +     val_types |= 1 << k->val.type;    ind_types |= 1 << k->ind.type;    } -  } +        if(val_types & ~(m->val_types))    fatal("Mapping value types out of order!\n");
77: Inside #if defined(DEBUG)
  #ifdef DEBUG    if(size < 0) fatal("init_mapping with negative value.\n");   #endif -  if(size<3) size=3; -  +  if(size) +  {    hashsize=size / AVG_LINK_LENGTH + 1;    if(!(hashsize & 1)) hashsize++;    hashspace=hashsize+1;
96:    for(e=1;e<size;e++)    m->free_list[e-1].next = m->free_list + e;    m->free_list[e-1].next=0; -  +  }else{ +  m->hashsize=0; +  m->hash=0; +  m->free_list=0; +  }    m->ind_types = 0;    m->val_types = 0;    m->size = 0;
149:       if(m->next) m->next->prev = m->prev;    +  if(m->hash)    free((char *)m->hash);    free((char *)m);   
195:       init_mapping(m, new_size);    +  if(hash) +  {    for(e=0;e<hashsize;e++)    mapping_rehash_backwards(m, hash[e]);    -  +  free((char *)hash); +  } +    #ifdef DEBUG    if(m->size != tmp)    fatal("Rehash failed, size not same any more.\n");   #endif    -  free((char *)hash); -  +    #ifdef DEBUG    if(d_flag > 1) check_mapping_type_fields(m);   #endif
224:       val_types = ind_types = 0;    -  for(e=0;e<m->hashsize;e++) +  LOOP(m)    { -  for(k=m->hash[e];k;k=k->next) -  { +     val_types |= 1 << k->val.type;    ind_types |= 1 << k->ind.type;    } -  } +       #ifdef DEBUG    if(val_types & ~(m->val_types))
251:    struct svalue *key,    struct svalue *val)   { -  unsigned INT32 h; +  unsigned INT32 h,h2;    struct keypair *k, **prev;    -  h=hash_svalue(key) % m->hashsize; +  h2=hash_svalue(key); +  if(m->hashsize) +  { +  h=h2 % m->hashsize;      #ifdef DEBUG    if(d_flag > 1) check_mapping_type_fields(m);
279:    }    }    } +  }else{ +  h=0; +  }       if(!(k=m->free_list))    { -  rehash(m, m->size * 2 + 1); -  h=hash_svalue(key) % m->hashsize; +  rehash(m, m->size * 2 + 2); +  h=h2 % m->hashsize;    k=m->free_list;    }   
305:    struct svalue *key,    TYPE_T t)   { -  unsigned INT32 h; +  unsigned INT32 h, h2;    struct keypair *k, **prev;    -  h=hash_svalue(key) % m->hashsize; +  h2=hash_svalue(key);    -  +  if(m->hashsize) +  { +  h=h2 % m->hashsize; +    #ifdef DEBUG    if(d_flag > 1) check_mapping_type_fields(m);   #endif
331:    return 0;    }    } +  }else{ +  h=0; +  }       if(!(k=m->free_list))    { -  rehash(m, m->size * 2 + 1); -  h=hash_svalue(key) % m->hashsize; +  rehash(m, m->size * 2 + 2); +  h=h2 % m->hashsize;    k=m->free_list;    }   
365:    unsigned INT32 h;    struct keypair *k, **prev;    +  if(!m->size) return; +     h=hash_svalue(key) % m->hashsize;       for(prev= m->hash + h;k=*prev;prev=&k->next)
399:    if(d_flag > 1) check_mapping_type_fields(m);   #endif    +  if(!m->size) return; +     if((m->ind_types | m->val_types) & (BIT_OBJECT | BIT_FUNCTION))    {    val_types = ind_types = 0;
445: Inside #if defined(DEBUG)
  #ifdef DEBUG    if(d_flag > 1) check_mapping_type_fields(m);   #endif +  if(!m->size) return 0;       if((1 << key->type) & m->ind_types)    {
832:    unsigned INT32 h;    struct keypair *k;    +  if(m->size) +  {    h=0;    k=m->hash[h];    if(start)
864:    }    k=m->hash[++h];    } +  }       to->type=T_INT;    to->subtype=NUMBER_UNDEFINED;
905: Inside #if defined(DEBUG)
   if(m->size > 0 && (!m->ind_types || !m->val_types))    fatal("Mapping type fields are... wrong.\n");    -  if(!m->hash) +  if(!m->hash && m->size)    fatal("Hey! where did my hashtable go??\n");      }