in cmd/buildmetadata/main.go [297:369]
func renderMap(prefixMap map[int][]string) ([]byte, error) {
// build lists of our keys and values
keys := make([]int, 0, len(prefixMap))
values := make([]string, 0, 255)
seenValues := make(map[string]bool, 255)
for k, vs := range prefixMap {
keys = append(keys, k)
for _, v := range vs {
_, seen := seenValues[v]
if !seen {
seenValues[v] = true
values = append(values, v)
}
}
}
sort.Strings(values)
sort.Ints(keys)
internMap := make(map[string]int, len(values))
for i, v := range values {
internMap[v] = i
}
data := &bytes.Buffer{}
// first write our values, as length of string and raw bytes
joinedValues := strings.Join(values, "\n")
if err := binary.Write(data, binary.LittleEndian, uint32(len(joinedValues))); err != nil {
return nil, err
}
if err := binary.Write(data, binary.LittleEndian, []byte(joinedValues)); err != nil {
return nil, err
}
// then the number of keys
if err := binary.Write(data, binary.LittleEndian, uint32(len(keys))); err != nil {
return nil, err
}
// we write our key / value pairs as a varint of the difference of the previous prefix
// and a uint16 of the value index
last := 0
intBuf := make([]byte, 6)
for _, key := range keys {
// first write our prefix
diff := key - last
l := binary.PutUvarint(intBuf, uint64(diff))
if err := binary.Write(data, binary.LittleEndian, intBuf[:l]); err != nil {
return nil, err
}
// then our values
values := prefixMap[key]
// write our number of values
if err := binary.Write(data, binary.LittleEndian, uint8(len(values))); err != nil {
return nil, err
}
// then each value as the interned index
for _, v := range values {
valueIntern := internMap[v]
if err := binary.Write(data, binary.LittleEndian, uint16(valueIntern)); err != nil {
return nil, err
}
}
last = key
}
return data.Bytes(), nil
}