2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these libraries and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
24 * $XConsortium: HashTable.cc /main/3 1996/06/11 16:18:45 cde-hal $
26 * Copyright (c) 1991 HaL Computer Systems, Inc. All rights reserved.
27 * UNPUBLISHED -- rights reserved under the Copyright Laws of the United
28 * States. Use of a copyright notice is precautionary only and does not
29 * imply publication or disclosure.
31 * This software contains confidential information and trade secrets of HaL
32 * Computer Systems, Inc. Use, disclosure, or reproduction is prohibited
33 * without the prior express written permission of HaL Computer Systems, Inc.
35 * RESTRICTED RIGHTS LEGEND
36 * Use, duplication, or disclosure by the Government is subject to
37 * restrictions as set forth in subparagraph (c)(l)(ii) of the Rights in
38 * Technical Data and Computer Software clause at DFARS 252.227-7013.
39 * HaL Computer Systems, Inc.
40 * 1315 Dell Avenue, Campbell, CA 95008
55 HashObject(const char *key, FolioObject *object);
58 FolioObject *object();
64 FolioObject *f_object ;
74 HashObject::HashObject(const char *key, FolioObject *object)
78 assert(object != NULL);
80 int len = strlen(key);
81 f_key = new char[len + 1] ;
82 *((char *) memcpy(f_key, key, len) + len) = '\0';
85 HashObject::~HashObject()
87 // NOTE: this is virtual, don't make it inline
88 assert(f_key != NULL);
90 delete f_object ; // delete the object
99 HashTable::~HashTable()
101 ON_DEBUG(cerr << "~HashTable" << endl);
102 for (int i = 0 ; i < HASH_TABLE_SIZE; i++)
103 if (f_table[i] != NULL)
105 List_Iterator<HashObject *> cursor(f_table[i]);
108 delete cursor.item();
109 f_table[i]->remove(cursor);
115 HashTable::HashTable()
117 for (int i = 0 ; i < HASH_TABLE_SIZE; i++)
122 HashTable::add(const char *key, FolioObject *object)
124 int position = hash(key) ;
126 // ON_DEBUG(cerr << "HashTable add " << key << " ==> " << position << endl;);
128 HashObject *hash_object = new HashObject(key, object);
130 assert(hash_object != NULL);
132 if (f_table[position] == NULL)
134 f_table[position] = new xList<HashObject *> ;
137 f_table[position]->insert(hash_object);
143 HashTable::find(const char *key)
145 unsigned int position = hash(key);
147 // ON_DEBUG(cerr << "Hash Table find " << key << " ==> " << position << endl);
149 void *rvalue = NULL ;
151 if (f_table[position] != NULL)
153 List_Iterator<HashObject *> cursor(f_table[position]);
155 for (; cursor; cursor++)
156 if (!strcmp(cursor.item()->key(), key))
158 rvalue = cursor.item()->object();
166 HashTable::hash (const char *key)
168 return string_hash(key) % HASH_TABLE_SIZE;