//! https://llvm.org/docs/PDB/HashTable.html package pdb PdbHashTable :: struct($Value: typeid) { size: u32le, capacity: u32le, presentBits: BitVector, deletedBits: BitVector, kvPairs: []PdbHashTable_KVPair(Value), } PdbHashTable_KVPair :: struct($Value: typeid) #packed { key: u32le, value: Value, } BitVector :: struct { //wordCount : u32le, words: []u32le, } get_kv_at :: proc(using this: ^PdbHashTable($T), at: u32le) -> (ret:PdbHashTable_KVPair(T), ok:bool) { ok = get_bit(&presentBits, at) if !ok { ret = {} return } ret = kvPairs[at] return } get_bit :: proc(using this: ^BitVector, at: u32le) -> bool { ELEMENT_PER_WORD :: 32 wi := at / ELEMENT_PER_WORD if int(wi) >= len(words) do return false word := words[uint(wi)] iiw := at - (wi * ELEMENT_PER_WORD) return (word & (1 << iiw)) != 0 } read_hash_table :: proc(using this: ^BlocksReader, $Value: typeid) -> (ret:PdbHashTable(Value)) { ret.size = readv(this, u32le) ret.capacity = readv(this, u32le) //log.debugf("hash_table size%v capacity%v", ret.size, ret.capacity) ret.presentBits = read_bit_vector(this) //log.debugf("presentBits: %v words read: 0x%x", len(ret.presentBits.words), ret.presentBits.words) ret.deletedBits = read_bit_vector(this) //log.debugf("deletedBit: %v words read: 0x%x", len(ret.deletedBits.words), ret.deletedBits.words) ret.kvPairs = make([]PdbHashTable_KVPair(Value), ret.capacity) for i in 0.. (ret: BitVector) { wordCount := readv(this, u32le) ret.words = read_packed_array(this, uint(wordCount), u32le) return }