20
20
21
21
#include "map.h"
22
22
23
- /* FIXME : Avoid relying on key_size and data_size */
23
+ /* TODO : Avoid relying on key_size and data_size */
24
24
struct map_head_t {
25
25
map_node_t * root ;
26
26
@@ -110,7 +110,7 @@ static inline void rb_node_init(map_node_t *node)
110
110
rb_node_set_right((r_node), (x_node)); \
111
111
} while (0)
112
112
113
- /* FIXME : embed cmp (00, 01, 11) into @node pointer as 'right_red' does */
113
+ /* TODO : embed cmp (00, 01, 11) into @node pointer as 'right_red' does */
114
114
typedef struct {
115
115
map_node_t * node ;
116
116
map_cmp_t cmp ;
@@ -131,7 +131,7 @@ static inline map_node_t *rb_search(map_t rb, const map_node_t *node)
131
131
ret = rb_node_get_right (ret );
132
132
break ;
133
133
default :
134
- //__UNREACHABLE ;
134
+ assert ( 0 ) ;
135
135
break ;
136
136
}
137
137
}
@@ -159,8 +159,7 @@ static void rb_insert(map_t rb, map_node_t *node)
159
159
pathp [1 ].node = rb_node_get_right (pathp -> node );
160
160
break ;
161
161
default :
162
- assert (cmp != _CMP_EQUAL );
163
- //__UNREACHABLE;
162
+ /* igore duplicate key */
164
163
break ;
165
164
}
166
165
}
@@ -230,7 +229,8 @@ static void rb_remove(map_t rb, map_node_t *node)
230
229
* The path from root to seach target is recorded in pathp[i].
231
230
*/
232
231
path -> node = rb -> root ;
233
- for (pathp = path ; pathp -> node ; pathp ++ ) {
232
+ pathp = path ;
233
+ while (pathp -> node ) {
234
234
map_cmp_t cmp = pathp -> cmp = (rb -> cmp )(node -> data , pathp -> node -> data );
235
235
if (cmp == _CMP_LESS ) {
236
236
pathp [1 ].node = rb_node_get_left (pathp -> node );
@@ -247,6 +247,7 @@ static void rb_remove(map_t rb, map_node_t *node)
247
247
break ;
248
248
}
249
249
}
250
+ pathp ++ ;
250
251
}
251
252
assert (nodep && nodep -> node == node );
252
253
0 commit comments