xref: /haiku/src/add-ons/translators/gif/SFHash.cpp (revision 5e4c29a6b7d6cf23b6ea0d9dd22bd4abf5c89c1a)
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 //	File: SFHash.cpp
4 //
5 //	Date: December 1999
6 //
7 //	Author: Daniel Switkin
8 //
9 //	Copyright 2003 (c) by Daniel Switkin. This file is made publically available
10 //	under the BSD license, with the stipulations that this complete header must
11 //	remain at the top of the file indefinitely, and credit must be given to the
12 //	original author in any about box using this software.
13 //
14 ////////////////////////////////////////////////////////////////////////////////
15 
16 // Additional authors:	Stephan Aßmus, <superstippi@gmx.de>
17 //						John Scipione, <jscipione@gmail.com>
18 
19 
20 #include "SFHash.h"
21 
22 #include <stdio.h>
23 #include <stdlib.h>
24 
25 
SFHash(int size)26 SFHash::SFHash(int size) {
27 	fatalerror = false;
28 	this->size = size;
29 	iterate_pos = iterate_depth = 0;
30 	main_array = (HashItem**)malloc(this->size * sizeof(HashItem*));
31 
32 	if (main_array == NULL) {
33 		fatalerror = true;
34 		return;
35 	}
36 
37 	for (int x = 0; x < this->size; x++)
38 		main_array[x] = NULL;
39 }
40 
41 
~SFHash()42 SFHash::~SFHash() {
43 	for (int x = 0; x < size; x++) {
44 		HashItem* item = main_array[x];
45 		while (item != NULL) {
46 			HashItem* t = item->next;
47 			delete item;
48 			item = t;
49 		}
50 	}
51     free(main_array);
52 }
53 
54 
55 void
AddItem(HashItem * item)56 SFHash::AddItem(HashItem* item) {
57 	item->next = NULL;
58 	int pos = item->key % size;
59 
60 	if (main_array[pos] == NULL)
61 		main_array[pos] = item;
62 	else {
63 		HashItem* temp = main_array[pos];
64 		while (temp->next != NULL) temp = temp->next;
65 		temp->next = item;
66 	}
67 }
68 
69 
70 HashItem*
GetItem(unsigned int key)71 SFHash::GetItem(unsigned int key)
72 {
73 	int pos = key % size;
74 	HashItem* item = main_array[pos];
75 
76 	while (item != NULL) {
77 		if (item->key == key) return item;
78 		item = item->next;
79 	}
80 
81 	return NULL;
82 }
83 
84 
85 unsigned int
CountItems()86 SFHash::CountItems()
87 {
88 	unsigned int count = 0;
89 	for (int x = 0; x < this->size; x++) {
90 		HashItem* item = main_array[x];
91 		while (item != NULL) {
92 			count++;
93 			item = item->next;
94 		}
95 	}
96 
97 	return count;
98 }
99 
100 
101 HashItem*
NextItem()102 SFHash::NextItem()
103 {
104 	if (iterate_pos >= size) {
105 		Rewind();
106 		return NULL;
107 	}
108 	HashItem* item;
109 	while ((item = main_array[iterate_pos]) == NULL)
110 		iterate_pos++;
111 
112 	for (int d = 0; d < iterate_depth; d++)
113 		item = item->next;
114 
115 	if (item->next != NULL)
116 		iterate_depth++;
117 	else {
118 		iterate_pos++;
119 		iterate_depth = 0;
120 	}
121 
122 	return item;
123 }
124 
125 
126 void
Rewind()127 SFHash::Rewind() {
128 	iterate_pos = 0;
129 	iterate_depth = 0;
130 }
131