mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2025-01-07 08:32:18 +01:00
120 lines
2.0 KiB
Go
120 lines
2.0 KiB
Go
package matchr
|
|
|
|
import (
|
|
"math"
|
|
"strings"
|
|
)
|
|
|
|
// min of two integers
|
|
func min(a int, b int) (res int) {
|
|
if a < b {
|
|
res = a
|
|
} else {
|
|
res = b
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// max of two integers
|
|
func maxI(a int, b int) (res int) {
|
|
if a < b {
|
|
res = b
|
|
} else {
|
|
res = a
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// max of two float64s
|
|
func max(a float64, b float64) (res float64) {
|
|
if a < b {
|
|
res = b
|
|
} else {
|
|
res = a
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
// is this string index outside of the ASCII numeric code points?
|
|
func nan(c rune) bool {
|
|
return ((c > 57) || (c < 48))
|
|
}
|
|
|
|
// Round a float64 to the given precision
|
|
//
|
|
// http://play.golang.org/p/S654PxAe_N
|
|
//
|
|
// (via Rory McGuire at
|
|
// https://groups.google.com/forum/#!topic/golang-nuts/ITZV08gAugI)
|
|
func round(x float64, prec int) float64 {
|
|
if math.IsNaN(x) || math.IsInf(x, 0) {
|
|
return x
|
|
}
|
|
|
|
sign := 1.0
|
|
if x < 0 {
|
|
sign = -1
|
|
x *= -1
|
|
}
|
|
|
|
var rounder float64
|
|
pow := math.Pow(10, float64(prec))
|
|
intermed := x * pow
|
|
_, frac := math.Modf(intermed)
|
|
|
|
if frac >= 0.5 {
|
|
rounder = math.Ceil(intermed)
|
|
} else {
|
|
rounder = math.Floor(intermed)
|
|
}
|
|
|
|
return rounder / pow * sign
|
|
}
|
|
|
|
// A helper to determine if any substrings exist within the given string
|
|
func contains(value *String, start int, length int, criteria ...string) bool {
|
|
substring := substring(value, start, length)
|
|
for _, c := range criteria {
|
|
if substring == c {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// A fault-tolerant version of Slice. It will return nothing ("") if the index
|
|
// is out of bounds. This allows substring-ing without having to bound check
|
|
// every time.
|
|
func substring(value *String, start int, length int) string {
|
|
if start >= 0 && start+length <= value.RuneCount() {
|
|
return value.Slice(start, start+length)
|
|
} else {
|
|
return ""
|
|
}
|
|
}
|
|
|
|
func isVowel(c rune) bool {
|
|
switch c {
|
|
case 'A', 'E', 'I', 'O', 'U', 'Y':
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func isVowelNoY(c rune) bool {
|
|
switch c {
|
|
case 'A', 'E', 'I', 'O', 'U':
|
|
return true
|
|
default:
|
|
return false
|
|
}
|
|
}
|
|
|
|
func cleanInput(input string) string {
|
|
return strings.ToUpper(strings.TrimSpace(input))
|
|
}
|