00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00035 #include <stdio.h>
00036 #include <stdlib.h>
00037 #include <assert.h>
00038 #include "list.h"
00039 #include "mytypes.h"
00040
00041 #include "intmap.h"
00042
00047 void intmap_init(intmap_t *intmap)
00048 {
00049 list_init(&intmap->elem);
00050 }
00051
00058 void intmap_fini(intmap_t *intmap)
00059 {
00060 list_fini(&intmap->elem);
00061 }
00062
00073 void intmap_set(intmap_t *intmap, int key, void *value)
00074 {
00075 list_node_t *node;
00076 map_elem_t *elem;
00077
00078 node = list_first(&intmap->elem);
00079 while (node != NULL) {
00080 elem = list_node_data(node, map_elem_t *);
00081 if (elem->key == key) {
00082 if (value != NULL) {
00083
00084 elem->value = value;
00085 } else {
00086
00087 list_remove(&intmap->elem, node);
00088 free(elem);
00089 }
00090 return;
00091 }
00092 node = list_next(&intmap->elem, node);
00093 }
00094
00095
00096
00097 elem = calloc(1, sizeof(map_elem_t));
00098 if (elem == NULL) {
00099 printf("Memory allocation failed.\n");
00100 exit(1);
00101 }
00102
00103 elem->key = key;
00104 elem->value = value;
00105 list_append(&intmap->elem, elem);
00106 }
00107
00116 void *intmap_get(intmap_t *intmap, int key)
00117 {
00118 list_node_t *node;
00119 map_elem_t *elem;
00120
00121 node = list_first(&intmap->elem);
00122 while (node != NULL) {
00123 elem = list_node_data(node, map_elem_t *);
00124 if (elem->key == key) {
00125 return elem->value;
00126 }
00127 node = list_next(&intmap->elem, node);
00128 }
00129
00130
00131 return NULL;
00132 }
00133
00142 map_elem_t *intmap_first(intmap_t *intmap)
00143 {
00144 list_node_t *node;
00145
00146 node = list_first(&intmap->elem);
00147 if (node == NULL)
00148 return NULL;
00149
00150 return list_node_data(node, map_elem_t *);
00151 }
00152
00160 int intmap_elem_get_key(map_elem_t *elem)
00161 {
00162 return elem->key;
00163 }
00164
00172 void *intmap_elem_get_value(map_elem_t *elem)
00173 {
00174 return elem->value;
00175 }