VictoriaMetrics/lib/logstorage/u128.go
2023-06-19 22:55:12 -07:00

50 lines
1.1 KiB
Go

package logstorage
import (
"fmt"
"github.com/VictoriaMetrics/VictoriaMetrics/lib/encoding"
)
// u128 is 128-bit uint number.
//
// It is used as an unique id of stream.
type u128 struct {
hi uint64
lo uint64
}
// String returns human-readable representation of u.
func (u *u128) String() string {
return fmt.Sprintf("{hi=%d,lo=%d}", u.hi, u.lo)
}
// less returns true if u is less than a.
func (u *u128) less(a *u128) bool {
if u.hi != a.hi {
return u.hi < a.hi
}
return u.lo < a.lo
}
// equal returns true if u equalst to a.
func (u *u128) equal(a *u128) bool {
return u.hi == a.hi && u.lo == a.lo
}
// marshal appends the marshaled u to dst and returns the result.
func (u *u128) marshal(dst []byte) []byte {
dst = encoding.MarshalUint64(dst, u.hi)
dst = encoding.MarshalUint64(dst, u.lo)
return dst
}
// unmarshal unmarshals u from src and returns the tail.
func (u *u128) unmarshal(src []byte) ([]byte, error) {
if len(src) < 16 {
return src, fmt.Errorf("cannot unmarshal u128 from %d bytes; need at least 16 bytes", len(src))
}
u.hi = encoding.UnmarshalUint64(src[:8])
u.lo = encoding.UnmarshalUint64(src[8:])
return src[16:], nil
}