| 201 | } |
| 202 | |
| 203 | void DataBlock_DeleteItem(DataBlock *dataBlock, uint64_t idx) { |
| 204 | ASSERT(dataBlock != NULL); |
| 205 | ASSERT(!_DataBlock_IndexOutOfBounds(dataBlock, idx)); |
| 206 | |
| 207 | // Return if item already deleted. |
| 208 | DataBlockItemHeader *item_header = DataBlock_GetItemHeader(dataBlock, idx); |
| 209 | if(IS_ITEM_DELETED(item_header)) return; |
| 210 | |
| 211 | // Call item destructor. |
| 212 | if(dataBlock->destructor) { |
| 213 | unsigned char *item = ITEM_DATA(item_header); |
| 214 | dataBlock->destructor(item); |
| 215 | } |
| 216 | |
| 217 | MARK_HEADER_AS_DELETED(item_header); |
| 218 | |
| 219 | array_append(dataBlock->deletedIdx, idx); |
| 220 | dataBlock->itemCount--; |
| 221 | } |
| 222 | |
| 223 | uint DataBlock_DeletedItemsCount(const DataBlock *dataBlock) { |
| 224 | return array_len(dataBlock->deletedIdx); |