All pastes #435903 Raw Edit

Mine

public text v1 · immutable
·published 2007-04-12 06:19 UTC
rendered paste body
void *
MapPtr_set(MapPtr *self, void *key, void *data)
{
   unsigned long index;
   unsigned int tries;
   MapPtr_node temp1;
   MapPtr_node temp2;
   void *replaced_data = NULL;
   
   /* if key is in use, insert new data and return replaced data */
   index = MapPtr_hash1(self, key);
   if(self->table1[index].key == key) {
      replaced_data = self->table1[index].data;
      self->table1[index].data = data;
      return replaced_data;
   }
   index = MapPtr_hash2(self, key);
   if(self->table2[index].key == key) {
      replaced_data = self->table2[index].data;
      self->table2[index].data = data;
      return replaced_data;
   }

   /* allocation normally happens here */
   temp1.key = key;
   temp1.data = data;

   for(;;) {
      tries = MAPPTR_TRIES_PER_TABLE;
      while(tries--) {
         index = MapPtr_hash1(self, temp1.key);
         if(self->table1[index].key) {
            temp2 = self->table1[index];
            self->table1[index] = temp1;
         } else {
            self->table1[index] = temp1;
            return NULL;
         }
         index = MapPtr_hash2(self, temp2.key);
         if(self->table2[index].key) {
            temp1 = self->table2[index];
            self->table2[index] = temp2;
         } else {
            self->table2[index] = temp2;
            return NULL;
         }
      }
      MapPtr_grow(self);  /* might fail, but by this time, temp1 might be already in the table */
   }
}