| 177 | } |
| 178 | |
| 179 | void *DataBlock_AllocateItem(DataBlock *dataBlock, uint64_t *idx) { |
| 180 | // make sure we've got room for items |
| 181 | if(dataBlock->itemCount >= dataBlock->itemCap) { |
| 182 | // allocate an additional block |
| 183 | _DataBlock_AddBlocks(dataBlock, 1); |
| 184 | } |
| 185 | ASSERT(dataBlock->itemCap > dataBlock->itemCount); |
| 186 | |
| 187 | // get index into which to store item, |
| 188 | // prefer reusing free indicies |
| 189 | uint pos = dataBlock->itemCount; |
| 190 | if(array_len(dataBlock->deletedIdx) > 0) { |
| 191 | pos = array_pop(dataBlock->deletedIdx); |
| 192 | } |
| 193 | dataBlock->itemCount++; |
| 194 | |
| 195 | if(idx) *idx = pos; |
| 196 | |
| 197 | DataBlockItemHeader *item_header = DataBlock_GetItemHeader(dataBlock, pos); |
| 198 | MARK_HEADER_AS_NOT_DELETED(item_header); |
| 199 | |
| 200 | return ITEM_DATA(item_header); |
| 201 | } |
| 202 | |
| 203 | void DataBlock_DeleteItem(DataBlock *dataBlock, uint64_t idx) { |
| 204 | ASSERT(dataBlock != NULL); |