/* 
   Unix SMB/CIFS implementation.

   Copyright (C) Ying Chen 2000.
   
   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 2 of the License, or
   (at your option) any later version.
   
   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   
   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/

#ifndef	_HASH_H_
#define	_HASH_H_

#define MAX_HASH_TABLE_SIZE    16384
#define HASH_TABLE_INCREMENT  2

typedef int (*compare_function)(char *, char *);
typedef int (*hash_function)(int, char *);

/*
 * lru_link: links the node to the LRU list.
 * hash_elem: the pointer to the element that is tied onto the link.
 */
typedef struct lru_node {
        ubi_dlNode lru_link;
        void *hash_elem;
} lru_node;

/* 
 * bucket_link: link the hash element to the bucket chain that it belongs to.
 * lru_link: this element ties the hash element to the lru list. 
 * bucket: a pointer to the hash bucket that this element belongs to.
 * value: a pointer to the hash element content. It can be anything.
 * key: stores the string key. The hash_element is always allocated with
 * more memory space than the structure shown below to accomodate the space
 * used for the whole string. But the memory is always appended at the 
 * end of the structure, so keep "key" at the end of the structure.
 * Don't move it.
 */
typedef struct hash_element {
        ubi_dlNode	bucket_link;          
        lru_node    lru_link;
        ubi_dlList	*bucket;
        void	*value;		
        char key[1];	
} hash_element;

/*
 * buckets: a list of buckets, implemented as a dLinkList. 
 * lru_chain: the lru list of all the hash elements. 
 * num_elements: the # of elements in the hash table.
 * size: the hash table size.
 * comp_func: the compare function used during hash key comparisons.
 */

typedef struct hash_table {
        ubi_dlList      *buckets;
        ubi_dlList      lru_chain;     
        unsigned     num_elements;	
        unsigned     size;
        compare_function        comp_func; 
} hash_table;

#endif /* _HASH_H_ */
