/** * btree_delete * @access public * @param btree struct * @return int 0 on success or error value * * Removes a node at key from the btree * Locks the entire tree until complete * * TODO: there is currently a hard to trigger bug in the delete algorithm * if you add at least 100 items and delete them in the order they were added * (FIFO) you'll lose a set of nodes from 48 to 52 and some more in the 70's and 90''s */ BTREE_API int btree_delete(btree_tree *t, uint64_t key) { int error = 0; btree_node *n = t->root; uint32_t data_idx = 99999999; /* filled with the index to free */ error = btree_admin_lock(t); if (error != 0) { return error; } if (btree_delete_internal(t, n, key, key, &data_idx)) { /* Do administrative jobs */ t->header->item_count--; dr_set_remove(&(t->freelist), data_idx); error = btree_admin_unlock(t); if (error != 0) { return error; } return 0; } error = btree_admin_unlock(t); if (error != 0) { return error; } return 404; /* humorous attempt at node not found */ }
inline void dr_set_init(dr_set *set) { unsigned int i; // mass unset everything but the last byte memset(set->setinfo, 0xff, set->size / 8); // unset bits in the last byte for (i = 0; i < set->size % 8; i++) { dr_set_remove(set, i + (set->size / 8) * 8); } }
int main(void) { dr_set *set; set = dr_set_create(33); printf("IN SET: %s\n", dr_set_in(set, 4) ? "YES" : "NO"); dr_set_add(set, 4); printf("IN SET: %s\n", dr_set_in(set, 4) ? "YES" : "NO"); dr_set_remove(set, 4); printf("IN SET: %s\n", dr_set_in(set, 4) ? "YES" : "NO"); dr_set_dump(set); dr_set_free(set); return 0; }