mirror of https://github.com/prometheus/prometheus
76 lines
2.3 KiB
Go
76 lines
2.3 KiB
Go
// Copyright 2016 The Prometheus Authors
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
package chunk
|
|
|
|
import "github.com/prometheus/common/model"
|
|
|
|
var (
|
|
// bit masks for consecutive bits in a byte at various offsets.
|
|
bitMask = [][]byte{
|
|
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // 0 bit
|
|
{0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01}, // 1 bit
|
|
{0xC0, 0x60, 0x30, 0x18, 0x0C, 0x06, 0x03, 0x01}, // 2 bit
|
|
{0xE0, 0x70, 0x38, 0x1C, 0x0E, 0x07, 0x03, 0x01}, // 3 bit
|
|
{0xF0, 0x78, 0x3C, 0x1E, 0x0F, 0x07, 0x03, 0x01}, // 4 bit
|
|
{0xF8, 0x7C, 0x3E, 0x1F, 0x0F, 0x07, 0x03, 0x01}, // 5 bit
|
|
{0xFC, 0x7E, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01}, // 6 bit
|
|
{0xFE, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01}, // 7 bit
|
|
{0xFF, 0x7F, 0x3F, 0x1F, 0x0F, 0x07, 0x03, 0x01}, // 8 bit
|
|
}
|
|
)
|
|
|
|
// isInt32 returns true if v can be represented as an int32.
|
|
func isInt32(v model.SampleValue) bool {
|
|
return model.SampleValue(int32(v)) == v
|
|
}
|
|
|
|
// countBits returs the number of leading zero bits and the number of
|
|
// significant bits after that in the given bit pattern. The maximum number of
|
|
// leading zeros is 31 (so that it can be represented by a 5bit number). Leading
|
|
// zeros beyond that are considered part of the significant bits.
|
|
func countBits(pattern uint64) (leading, significant byte) {
|
|
// TODO(beorn7): This would probably be faster with ugly endless switch
|
|
// statements.
|
|
if pattern == 0 {
|
|
return
|
|
}
|
|
for pattern < 1<<63 {
|
|
leading++
|
|
pattern <<= 1
|
|
}
|
|
for pattern > 0 {
|
|
significant++
|
|
pattern <<= 1
|
|
}
|
|
if leading > 31 { // 5 bit limit.
|
|
significant += leading - 31
|
|
leading = 31
|
|
}
|
|
return
|
|
}
|
|
|
|
// isSignedIntN returns if n can be represented as a signed int with the given
|
|
// bit length.
|
|
func isSignedIntN(i int64, n byte) bool {
|
|
upper := int64(1) << (n - 1)
|
|
if i >= upper {
|
|
return false
|
|
}
|
|
lower := upper - (1 << n)
|
|
if i < lower {
|
|
return false
|
|
}
|
|
return true
|
|
}
|