source: mainline/uspace/srv/net/structures/int_map.h@ c92a5753

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since c92a5753 was 21580dd, checked in by Lukas Mejdrech <lukas@…>, 16 years ago

Merged with network branch svn://svn.helenos.org/HelenOS/branches/network revision 4759; ipc_share_* and ipc_data_* changed to async_*; client connection in module.c returns on IPC_M_PHONE_HUNGUP; * Qemu scripts renamed to net-qe.*; (the dp8390 does not respond)

  • Property mode set to 100644
File size: 8.2 KB
Line 
1/*
2 * Copyright (c) 2009 Lukas Mejdrech
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup net
30 * @{
31 */
32
33/** @file
34 * Integer to generic type map.
35 */
36
37#ifndef __NET_INT_MAP_H__
38#define __NET_INT_MAP_H__
39
40#include <errno.h>
41#include <malloc.h>
42#include <mem.h>
43#include <unistd.h>
44
45/** Internal magic value for a&nbsp;map consistency check.
46 */
47#define INT_MAP_MAGIC_VALUE 0x11223344
48
49/** Internal magic value for an item consistency check.
50 */
51#define INT_MAP_ITEM_MAGIC_VALUE 0x55667788
52
53/** Integer to generic type map declaration.
54 * @param[in] name Name of the map.
55 * @param[in] type Inner object type.
56 */
57#define INT_MAP_DECLARE( name, type ) \
58 \
59typedef struct name name##_t; \
60typedef name##_t * name##_ref; \
61typedef struct name##_item name##_item_t; \
62typedef name##_item_t * name##_item_ref; \
63 \
64struct name##_item{ \
65 int key; \
66 type * value; \
67 int magic; \
68}; \
69 \
70struct name{ \
71 int size; \
72 int next; \
73 name##_item_ref items; \
74 int magic; \
75}; \
76 \
77int name##_add( name##_ref map, int key, type * value ); \
78void name##_clear( name##_ref map ); \
79int name##_count( name##_ref map ); \
80void name##_destroy( name##_ref map ); \
81void name##_exclude( name##_ref map, int key ); \
82void name##_exclude_index( name##_ref map, int index ); \
83type * name##_find( name##_ref map, int key ); \
84type * name##_get_index( name##_ref map, int index ); \
85int name##_initialize( name##_ref map ); \
86int name##_is_valid( name##_ref map ); \
87void name##_item_destroy( name##_item_ref item ); \
88int name##_item_is_valid( name##_item_ref item );
89
90/** Integer to generic type map implementation.
91 * Should follow declaration with the same parameters.
92 * @param[in] name Name of the map.
93 * @param[in] type Inner object type.
94 */
95#define INT_MAP_IMPLEMENT( name, type ) \
96 \
97int name##_add( name##_ref map, int key, type * value ){ \
98 if( name##_is_valid( map )){ \
99 if( map->next == ( map->size - 1 )){ \
100 name##_item_ref tmp; \
101 \
102 tmp = ( name##_item_ref ) realloc( map->items, sizeof( name##_item_t ) * 2 * map->size ); \
103 if( ! tmp ) return ENOMEM; \
104 map->size *= 2; \
105 map->items = tmp; \
106 } \
107 map->items[ map->next ].key = key; \
108 map->items[ map->next ].value = value; \
109 map->items[ map->next ].magic = INT_MAP_ITEM_MAGIC_VALUE; \
110 ++ map->next; \
111 map->items[ map->next ].magic = 0; \
112 return map->next - 1; \
113 } \
114 return EINVAL; \
115} \
116 \
117void name##_clear( name##_ref map ){ \
118 if( name##_is_valid( map )){ \
119 int index; \
120 \
121/* map->magic = 0;*/ \
122 for( index = 0; index < map->next; ++ index ){ \
123 if( name##_item_is_valid( &( map->items[ index ] ))){ \
124 name##_item_destroy( &( map->items[ index ] )); \
125 } \
126 } \
127 map->next = 0; \
128 map->items[ map->next ].magic = 0; \
129/* map->magic = INT_MAP_MAGIC_VALUE;*/ \
130 } \
131} \
132 \
133int name##_count( name##_ref map ){ \
134 return name##_is_valid( map ) ? map->next : -1; \
135} \
136 \
137void name##_destroy( name##_ref map ){ \
138 if( name##_is_valid( map )){ \
139 int index; \
140 \
141 map->magic = 0; \
142 for( index = 0; index < map->next; ++ index ){ \
143 if( name##_item_is_valid( &( map->items[ index ] ))){ \
144 name##_item_destroy( &( map->items[ index ] )); \
145 } \
146 } \
147 free( map->items ); \
148 } \
149} \
150 \
151void name##_exclude( name##_ref map, int key ){ \
152 if( name##_is_valid( map )){ \
153 int index; \
154 \
155 for( index = 0; index < map->next; ++ index ){ \
156 if( name##_item_is_valid( &( map->items[ index ] )) && ( map->items[ index ].key == key )){ \
157 name##_item_destroy( &( map->items[ index ] )); \
158 } \
159 } \
160 } \
161} \
162 \
163void name##_exclude_index( name##_ref map, int index ){ \
164 if( name##_is_valid( map ) && ( index >= 0 ) && ( index < map->next ) && name##_item_is_valid( &( map->items[ index ] ))){ \
165 name##_item_destroy( &( map->items[ index ] )); \
166 } \
167} \
168 \
169type * name##_find( name##_ref map, int key ){ \
170 if( name##_is_valid( map )){ \
171 int index; \
172 \
173 for( index = 0; index < map->next; ++ index ){ \
174 if( name##_item_is_valid( &( map->items[ index ] )) && ( map->items[ index ].key == key )){ \
175 return map->items[ index ].value; \
176 } \
177 } \
178 } \
179 return NULL; \
180} \
181 \
182type * name##_get_index( name##_ref map, int index ){ \
183 if( name##_is_valid( map ) && ( index >= 0 ) && ( index < map->next ) && name##_item_is_valid( &( map->items[ index ] ))){ \
184 return map->items[ index ].value; \
185 } \
186 return NULL; \
187} \
188 \
189int name##_initialize( name##_ref map ){ \
190 if( ! map ) return EINVAL; \
191 map->size = 2; \
192 map->next = 0; \
193 map->items = ( name##_item_ref ) malloc( sizeof( name##_item_t ) * map->size ); \
194 if( ! map->items ) return ENOMEM; \
195 map->items[ map->next ].magic = 0; \
196 map->magic = INT_MAP_MAGIC_VALUE; \
197 return EOK; \
198} \
199 \
200int name##_is_valid( name##_ref map ){ \
201 return map && ( map->magic == INT_MAP_MAGIC_VALUE ); \
202} \
203 \
204void name##_item_destroy( name##_item_ref item ){ \
205 if( name##_item_is_valid( item )){ \
206 item->magic = 0; \
207 if( item->value ){ \
208 free( item->value ); \
209 item->value = NULL; \
210 } \
211 } \
212} \
213 \
214int name##_item_is_valid( name##_item_ref item ){ \
215 return item && ( item->magic == INT_MAP_ITEM_MAGIC_VALUE ); \
216}
217
218#endif
219
220/** @}
221 */
222
Note: See TracBrowser for help on using the repository browser.