1 : //=============================================================================
2 : // File <$/src/cpp/prod/tool/Hash.cpp>
3 : // This file is part of YaOrb : Yet Another Object Request Broker,
4 : // Copyright (c) 2000-2003, Marc Alff.
5 : //
6 : // This program is free software; you can redistribute it and/or
7 : // modify it under the terms of the GNU General Public License
8 : // as published by the Free Software Foundation; either version 2
9 : // of the License, or (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program; if not, write to the Free Software
18 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
19 : //
20 : //=============================================================================
21 :
22 : #include <stdio.h>
23 :
24 : #include "src/cpp/prod/tool/SList.h"
25 : #include "src/cpp/prod/tool/Hash.h"
26 :
27 150234 : VoidHash::VoidHash(HashFn hashFn, CmpFn cmpFn, int size)
28 147 : : _size(size), _table(NULL), _hashFn(hashFn), _cmpFn(cmpFn)
29 : {
30 150234 : _table = new SList[_size] ;
31 : }
32 :
33 0 : VoidHash::~VoidHash()
34 : {
35 0 : delete [] _table ;
36 0 : }
37 :
38 4 : void* VoidHash::FindByKey(const void* key)
39 : {
40 4 : int i = index(key) ;
41 4 : SListIterator it(_table[i]) ;
42 : void *obj = NULL ;
43 :
44 8 : while (it.GetNext())
45 : {
46 4 : obj = it.GetItem() ;
47 :
48 4 : if ((*_cmpFn)(obj, key))
49 : {
50 : return obj ;
51 : }
52 : }
53 :
54 0 : return NULL ;
55 : }
56 :
57 0 : void* VoidHash::RemoveByKey(const void* key)
58 : {
59 0 : int i = index(key) ;
60 0 : SListIterator it(_table[i]) ;
61 : void *obj = NULL ;
62 :
63 0 : while (it.GetNext())
64 : {
65 0 : obj = it.GetItem() ;
66 :
67 0 : if ((*_cmpFn)(obj, key))
68 : {
69 0 : _table[i].removeObject(obj) ;
70 : return obj ;
71 : }
72 : }
73 :
74 0 : return NULL ;
75 : }
76 :
77 24 : void VoidHash::Insert(void *obj, const void* key)
78 : {
79 24 : int i = index(key) ;
80 24 : _table[i].addTail(obj) ;
81 : }
82 :
83 28 : int VoidHash::index(const void* key)
84 : {
85 28 : int i = (*_hashFn)(key) ;
86 : i = i % _size ;
87 : return i ;
88 : }
89 :
|