/* 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;

size_t hash(struct hashtable *h, void *k);
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.
*/
