36 auto size =
region.openFile(filename, read_only);
37 bool empty = (size == 0);
48 table->magic = magic_value;
50 table->elem_size =
static_cast<uint16_t
>(
sizeof(
value_t));
53 table->nb_elements = 0;
54 table->next_value = 0;
55 for(
unsigned long i=0; i<
table->capacity(); ++i) {
59 if(
table->magic != magic_value)
60 throw std::runtime_error(
"ProvSQL mmap: wrong file type (magic mismatch)");
61 if(
table->version != 1)
62 throw std::runtime_error(
"ProvSQL mmap: unsupported format version "
63 + std::to_string(
table->version));
65 throw std::runtime_error(
"ProvSQL mmap: element size mismatch (recompile required)");
71 std::vector<value_t> elements;
72 elements.reserve(
table->nb_elements);
73 for(
unsigned long i=0; i<
table->capacity(); ++i)
75 elements.push_back(
table->t[i]);
77 auto new_log_size =
table->log_size+1;
81 table->log_size = new_log_size;
82 for(
unsigned long i=0; i<
table->capacity(); ++i) {
85 for(
const auto &u: elements)
99 k = (k+1) %
table->capacity();
109 return table->t[k].value;
121 ++
table->nb_elements;
122 table->t[k].uuid = u;
123 return std::make_pair(
table->t[k].value =
table->next_value++,
true);
125 return std::make_pair(
table->t[k].value,
false);
Open-addressing hash table mapping UUIDs to integers, backed by an mmap file.
void set(pg_uuid_t u, unsigned long i)
Store the mapping u → i in the table.
unsigned long hash(pg_uuid_t u) const
Compute the starting slot index for UUID u.
void grow()
Double the table capacity and rehash all existing entries.
std::pair< unsigned long, bool > add(pg_uuid_t u)
Insert UUID u, assigning it the next available integer.
MMappedUUIDHashTable(const char *filename, bool read_only, uint64_t magic)
Open (or create) the mmap-backed hash table.
static constexpr unsigned STARTING_LOG_SIZE
Initial log2 capacity (65 536 slots).
unsigned long find(pg_uuid_t u) const
Find the slot index of u, or NOTHING if absent.
unsigned long operator[](pg_uuid_t u) const
Look up the integer index for UUID u.
~MMappedUUIDHashTable()
Sync and unmap the file.
MappedRegion region
Backing storage (shared mmap, or heap buffer).
void sync()
Flush the backing region to its file (MappedRegion::sync()).
static constexpr unsigned long NOTHING
Sentinel returned by operator[]() when the UUID is not present.
static constexpr double MAXIMUM_LOAD_FACTOR
Rehash when this fraction of slots is occupied.
table_t * table
Typed view of region.base().
On-disk layout of the hash table stored in the mmap file.
static constexpr unsigned logSizeForSize(std::size_t size)
Compute the log2 of the slot count from the file size.
static constexpr std::size_t sizeForLogSize(unsigned ls)
Compute the file size required for a table with 2^ls slots.
One slot in the hash table: a UUID key and its associated integer value.