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> 179949213aSStephan Aßmus 189949213aSStephan Aßmus #include "SFHash.h" 199949213aSStephan Aßmus #include <stdlib.h> 209949213aSStephan Aßmus #include <stdio.h> 219949213aSStephan Aßmus 229949213aSStephan Aßmus SFHash::SFHash(int size) { 239949213aSStephan Aßmus fatalerror = false; 249949213aSStephan Aßmus this->size = size; 259949213aSStephan Aßmus iterate_pos = iterate_depth = 0; 26*f3780ae8SAlex Smith main_array = (HashItem **)malloc(this->size * sizeof(HashItem *)); 279949213aSStephan Aßmus 289949213aSStephan Aßmus if (main_array == NULL) { 299949213aSStephan Aßmus fatalerror = true; 309949213aSStephan Aßmus return; 319949213aSStephan Aßmus } 329949213aSStephan Aßmus for (int x = 0; x < this->size; x++) { 339949213aSStephan Aßmus main_array[x] = NULL; 349949213aSStephan Aßmus } 359949213aSStephan Aßmus } 369949213aSStephan Aßmus 379949213aSStephan Aßmus void SFHash::AddItem(HashItem *item) { 389949213aSStephan Aßmus item->next = NULL; 399949213aSStephan Aßmus int pos = item->key % size; 409949213aSStephan Aßmus 419949213aSStephan Aßmus if (main_array[pos] == NULL) { 429949213aSStephan Aßmus main_array[pos] = item; 439949213aSStephan Aßmus } 449949213aSStephan Aßmus else { 459949213aSStephan Aßmus HashItem *temp = main_array[pos]; 469949213aSStephan Aßmus while (temp->next != NULL) temp = temp->next; 479949213aSStephan Aßmus temp->next = item; 489949213aSStephan Aßmus } 499949213aSStephan Aßmus } 509949213aSStephan Aßmus 519949213aSStephan Aßmus HashItem* 529949213aSStephan Aßmus SFHash::GetItem(unsigned int key) 539949213aSStephan Aßmus { 549949213aSStephan Aßmus int pos = key % size; 559949213aSStephan Aßmus HashItem *item = main_array[pos]; 569949213aSStephan Aßmus 579949213aSStephan Aßmus while (item != NULL) { 589949213aSStephan Aßmus if (item->key == key) return item; 599949213aSStephan Aßmus item = item->next; 609949213aSStephan Aßmus } 619949213aSStephan Aßmus return NULL; 629949213aSStephan Aßmus } 639949213aSStephan Aßmus 649949213aSStephan Aßmus unsigned int 659949213aSStephan Aßmus SFHash::CountItems() 669949213aSStephan Aßmus { 679949213aSStephan Aßmus unsigned int count = 0; 689949213aSStephan Aßmus for (int x = 0; x < this->size; x++) { 699949213aSStephan Aßmus HashItem *item = main_array[x]; 709949213aSStephan Aßmus while (item != NULL) { 719949213aSStephan Aßmus count++; 729949213aSStephan Aßmus item = item->next; 739949213aSStephan Aßmus } 749949213aSStephan Aßmus } 759949213aSStephan Aßmus return count; 769949213aSStephan Aßmus } 779949213aSStephan Aßmus 789949213aSStephan Aßmus HashItem* 799949213aSStephan Aßmus SFHash::NextItem() 809949213aSStephan Aßmus { 819949213aSStephan Aßmus if (iterate_pos >= size) { 829949213aSStephan Aßmus Rewind(); 839949213aSStephan Aßmus return NULL; 849949213aSStephan Aßmus } 859949213aSStephan Aßmus HashItem *item; 869949213aSStephan Aßmus while ((item = main_array[iterate_pos]) == NULL) iterate_pos++; 879949213aSStephan Aßmus for (int d = 0; d < iterate_depth; d++) { 889949213aSStephan Aßmus item = item->next; 899949213aSStephan Aßmus } 909949213aSStephan Aßmus 919949213aSStephan Aßmus if (item->next != NULL) iterate_depth++; 929949213aSStephan Aßmus else { 939949213aSStephan Aßmus iterate_pos++; 949949213aSStephan Aßmus iterate_depth = 0; 959949213aSStephan Aßmus } 969949213aSStephan Aßmus return item; 979949213aSStephan Aßmus } 989949213aSStephan Aßmus 999949213aSStephan Aßmus void SFHash::Rewind() { 1009949213aSStephan Aßmus iterate_pos = 0; 1019949213aSStephan Aßmus iterate_depth = 0; 1029949213aSStephan Aßmus } 1039949213aSStephan Aßmus 1049949213aSStephan Aßmus SFHash::~SFHash() { 1059949213aSStephan Aßmus for (int x = 0; x < size; x++) { 1069949213aSStephan Aßmus HashItem *item = main_array[x]; 1079949213aSStephan Aßmus while (item != NULL) { 1089949213aSStephan Aßmus HashItem *t = item->next; 1099949213aSStephan Aßmus delete item; 1109949213aSStephan Aßmus item = t; 1119949213aSStephan Aßmus } 1129949213aSStephan Aßmus } 1139949213aSStephan Aßmus free(main_array); 1149949213aSStephan Aßmus } 1159949213aSStephan Aßmus 116