Changes in uspace/srv/net/structures/int_map.h [aadf01e:ede63e4] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/srv/net/structures/int_map.h
raadf01e rede63e4 55 55 * @param[in] type Inner object type. 56 56 */ 57 #define INT_MAP_DECLARE( name, type)\57 #define INT_MAP_DECLARE( name, type ) \ 58 58 \ 59 59 typedef struct name name##_t; \ … … 63 63 \ 64 64 struct name##_item{ \ 65 int 66 type * 67 int 65 int key; \ 66 type * value; \ 67 int magic; \ 68 68 }; \ 69 69 \ 70 70 struct name{ \ 71 int 72 int 73 name##_item_ref 74 int 71 int size; \ 72 int next; \ 73 name##_item_ref items; \ 74 int magic; \ 75 75 }; \ 76 76 \ 77 int name##_add(name##_ref map, int key, type * value);\78 void name##_clear(name##_ref map);\79 int name##_count(name##_ref map);\80 void name##_destroy(name##_ref map);\81 void name##_exclude(name##_ref map, int key);\82 void name##_exclude_index(name##_ref map, int index);\83 type * name##_find(name##_ref map, int key); \84 int name##_update(name##_ref map, int key, int new_key);\85 type * name##_get_index(name##_ref map, int index);\86 int name##_initialize(name##_ref map);\87 int name##_is_valid(name##_ref map);\88 void name##_item_destroy(name##_item_ref item);\89 int name##_item_is_valid(name##_item_ref item);77 int name##_add( name##_ref map, int key, type * value ); \ 78 void name##_clear( name##_ref map ); \ 79 int name##_count( name##_ref map ); \ 80 void name##_destroy( name##_ref map ); \ 81 void name##_exclude( name##_ref map, int key ); \ 82 void name##_exclude_index( name##_ref map, int index ); \ 83 type * name##_find( name##_ref map, int key ); \ 84 int name##_update( name##_ref map, int key, int new_key ); \ 85 type * name##_get_index( name##_ref map, int index ); \ 86 int name##_initialize( name##_ref map ); \ 87 int name##_is_valid( name##_ref map ); \ 88 void name##_item_destroy( name##_item_ref item ); \ 89 int name##_item_is_valid( name##_item_ref item ); 90 90 91 91 /** Integer to generic type map implementation. … … 94 94 * @param[in] type Inner object type. 95 95 */ 96 #define INT_MAP_IMPLEMENT(name, type) \ 97 \ 98 int name##_add(name##_ref map, int key, type * value){ \ 99 if(name##_is_valid(map)){ \ 100 if(map->next == (map->size - 1)){ \ 101 name##_item_ref tmp; \ 102 \ 103 tmp = (name##_item_ref) realloc(map->items, sizeof(name##_item_t) * 2 * map->size); \ 104 if(! tmp){ \ 105 return ENOMEM; \ 106 } \ 96 #define INT_MAP_IMPLEMENT( name, type ) \ 97 \ 98 int name##_add( name##_ref map, int key, type * value ){ \ 99 if( name##_is_valid( map )){ \ 100 if( map->next == ( map->size - 1 )){ \ 101 name##_item_ref tmp; \ 102 \ 103 tmp = ( name##_item_ref ) realloc( map->items, sizeof( name##_item_t ) * 2 * map->size ); \ 104 if( ! tmp ) return ENOMEM; \ 107 105 map->size *= 2; \ 108 106 map->items = tmp; \ 109 107 } \ 110 map->items[ map->next].key = key; \111 map->items[ map->next].value = value; \112 map->items[ map->next].magic = INT_MAP_ITEM_MAGIC_VALUE;\108 map->items[ map->next ].key = key; \ 109 map->items[ map->next ].value = value; \ 110 map->items[ map->next ].magic = INT_MAP_ITEM_MAGIC_VALUE; \ 113 111 ++ map->next; \ 114 map->items[ map->next].magic = 0; \112 map->items[ map->next ].magic = 0; \ 115 113 return map->next - 1; \ 116 114 } \ … … 118 116 } \ 119 117 \ 120 void name##_clear( name##_ref map){\121 if( name##_is_valid(map)){\122 int 118 void name##_clear( name##_ref map ){ \ 119 if( name##_is_valid( map )){ \ 120 int index; \ 123 121 \ 124 122 /* map->magic = 0;*/ \ 125 for( index = 0; index < map->next; ++ index){ \126 if( name##_item_is_valid(&(map->items[index]))){\127 name##_item_destroy( &(map->items[index]));\123 for( index = 0; index < map->next; ++ index ){ \ 124 if( name##_item_is_valid( &( map->items[ index ] ))){ \ 125 name##_item_destroy( &( map->items[ index ] )); \ 128 126 } \ 129 127 } \ 130 128 map->next = 0; \ 131 map->items[ map->next].magic = 0; \129 map->items[ map->next ].magic = 0; \ 132 130 /* map->magic = INT_MAP_MAGIC_VALUE;*/ \ 133 131 } \ 134 132 } \ 135 133 \ 136 int name##_count( name##_ref map){ \137 return name##_is_valid( map) ? map->next : -1; \138 } \ 139 \ 140 void name##_destroy( name##_ref map){ \141 if( name##_is_valid(map)){\142 int 134 int name##_count( name##_ref map ){ \ 135 return name##_is_valid( map ) ? map->next : -1; \ 136 } \ 137 \ 138 void name##_destroy( name##_ref map ){ \ 139 if( name##_is_valid( map )){ \ 140 int index; \ 143 141 \ 144 142 map->magic = 0; \ 145 for( index = 0; index < map->next; ++ index){ \146 if( name##_item_is_valid(&(map->items[index]))){\147 name##_item_destroy( &(map->items[index]));\148 } \ 149 } \ 150 free( map->items); \151 } \ 152 } \ 153 \ 154 void name##_exclude( name##_ref map, int key){ \155 if( name##_is_valid(map)){\156 int 157 \ 158 for( index = 0; index < map->next; ++ index){ \159 if( name##_item_is_valid(&(map->items[index])) && (map->items[index].key == key)){ \160 name##_item_destroy( &(map->items[index]));\161 } \ 162 } \ 163 } \ 164 } \ 165 \ 166 void name##_exclude_index( name##_ref map, int index){ \167 if( name##_is_valid(map) && (index >= 0) && (index < map->next) && name##_item_is_valid(&(map->items[index]))){ \168 name##_item_destroy( &(map->items[index]));\169 } \ 170 } \ 171 \ 172 type * name##_find( name##_ref map, int key){ \173 if( name##_is_valid(map)){\174 int 175 \ 176 for( index = 0; index < map->next; ++ index){ \177 if( name##_item_is_valid(&(map->items[index])) && (map->items[index].key == key)){ \178 return map->items[ index].value;\143 for( index = 0; index < map->next; ++ index ){ \ 144 if( name##_item_is_valid( &( map->items[ index ] ))){ \ 145 name##_item_destroy( &( map->items[ index ] )); \ 146 } \ 147 } \ 148 free( map->items ); \ 149 } \ 150 } \ 151 \ 152 void name##_exclude( name##_ref map, int key ){ \ 153 if( name##_is_valid( map )){ \ 154 int index; \ 155 \ 156 for( index = 0; index < map->next; ++ index ){ \ 157 if( name##_item_is_valid( &( map->items[ index ] )) && ( map->items[ index ].key == key )){ \ 158 name##_item_destroy( &( map->items[ index ] )); \ 159 } \ 160 } \ 161 } \ 162 } \ 163 \ 164 void name##_exclude_index( name##_ref map, int index ){ \ 165 if( name##_is_valid( map ) && ( index >= 0 ) && ( index < map->next ) && name##_item_is_valid( &( map->items[ index ] ))){ \ 166 name##_item_destroy( &( map->items[ index ] )); \ 167 } \ 168 } \ 169 \ 170 type * name##_find( name##_ref map, int key ){ \ 171 if( name##_is_valid( map )){ \ 172 int index; \ 173 \ 174 for( index = 0; index < map->next; ++ index ){ \ 175 if( name##_item_is_valid( &( map->items[ index ] )) && ( map->items[ index ].key == key )){ \ 176 return map->items[ index ].value; \ 179 177 } \ 180 178 } \ … … 183 181 } \ 184 182 \ 185 int name##_update( name##_ref map, int key, int new_key){ \186 if( name##_is_valid(map)){\187 int 188 \ 189 for( index = 0; index < map->next; ++ index){ \190 if( name##_item_is_valid(&(map->items[index]))){\191 if( map->items[index].key == new_key){\183 int name##_update( name##_ref map, int key, int new_key ){ \ 184 if( name##_is_valid( map )){ \ 185 int index; \ 186 \ 187 for( index = 0; index < map->next; ++ index ){ \ 188 if( name##_item_is_valid( &( map->items[ index ] ))){ \ 189 if( map->items[ index ].key == new_key ){ \ 192 190 return EEXIST; \ 193 }else if( map->items[index].key == key){\194 map->items[ index].key = new_key; \191 }else if( map->items[ index ].key == key ){ \ 192 map->items[ index ].key = new_key; \ 195 193 return EOK; \ 196 194 } \ … … 201 199 } \ 202 200 \ 203 type * name##_get_index( name##_ref map, int index){\204 if( name##_is_valid(map) && (index >= 0) && (index < map->next) && name##_item_is_valid(&(map->items[index]))){ \205 return map->items[ index].value;\201 type * name##_get_index( name##_ref map, int index ){ \ 202 if( name##_is_valid( map ) && ( index >= 0 ) && ( index < map->next ) && name##_item_is_valid( &( map->items[ index ] ))){ \ 203 return map->items[ index ].value; \ 206 204 } \ 207 205 return NULL; \ 208 206 } \ 209 207 \ 210 int name##_initialize(name##_ref map){ \ 211 if(! map){ \ 212 return EINVAL; \ 213 } \ 208 int name##_initialize( name##_ref map ){ \ 209 if( ! map ) return EINVAL; \ 214 210 map->size = 2; \ 215 211 map->next = 0; \ 216 map->items = (name##_item_ref) malloc(sizeof(name##_item_t) * map->size); \ 217 if(! map->items){ \ 218 return ENOMEM; \ 219 } \ 220 map->items[map->next].magic = 0; \ 212 map->items = ( name##_item_ref ) malloc( sizeof( name##_item_t ) * map->size ); \ 213 if( ! map->items ) return ENOMEM; \ 214 map->items[ map->next ].magic = 0; \ 221 215 map->magic = INT_MAP_MAGIC_VALUE; \ 222 216 return EOK; \ 223 217 } \ 224 218 \ 225 int name##_is_valid( name##_ref map){ \226 return map && ( map->magic == INT_MAP_MAGIC_VALUE);\227 } \ 228 \ 229 void name##_item_destroy( name##_item_ref item){\230 if( name##_item_is_valid(item)){\219 int name##_is_valid( name##_ref map ){ \ 220 return map && ( map->magic == INT_MAP_MAGIC_VALUE ); \ 221 } \ 222 \ 223 void name##_item_destroy( name##_item_ref item ){ \ 224 if( name##_item_is_valid( item )){ \ 231 225 item->magic = 0; \ 232 if( item->value){ \233 free( item->value);\226 if( item->value ){ \ 227 free( item->value ); \ 234 228 item->value = NULL; \ 235 229 } \ … … 237 231 } \ 238 232 \ 239 int name##_item_is_valid( name##_item_ref item){\240 return item && ( item->magic == INT_MAP_ITEM_MAGIC_VALUE); \233 int name##_item_is_valid( name##_item_ref item ){ \ 234 return item && ( item->magic == INT_MAP_ITEM_MAGIC_VALUE ); \ 241 235 } 242 236
Note:
See TracChangeset
for help on using the changeset viewer.