Initial commit
This commit is contained in:
133
vendor/github.com/HdrHistogram/hdrhistogram-go/zigzag.go
generated
vendored
Normal file
133
vendor/github.com/HdrHistogram/hdrhistogram-go/zigzag.go
generated
vendored
Normal file
@@ -0,0 +1,133 @@
|
||||
package hdrhistogram
|
||||
|
||||
import "fmt"
|
||||
|
||||
const truncatedErrStr = "Truncated compressed histogram decode. Expected minimum length of %d bytes and got %d."
|
||||
|
||||
// Read an LEB128 ZigZag encoded long value from the given buffer
|
||||
func zig_zag_decode_i64(buf []byte) (signedValue int64, n int, err error) {
|
||||
buflen := len(buf)
|
||||
if buflen < 1 {
|
||||
return 0, 0, nil
|
||||
}
|
||||
var value = uint64(buf[0]) & 0x7f
|
||||
n = 1
|
||||
if (buf[0] & 0x80) != 0 {
|
||||
if buflen < 2 {
|
||||
err = fmt.Errorf(truncatedErrStr, 2, buflen)
|
||||
return
|
||||
}
|
||||
value |= uint64(buf[1]) & 0x7f << 7
|
||||
n = 2
|
||||
if (buf[1] & 0x80) != 0 {
|
||||
if buflen < 3 {
|
||||
err = fmt.Errorf(truncatedErrStr, 3, buflen)
|
||||
return
|
||||
}
|
||||
value |= uint64(buf[2]) & 0x7f << 14
|
||||
n = 3
|
||||
if (buf[2] & 0x80) != 0 {
|
||||
if buflen < 4 {
|
||||
err = fmt.Errorf(truncatedErrStr, 4, buflen)
|
||||
return
|
||||
}
|
||||
value |= uint64(buf[3]) & 0x7f << 21
|
||||
n = 4
|
||||
if (buf[3] & 0x80) != 0 {
|
||||
if buflen < 5 {
|
||||
err = fmt.Errorf(truncatedErrStr, 5, buflen)
|
||||
return
|
||||
}
|
||||
value |= uint64(buf[4]) & 0x7f << 28
|
||||
n = 5
|
||||
if (buf[4] & 0x80) != 0 {
|
||||
if buflen < 6 {
|
||||
err = fmt.Errorf(truncatedErrStr, 6, buflen)
|
||||
return
|
||||
}
|
||||
value |= uint64(buf[5]) & 0x7f << 35
|
||||
n = 6
|
||||
if (buf[5] & 0x80) != 0 {
|
||||
if buflen < 7 {
|
||||
err = fmt.Errorf(truncatedErrStr, 7, buflen)
|
||||
return
|
||||
}
|
||||
value |= uint64(buf[6]) & 0x7f << 42
|
||||
n = 7
|
||||
if (buf[6] & 0x80) != 0 {
|
||||
if buflen < 8 {
|
||||
err = fmt.Errorf(truncatedErrStr, 8, buflen)
|
||||
return
|
||||
}
|
||||
value |= uint64(buf[7]) & 0x7f << 49
|
||||
n = 8
|
||||
if (buf[7] & 0x80) != 0 {
|
||||
if buflen < 9 {
|
||||
err = fmt.Errorf(truncatedErrStr, 9, buflen)
|
||||
return
|
||||
}
|
||||
value |= uint64(buf[8]) << 56
|
||||
n = 9
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
signedValue = int64((value >> 1) ^ -(value & 1))
|
||||
return
|
||||
}
|
||||
|
||||
// Writes a int64_t value to the given buffer in LEB128 ZigZag encoded format
|
||||
// ZigZag encoding maps signed integers to unsigned integers so that numbers with a small
|
||||
// absolute value (for instance, -1) have a small varint encoded value too.
|
||||
// It does this in a way that "zig-zags" back and forth through the positive and negative integers,
|
||||
// so that -1 is encoded as 1, 1 is encoded as 2, -2 is encoded as 3, and so on.
|
||||
func zig_zag_encode_i64(signedValue int64) (buffer []byte) {
|
||||
buffer = make([]byte, 0)
|
||||
var value = uint64((signedValue << 1) ^ (signedValue >> 63))
|
||||
if value>>7 == 0 {
|
||||
buffer = append(buffer, byte(value))
|
||||
} else {
|
||||
buffer = append(buffer, byte((value&0x7F)|0x80))
|
||||
if value>>14 == 0 {
|
||||
buffer = append(buffer, byte(value>>7))
|
||||
} else {
|
||||
buffer = append(buffer, byte((value>>7)|0x80))
|
||||
if value>>21 == 0 {
|
||||
buffer = append(buffer, byte(value>>14))
|
||||
} else {
|
||||
buffer = append(buffer, byte((value>>14)|0x80))
|
||||
if value>>28 == 0 {
|
||||
buffer = append(buffer, byte(value>>21))
|
||||
} else {
|
||||
buffer = append(buffer, byte((value>>21)|0x80))
|
||||
if value>>35 == 0 {
|
||||
buffer = append(buffer, byte(value>>28))
|
||||
} else {
|
||||
buffer = append(buffer, byte((value>>28)|0x80))
|
||||
if value>>42 == 0 {
|
||||
buffer = append(buffer, byte(value>>35))
|
||||
} else {
|
||||
buffer = append(buffer, byte((value>>35)|0x80))
|
||||
if value>>49 == 0 {
|
||||
buffer = append(buffer, byte(value>>42))
|
||||
} else {
|
||||
buffer = append(buffer, byte((value>>42)|0x80))
|
||||
if value>>56 == 0 {
|
||||
buffer = append(buffer, byte(value>>49))
|
||||
} else {
|
||||
buffer = append(buffer, byte((value>>49)|0x80))
|
||||
buffer = append(buffer, byte(value>>56))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
Reference in New Issue
Block a user