in serialize.go [20:82]
func loadPrefixMap(data string) (*intStringMap, error) {
rawBytes, err := decodeUnzipString(data)
if err != nil {
return nil, err
}
reader := bytes.NewReader(rawBytes)
// ok, first read in our number of values
var valueSize uint32
err = binary.Read(reader, binary.LittleEndian, &valueSize)
if err != nil {
return nil, err
}
// then our values
valueBytes := make([]byte, valueSize)
n, err := reader.Read(valueBytes)
if uint32(n) < valueSize {
return nil, fmt.Errorf("unable to read all values: %v", err)
}
values := strings.Split(string(valueBytes), "\n")
// read our # of mappings
var mappingCount uint32
err = binary.Read(reader, binary.LittleEndian, &mappingCount)
if err != nil {
return nil, err
}
maxLength := 0
mappings := make(map[int]string, mappingCount)
prefix := 0
for i := 0; i < int(mappingCount); i++ {
// first read our diff
diff, err := binary.ReadUvarint(reader)
if err != nil {
return nil, err
}
prefix += int(diff)
// then our map
var valueIntern uint16
err = binary.Read(reader, binary.LittleEndian, &valueIntern)
if err != nil || int(valueIntern) >= len(values) {
return nil, fmt.Errorf("unable to read interned value: %v", err)
}
mappings[prefix] = values[valueIntern]
strPrefix := fmt.Sprintf("%d", prefix)
if len(strPrefix) > maxLength {
maxLength = len(strPrefix)
}
}
// return our values
return &intStringMap{
Map: mappings,
MaxLength: maxLength,
}, nil
}