common/utils.go (46 lines of code) (raw):
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 common
import (
"math"
"math/bits"
)
const (
defaultSerdeHashSeed = uint64(9001)
InverseGoldenU64 = 0x9e3779b97f4a7c13
)
func checkBounds(offset int, reqLen int, memCap int) bool {
return !((offset | reqLen | (offset + reqLen) | (memCap - (offset + reqLen))) < 0)
}
func PowerSeriesNextDouble(ppb int, curPoint float64, roundToLong bool, logBase float64) float64 {
// If curPoint < 1.0, force cur to 1.0
cur := curPoint
if cur < 1.0 {
cur = 1.0
}
// Compute the "generating index" (gi) by rounding logBaseOfX(logBase, cur)*ppb
gi := math.Round(logBaseOfX(logBase, cur) * float64(ppb))
for {
// Increment gi, compute n = logBase^(gi/ppb)
gi += 1.0
n := math.Pow(logBase, gi/float64(ppb))
// If roundToLong is true, round to nearest integer; otherwise keep the float
var next float64
if roundToLong {
next = math.Round(n)
} else {
next = n
}
// Repeat until next > cur
if next > cur {
return next
}
}
}
func logBaseOfX(base, x float64) float64 {
return math.Log(x) / math.Log(base)
}
func CeilingPowerOf2(n int) int {
if n <= 1 {
return 1
}
const topIntPwrOf2 = 1 << 30
if n >= topIntPwrOf2 {
return topIntPwrOf2
}
x := (n - 1) << 1
return 1 << (bits.Len32(uint32(x)) - 1)
}