xref: /haiku/src/add-ons/translators/gif/SFHash.cpp (revision 5e4c29a6b7d6cf23b6ea0d9dd22bd4abf5c89c1a)
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ßmus SFHash::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ßmus SFHash::~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 Scipione SFHash::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 Scipione SFHash::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 Scipione SFHash::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 Scipione SFHash::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 Scipione SFHash::Rewind() {
128*5e4c29a6SJohn Scipione 	iterate_pos = 0;
129*5e4c29a6SJohn Scipione 	iterate_depth = 0;
130*5e4c29a6SJohn Scipione }
131