/* Copyright (C) 2002, 2004 Christopher Clark <firstname.lastname@cl.cam.ac.uk>
 * 
 * Modified 2009 by Barret Rhoden <brho@cs.berkeley.edu>
 * Changes include:
 *   - No longer frees keys or values.  It's up to the client to do that.
 *   - Provides common hash and equality functions (meant for longs)
 *   - Uses the slab allocator for hash entry allocation.
 *   - Merges the iterator code with the main hash table code, mostly to avoid
 *   externing the hentry cache.
 *   - hash for each */

#ifndef __ROS_KERN_HASHTABLE_H__
#define __ROS_KERN_HASHTABLE_H__

#ifdef __DEPUTY__
#pragma nodeputy
#endif

#ifdef __SHARC__
#pragma nosharc
#endif

#include <ros/common.h>

/*****************************************************************************/
typedef struct hash_entry
{
    void *k, *v;
    size_t h;
    struct hash_entry *next;
} hash_entry_t;

typedef struct hashtable {
    size_t tablelength;
    hash_entry_t **table;
    size_t entrycount;
    size_t loadlimit;
    size_t primeindex;
    size_t (*hashfn) (void *k);
    ssize_t (*eqfn) (void *k1, void *k2);
} hashtable_t;

static inline size_t indexFor(unsigned int tablelength, unsigned int hashvalue)
{
	return (hashvalue % tablelength);
};

/*****************************************************************************/

/* Example of use:
 *		hashtable_init(); // Do this once during kernel initialization
 *
 *      struct hashtable  *h;
 *      struct some_key   *k;
 *      struct some_value *v;
 *
 *      static size_t         hash_from_key_fn( void *k );
 *      static ssize_t        keys_equal_fn ( void *key1, void *key2 );
 *
 *      h = create_hashtable(16, hash_from_key_fn, keys_equal_fn);
 *      k = (struct some_key *)     kmalloc(sizeof(struct some_key));
 *      v = (struct some_value *)   kmalloc(sizeof(struct some_value));
 *
 *      (initialise k and v to suitable values)
 * 
 *      if (! hashtable_insert(h,k,v) )
 *      {     panic("Hashtable broken...\n");       }
 *
 *      if (NULL == (found = hashtable_search(h,k) ))
 *      {    printk("not found!");                  }
 *
 *      if (NULL == (found = hashtable_remove(h,k) ))
 *      {    printk("Not found\n");                 }
 *
 */

/* Macros may be used to define type-safe(r) hashtable access functions, with
 * methods specialized to take known key and value types as parameters.
 * 
 * Example:
 *
 * Insert this at the start of your file:
 *
 * DEFINE_HASHTABLE_INSERT(insert_some, struct some_key, struct some_value);
 * DEFINE_HASHTABLE_SEARCH(search_some, struct some_key, struct some_value);
 * DEFINE_HASHTABLE_REMOVE(remove_some, struct some_key, struct some_value);
 *
 * This defines the functions 'insert_some', 'search_some' and 'remove_some'.
 * These operate just like hashtable_insert etc., with the same parameters,
 * but their function signatures have 'struct some_key *' rather than
 * 'void *', and hence can generate compile time errors if your program is
 * supplying incorrect data as a key (and similarly for value).
 *
 * Note that the hash and key equality functions passed to create_hashtable
 * still take 'void *' parameters instead of 'some key *'. This shouldn't be
 * a difficult issue as they're only defined and passed once, and the other
 * functions will ensure that only valid keys are supplied to them.
 *
 * The cost for this checking is increased code size and runtime overhead
 * - if performance is important, it may be worth switching back to the
 * unsafe methods once your program has been debugged with the safe methods.
 * This just requires switching to some simple alternative defines - eg:
 * #define insert_some hashtable_insert
 *
 */

/* Call this once on bootup, after initializing the slab allocator.  */
void hashtable_init(void);

/* Common hash/equals functions.  Don't call these directly. */
size_t __generic_hash(void *k);
ssize_t __generic_eq(void *k1, void *k2);

/*****************************************************************************
 * create_hashtable
   
 * @name                    create_hashtable
 * @param   minsize         minimum initial size of hashtable
 * @param   hashfunction    function for hashing keys
 * @param   key_eq_fn       function for determining key equality
 * @return                  newly created hashtable or NULL on failure
 */

hashtable_t *
create_hashtable(size_t minsize,
                 size_t (*hashfunction) (void*),
                 ssize_t (*key_eq_fn) (void*,void*));

/*****************************************************************************
 * hashtable_insert
   
 * @name        hashtable_insert
 * @param   h   the hashtable to insert into
 * @param   k   the key
 * @param   v   the value
 * @return      non-zero for successful insertion
 *
 * This function will cause the table to expand if the insertion would take
 * the ratio of entries to table size over the maximum load factor.
 *
 * This function does not check for repeated insertions with a duplicate key.
 * The value returned when using a duplicate key is undefined -- when
 * the hashtable changes size, the order of retrieval of duplicate key
 * entries is reversed.
 * If in doubt, remove before insert.
 */

ssize_t 
hashtable_insert(hashtable_t *h, void *k, void *v);

#define DEFINE_HASHTABLE_INSERT(fnname, keytype, valuetype) \
ssize_t fnname (hashtable_t *h, keytype *k, valuetype *v) \
{ \
    return hashtable_insert(h,k,v); \
}

/*****************************************************************************
 * hashtable_search
   
 * @name        hashtable_search
 * @param   h   the hashtable to search
 * @param   k   the key to search for
 * @return      the value associated with the key, or NULL if none found
 */

void *
hashtable_search(hashtable_t *h, void *k);

#define DEFINE_HASHTABLE_SEARCH(fnname, keytype, valuetype) \
valuetype * fnname (hashtable_t *h, keytype *k) \
{ \
    return (valuetype *) (hashtable_search(h,k)); \
}

/*****************************************************************************
 * hashtable_remove
   
 * @name        hashtable_remove
 * @param   h   the hashtable to remove the item from
 * @param   k   the key to search for
 * @return      the value associated with the key, or NULL if none found
 *
 * Caller ought to free the key, if appropriate.
 */

void * /* returns value */
hashtable_remove(hashtable_t *h, void *k);

#define DEFINE_HASHTABLE_REMOVE(fnname, keytype, valuetype) \
valuetype * fnname (hashtable_t *h, keytype *k) \
{ \
    return (valuetype *) (hashtable_remove(h,k)); \
}


/*****************************************************************************
 * hashtable_count
   
 * @name        hashtable_count
 * @param   h   the hashtable
 * @return      the number of items stored in the hashtable
 */

size_t
hashtable_count(hashtable_t *h);


/*****************************************************************************
 * hashtable_destroy
   
 * @name        hashtable_destroy
 * @param   h   the hashtable
 *
 * This will not free the values or the keys.  Each user of the hashtable may
 * have a different way of freeing (such as the slab allocator, kfree, or
 * nothing (key is just an integer)).
 *
 * If the htable isn't empty, you ought to iterate through and destroy manually.
 * This will warn if you try to destroy an non-empty htable.
 */

void
hashtable_destroy(hashtable_t *h);

/***************************** Hashtable Iterator ****************************/
/*****************************************************************************/
/* This struct is only concrete here to allow the inlining of two of the
 * accessor functions. */
typedef struct hashtable_itr {
    hashtable_t *h;
    hash_entry_t *e;
    hash_entry_t *parent;
    size_t index;
} hashtable_itr_t;

/*****************************************************************************/
/* hashtable_iterator.  Be sure to kfree this when you are done.
 */

hashtable_itr_t *
hashtable_iterator(hashtable_t *h);

/*****************************************************************************/
/* hashtable_iterator_key
 * - return the key of the (key,value) pair at the current position
 *
 * Keep this in sync with the non-externed version in the .c */

extern inline void *
hashtable_iterator_key(hashtable_itr_t *i)
{
    return i->e->k;
}

/*****************************************************************************/
/* value - return the value of the (key,value) pair at the current position
 *
 * Keep this in sync with the non-externed version in the .c */

extern inline void *
hashtable_iterator_value(hashtable_itr_t *i)
{
    return i->e->v;
}

/*****************************************************************************/
/* advance - advance the iterator to the next element
 *           returns zero if advanced to end of table */

ssize_t
hashtable_iterator_advance(hashtable_itr_t *itr);

/*****************************************************************************/
/* remove - remove current element and advance the iterator to the next element
 *          NB: if you need the key or value to free it, read it before
 *          removing. ie: beware memory leaks!  this will not remove the key.
 *          returns zero if advanced to end of table */

ssize_t
hashtable_iterator_remove(hashtable_itr_t *itr);

/*****************************************************************************/
/* search - overwrite the supplied iterator, to point to the entry
 *          matching the supplied key.
 *          h points to the hashtable to be searched.
 *          returns zero if not found. */
ssize_t
hashtable_iterator_search(hashtable_itr_t *itr,
                          hashtable_t *h, void *k);

#define DEFINE_HASHTABLE_ITERATOR_SEARCH(fnname, keytype) \
ssize_t fnname (hashtable_itr_t *i, hashtable_t *h, keytype *k) \
{ \
    return (hashtable_iterator_search(i,h,k)); \
}

/* Runs func on each member of the hash table */
void hash_for_each(struct hashtable *hash, void func(void*));
/* Same, but removes the item too */
void hash_for_each_remove(struct hashtable *hash, void func(void*));

#endif /* __ROS_KERN_HASHTABLE_H__ */

/*
 * Copyright (c) 2002, 2004, Christopher Clark
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 
 * * Redistributions of source code must retain the above copyright
 * notice, this list of conditions and the following disclaimer.
 * 
 * * Redistributions in binary form must reproduce the above copyright
 * notice, this list of conditions and the following disclaimer in the
 * documentation and/or other materials provided with the distribution.
 * 
 * * Neither the name of the original author; nor the names of any contributors
 * may be used to endorse or promote products derived from this software
 * without specific prior written permission.
 * 
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER
 * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
