Fixed up a few small bugs in the syscall_server stuff
[akaros.git] / kern / include / hashtable_itr.h
1 /* Copyright (C) 2002, 2004 Christopher Clark <firstname.lastname@cl.cam.ac.uk> */
2
3 #ifndef __ROS_KERN_HASHTABLE_ITR_H__
4 #define ___ROS_KERN_HASHTABLE_ITR_H__
5
6 #include <hashtable.h>
7
8 /*****************************************************************************/
9 /* This struct is only concrete here to allow the inlining of two of the
10  * accessor functions. */
11 typedef struct hashtable_itr {
12     hashtable_t *h;
13     hash_entry_t *e;
14     hash_entry_t *parent;
15     size_t index;
16 } hashtable_itr_t;
17
18 /*****************************************************************************/
19 /* hashtable_iterator
20  */
21
22 hashtable_itr_t *
23 hashtable_iterator(hashtable_t *h);
24
25 /*****************************************************************************/
26 /* hashtable_iterator_key
27  * - return the value of the (key,value) pair at the current position */
28
29 extern inline void *
30 hashtable_iterator_key(hashtable_itr_t *i)
31 {
32     return i->e->k;
33 }
34
35 /*****************************************************************************/
36 /* value - return the value of the (key,value) pair at the current position */
37
38 extern inline void *
39 hashtable_iterator_value(hashtable_itr_t *i)
40 {
41     return i->e->v;
42 }
43
44 /*****************************************************************************/
45 /* advance - advance the iterator to the next element
46  *           returns zero if advanced to end of table */
47
48 ssize_t
49 hashtable_iterator_advance(hashtable_itr_t *itr);
50
51 /*****************************************************************************/
52 /* remove - remove current element and advance the iterator to the next element
53  *          NB: if you need the value to free it, read it before
54  *          removing. ie: beware memory leaks!
55  *          returns zero if advanced to end of table */
56
57 ssize_t
58 hashtable_iterator_remove(hashtable_itr_t *itr);
59
60 /*****************************************************************************/
61 /* search - overwrite the supplied iterator, to point to the entry
62  *          matching the supplied key.
63             h points to the hashtable to be searched.
64  *          returns zero if not found. */
65 ssize_t
66 hashtable_iterator_search(hashtable_itr_t *itr,
67                           hashtable_t *h, void *k);
68
69 #define DEFINE_HASHTABLE_ITERATOR_SEARCH(fnname, keytype) \
70 ssize_t fnname (hashtable_itr_t *i, hashtable_t *h, keytype *k) \
71 { \
72     return (hashtable_iterator_search(i,h,k)); \
73 }
74
75
76
77 #endif /* __ROS_KERN_HASHTABLE_ITR_H__*/
78
79 /*
80  * Copyright (c) 2002, 2004, Christopher Clark
81  * All rights reserved.
82  * 
83  * Redistribution and use in source and binary forms, with or without
84  * modification, are permitted provided that the following conditions
85  * are met:
86  * 
87  * * Redistributions of source code must retain the above copyright
88  * notice, this list of conditions and the following disclaimer.
89  * 
90  * * Redistributions in binary form must reproduce the above copyright
91  * notice, this list of conditions and the following disclaimer in the
92  * documentation and/or other materials provided with the distribution.
93  * 
94  * * Neither the name of the original author; nor the names of any contributors
95  * may be used to endorse or promote products derived from this software
96  * without specific prior written permission.
97  * 
98  * 
99  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
100  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
101  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
102  * A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER
103  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
104  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
105  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
106  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
107  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
108  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
109  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
110 */