ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/src/vendor/perl/5.18.1/NetWare/nwhashcls.cpp
Revision: 6435
Committed: Mon Dec 2 04:40:05 2013 UTC (10 years, 5 months ago) by laffer1
File size: 5208 byte(s)
Log Message:
tag perl 5.18.1

File Contents

# Content
1 /*
2 * Copyright © 2001 Novell, Inc. All Rights Reserved.
3 *
4 * You may distribute under the terms of either the GNU General Public
5 * License or the Artistic License, as specified in the README file.
6 *
7 */
8
9 /*
10 * FILENAME : hashcls.cpp
11 * DESCRIPTION : Implementation of Equivalent of Hash class, NWPerlHashList and
12 NWPerlKeyHashList
13 *
14 * Author : Srivathsa M
15 * Date Created : July 26 2001
16 */
17
18 #include "nwhashcls.h"
19
20 NWPerlHashList::NWPerlHashList()
21 {
22 //initialize the hash list to null
23 for(int i=0;i<BUCKET_SIZE;i++)
24 MemListHash[i] = NULL;
25 DEBUGPRINT("In constructor\n");
26 }
27
28 NWPerlHashList::~NWPerlHashList()
29 {
30 DEBUGPRINT("In destructor\n");
31 removeAll();
32 }
33
34 int
35 NWPerlHashList::insert(void *ldata)
36 {
37 HASHNODE *list = new HASHNODE;
38 if (list) {
39 list->data = ldata;
40 list->next = NULL;
41 unsigned long Bucket = ((unsigned long)ldata) % BUCKET_SIZE;
42 if (MemListHash[Bucket]) {
43 //Elements existing, insert at the beginning
44 list->next = MemListHash[Bucket];
45 MemListHash[Bucket] = list;
46 DEBUGPRINT("Inserted to %d\n",Bucket);
47 } else {
48 //First element
49 MemListHash[Bucket] = list;
50 DEBUGPRINT("Inserted first time to %d\n",Bucket);
51 }
52 return 1;
53 } else
54 return 0;
55 }
56
57 int
58 NWPerlHashList::remove(void *ldata)
59 {
60 unsigned long Bucket = ((unsigned long)ldata) % BUCKET_SIZE;
61 HASHNODE *list = MemListHash[Bucket];
62 if (list) {
63 int found = 0;
64 HASHNODE *next =list;
65 HASHNODE *prev =NULL;
66 do
67 {
68 if (list->data != ldata) {
69 prev = list;
70 list = list->next;
71 }
72 else {
73 found = 1;
74 next = list->next;
75 /*if(list->data)
76 {
77 free(list->data);
78 list->data = NULL;
79 }*/
80 //ConsolePrintf ("A:%x;",list->data);
81 delete list;
82 list = NULL;
83 if (prev) {
84 prev->next = next;
85 } else {
86 MemListHash[Bucket]=next;
87 }
88 DEBUGPRINT("Removed element from %d\n",Bucket);
89 }
90 ThreadSwitchWithDelay();
91 } while(list && !found);
92 // if (!found)
93 // ConsolePrintf("Couldn;t find %x in Bucket %d\n",ldata,Bucket);
94 return(found);
95 }
96 return 1;
97 }
98
99
100 void NWPerlHashList::forAll( void (*user_fn)(void *, void*), void *data ) const
101 {
102
103 for(int i=0; i<BUCKET_SIZE; i++)
104 {
105 HASHNODE *next = MemListHash[i];
106 while(next)
107 {
108 HASHNODE *temp = next->next;
109 if(next->data)
110 {
111 DEBUGPRINT("- To remove element from bucket %d\n",i);
112 user_fn( next->data, data );
113 }
114 next = temp;
115 ThreadSwitchWithDelay();
116 }
117 }
118 return ;
119 };
120
121 void NWPerlHashList::removeAll( ) const
122 {
123
124 for(int i=0; i<BUCKET_SIZE; i++)
125 {
126 HASHNODE *next = MemListHash[i];
127 while(next)
128 {
129 HASHNODE *temp = next->next;
130 delete next;
131 next = temp;
132 ThreadSwitchWithDelay();
133 }
134 }
135 return ;
136 };
137
138 /**
139 NWPerlKeyHashList::NWPerlKeyHashList()
140 {
141 //initialize the hash list to null
142 for(int i=0;i<BUCKET_SIZE;i++)
143 MemListHash[i] = NULL;
144 DEBUGPRINT("In constructor\n");
145 }
146
147 NWPerlKeyHashList::~NWPerlKeyHashList()
148 {
149 DEBUGPRINT("In destructor\n");
150 removeAll();
151 }
152
153 int
154 NWPerlKeyHashList::insert(void *key, void *ldata)
155 {
156 KEYHASHNODE *list = new KEYHASHNODE;
157 if (list) {
158 list->key = key;
159 list->data = ldata;
160 list->next = NULL;
161 unsigned long Bucket = ((unsigned long)key) % BUCKET_SIZE;
162 if (MemListHash[Bucket]) {
163 //Elements existing, insert at the beginning
164 list->next = MemListHash[Bucket];
165 MemListHash[Bucket] = list;
166 DEBUGPRINT("Inserted to %d\n",Bucket);
167 } else {
168 //First element
169 MemListHash[Bucket] = list;
170 DEBUGPRINT("Inserted first time to %d\n",Bucket);
171 }
172 return 1;
173 } else
174 return 0;
175 }
176
177 int
178 NWPerlKeyHashList::remove(void *key)
179 {
180 unsigned long Bucket = ((unsigned long)key) % BUCKET_SIZE;
181 KEYHASHNODE *list = MemListHash[Bucket];
182 if (list) {
183 int found = 0;
184 KEYHASHNODE *next =list;
185 KEYHASHNODE *prev =NULL;
186 do
187 {
188 if (list->key != key) {
189 prev = list;
190 list = list->next;
191 }
192 else {
193 found = 1;
194 next = list->next;
195 delete list;
196 list = NULL;
197 if (prev) {
198 prev->next = next;
199 } else {
200 MemListHash[Bucket]=next;
201 }
202 DEBUGPRINT("Removed element from %d\n",Bucket);
203 }
204 } while(list && !found);
205 // if (!found)
206 // ConsolePrintf("Couldn;t find %x in Bucket %d\n",key,Bucket);
207 return(found);
208 }
209 return 1;
210 }
211
212
213 void NWPerlKeyHashList::forAll( void (*user_fn)(void *, void*), void *data ) const
214 {
215
216 for(int i=0; i<BUCKET_SIZE; i++)
217 {
218 KEYHASHNODE *next = MemListHash[i];
219 while(next)
220 {
221 KEYHASHNODE *temp = next->next;
222 if(next->data)
223 {
224 DEBUGPRINT("- To remove element from bucket %d\n",i);
225 user_fn( next->data, data );
226 }
227 next = temp;
228 ThreadSwitchWithDelay();
229 }
230 }
231 return ;
232 };
233
234 int NWPerlKeyHashList::find(void *key,void **pData)
235 {
236 for(int i=0; i<BUCKET_SIZE; i++)
237 {
238 KEYHASHNODE *next = MemListHash[i];
239 while(next)
240 {
241 if(next->key==key)
242 {
243 *pData=next->data;
244 return 1;
245 }
246 next = next->next;
247 ThreadSwitchWithDelay();
248 }
249 }
250 return 0;
251 }
252
253 void NWPerlKeyHashList::removeAll( ) const
254 {
255
256 for(int i=0; i<BUCKET_SIZE; i++)
257 {
258 KEYHASHNODE *next = MemListHash[i];
259 while(next)
260 {
261 KEYHASHNODE *temp = next->next;
262 delete next;
263 next = temp;
264 ThreadSwitchWithDelay();
265 }
266 }
267 return ;
268 };
269 **/