19949213aSStephan Aßmus //////////////////////////////////////////////////////////////////////////////// 29949213aSStephan Aßmus // 39949213aSStephan Aßmus // File: SFHash.cpp 49949213aSStephan Aßmus // 59949213aSStephan Aßmus // Date: December 1999 69949213aSStephan Aßmus // 79949213aSStephan Aßmus // Author: Daniel Switkin 89949213aSStephan Aßmus // 99949213aSStephan Aßmus // Copyright 2003 (c) by Daniel Switkin. This file is made publically available 109949213aSStephan Aßmus // under the BSD license, with the stipulations that this complete header must 119949213aSStephan Aßmus // remain at the top of the file indefinitely, and credit must be given to the 129949213aSStephan Aßmus // original author in any about box using this software. 139949213aSStephan Aßmus // 149949213aSStephan Aßmus //////////////////////////////////////////////////////////////////////////////// 159949213aSStephan Aßmus 169949213aSStephan Aßmus // Additional authors: Stephan Aßmus, <superstippi@gmx.de> 17*5e4c29a6SJohn Scipione // John Scipione, <jscipione@gmail.com> 18*5e4c29a6SJohn Scipione 199949213aSStephan Aßmus 209949213aSStephan Aßmus #include "SFHash.h" 21*5e4c29a6SJohn Scipione 229949213aSStephan Aßmus #include <stdio.h> 23*5e4c29a6SJohn Scipione #include <stdlib.h> 24*5e4c29a6SJohn Scipione 259949213aSStephan Aßmus SFHash(int size)269949213aSStephan AßmusSFHash::SFHash(int size) { 279949213aSStephan Aßmus fatalerror = false; 289949213aSStephan Aßmus this->size = size; 299949213aSStephan Aßmus iterate_pos = iterate_depth = 0; 30f3780ae8SAlex Smith main_array = (HashItem**)malloc(this->size * sizeof(HashItem*)); 319949213aSStephan Aßmus 329949213aSStephan Aßmus if (main_array == NULL) { 339949213aSStephan Aßmus fatalerror = true; 349949213aSStephan Aßmus return; 359949213aSStephan Aßmus } 36*5e4c29a6SJohn Scipione 37*5e4c29a6SJohn Scipione for (int x = 0; x < this->size; x++) 389949213aSStephan Aßmus main_array[x] = NULL; 399949213aSStephan Aßmus } 409949213aSStephan Aßmus 419949213aSStephan Aßmus ~SFHash()429949213aSStephan AßmusSFHash::~SFHash() { 439949213aSStephan Aßmus for (int x = 0; x < size; x++) { 449949213aSStephan Aßmus HashItem* item = main_array[x]; 459949213aSStephan Aßmus while (item != NULL) { 469949213aSStephan Aßmus HashItem* t = item->next; 479949213aSStephan Aßmus delete item; 489949213aSStephan Aßmus item = t; 499949213aSStephan Aßmus } 509949213aSStephan Aßmus } 519949213aSStephan Aßmus free(main_array); 529949213aSStephan Aßmus } 539949213aSStephan Aßmus 54*5e4c29a6SJohn Scipione 55*5e4c29a6SJohn Scipione void AddItem(HashItem * item)56*5e4c29a6SJohn ScipioneSFHash::AddItem(HashItem* item) { 57*5e4c29a6SJohn Scipione item->next = NULL; 58*5e4c29a6SJohn Scipione int pos = item->key % size; 59*5e4c29a6SJohn Scipione 60*5e4c29a6SJohn Scipione if (main_array[pos] == NULL) 61*5e4c29a6SJohn Scipione main_array[pos] = item; 62*5e4c29a6SJohn Scipione else { 63*5e4c29a6SJohn Scipione HashItem* temp = main_array[pos]; 64*5e4c29a6SJohn Scipione while (temp->next != NULL) temp = temp->next; 65*5e4c29a6SJohn Scipione temp->next = item; 66*5e4c29a6SJohn Scipione } 67*5e4c29a6SJohn Scipione } 68*5e4c29a6SJohn Scipione 69*5e4c29a6SJohn Scipione 70*5e4c29a6SJohn Scipione HashItem* GetItem(unsigned int key)71*5e4c29a6SJohn ScipioneSFHash::GetItem(unsigned int key) 72*5e4c29a6SJohn Scipione { 73*5e4c29a6SJohn Scipione int pos = key % size; 74*5e4c29a6SJohn Scipione HashItem* item = main_array[pos]; 75*5e4c29a6SJohn Scipione 76*5e4c29a6SJohn Scipione while (item != NULL) { 77*5e4c29a6SJohn Scipione if (item->key == key) return item; 78*5e4c29a6SJohn Scipione item = item->next; 79*5e4c29a6SJohn Scipione } 80*5e4c29a6SJohn Scipione 81*5e4c29a6SJohn Scipione return NULL; 82*5e4c29a6SJohn Scipione } 83*5e4c29a6SJohn Scipione 84*5e4c29a6SJohn Scipione 85*5e4c29a6SJohn Scipione unsigned int CountItems()86*5e4c29a6SJohn ScipioneSFHash::CountItems() 87*5e4c29a6SJohn Scipione { 88*5e4c29a6SJohn Scipione unsigned int count = 0; 89*5e4c29a6SJohn Scipione for (int x = 0; x < this->size; x++) { 90*5e4c29a6SJohn Scipione HashItem* item = main_array[x]; 91*5e4c29a6SJohn Scipione while (item != NULL) { 92*5e4c29a6SJohn Scipione count++; 93*5e4c29a6SJohn Scipione item = item->next; 94*5e4c29a6SJohn Scipione } 95*5e4c29a6SJohn Scipione } 96*5e4c29a6SJohn Scipione 97*5e4c29a6SJohn Scipione return count; 98*5e4c29a6SJohn Scipione } 99*5e4c29a6SJohn Scipione 100*5e4c29a6SJohn Scipione 101*5e4c29a6SJohn Scipione HashItem* NextItem()102*5e4c29a6SJohn ScipioneSFHash::NextItem() 103*5e4c29a6SJohn Scipione { 104*5e4c29a6SJohn Scipione if (iterate_pos >= size) { 105*5e4c29a6SJohn Scipione Rewind(); 106*5e4c29a6SJohn Scipione return NULL; 107*5e4c29a6SJohn Scipione } 108*5e4c29a6SJohn Scipione HashItem* item; 109*5e4c29a6SJohn Scipione while ((item = main_array[iterate_pos]) == NULL) 110*5e4c29a6SJohn Scipione iterate_pos++; 111*5e4c29a6SJohn Scipione 112*5e4c29a6SJohn Scipione for (int d = 0; d < iterate_depth; d++) 113*5e4c29a6SJohn Scipione item = item->next; 114*5e4c29a6SJohn Scipione 115*5e4c29a6SJohn Scipione if (item->next != NULL) 116*5e4c29a6SJohn Scipione iterate_depth++; 117*5e4c29a6SJohn Scipione else { 118*5e4c29a6SJohn Scipione iterate_pos++; 119*5e4c29a6SJohn Scipione iterate_depth = 0; 120*5e4c29a6SJohn Scipione } 121*5e4c29a6SJohn Scipione 122*5e4c29a6SJohn Scipione return item; 123*5e4c29a6SJohn Scipione } 124*5e4c29a6SJohn Scipione 125*5e4c29a6SJohn Scipione 126*5e4c29a6SJohn Scipione void Rewind()127*5e4c29a6SJohn ScipioneSFHash::Rewind() { 128*5e4c29a6SJohn Scipione iterate_pos = 0; 129*5e4c29a6SJohn Scipione iterate_depth = 0; 130*5e4c29a6SJohn Scipione } 131