#include #include #include #include vx_uuid_table_s * vx_new_uuid_table() { vx_uuid_table_s *table = malloc(sizeof(vx_uuid_table_s)); table->num_blocks = 0; table->block_capacity = 32; table->blocks = malloc(table->block_capacity * sizeof(vx_uuid_block_s *)); return table; } bool vx_uuid_block_exists(vx_uuid_table_s *table, uint32_t offset) { uint32_t block_index = 0; while(block_index < table->num_blocks) { if(table->blocks[block_index]->offset == offset) { return true; } ++block_index; } return false; } bool vx_uuid_exists_in_block(vx_uuid_block_s *block, vx_uuid_d uuid) { uint32_t entry_index = 0; while(entry_index < block->num_ids) { if(block->entries[entry_index].uuid == uuid) { return true; } ++entry_index; } return false; } vx_uuid_d vx_allocate_uuid_in_block(vx_uuid_block_s *block) { vx_uuid_d last_id = 0; if(block->num_ids) { last_id = block->entries[block->num_ids - 1].uuid; } vx_uuid_d uuid = block->offset * 4096 + last_id * 53; block->entries[block->num_ids].uuid = uuid; ++block->num_ids; while(vx_uuid_exists_in_block(block, uuid)) { ++uuid; } return uuid; } vx_uuid_block_s * vx_allocate_new_id_block(vx_uuid_table_s *table) { vx_uuid_block_s *block = NULL; if(table->num_blocks >= table->block_capacity) { table->block_capacity *= 2; if( ! table->block_capacity) { table->block_capacity = 32; } table->blocks = realloc(table->blocks, table->block_capacity * sizeof(vx_uuid_block_s *)); } table->blocks[table->num_blocks] = malloc(sizeof(vx_uuid_block_s)); block = table->blocks[table->num_blocks]; block->num_ids = 0; block->offset = (table->num_blocks * 7) * 4096; ++table->num_blocks; return block; } vx_uuid_d vx_new_uuid(vx_uuid_table_s *table) { vx_uuid_block_s *block = NULL; uint32_t block_index = 0; while(block_index < table->num_blocks) { if(table->blocks[block_index]->num_ids != 255) { block = table->blocks[block_index]; break; } ++block_index; } if( ! block) { block = vx_allocate_new_id_block(table); } return vx_allocate_uuid_in_block(block); }