forked from segmentio/stats
/
label.go
88 lines (71 loc) · 1.44 KB
/
label.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package prometheus
import (
"github.com/segmentio/fasthash/jody"
"github.com/segmentio/stats"
)
type label struct {
name string
value string
}
func (l label) hash() uint64 {
h := jody.Init64
h = jody.AddString64(h, l.name)
h = jody.AddString64(h, l.value)
return h
}
func (l1 label) equal(l2 label) bool {
return l1.name == l2.name && l1.value == l2.value
}
func (l1 label) less(l2 label) bool {
return l1.name < l2.name || (l1.name == l2.name && l1.value < l2.value)
}
type labels []label
func makeLabels(l ...label) labels {
m := make(labels, len(l))
copy(m, l)
return m
}
func (l labels) copyAppend(m ...label) labels {
c := make(labels, 0, len(l)+len(m))
c = append(c, l...)
c = append(c, m...)
return c
}
func (l labels) copy() labels {
return makeLabels(l...)
}
func (l labels) hash() uint64 {
h := jody.Init64
for i := range l {
h = jody.AddString64(h, l[i].name)
h = jody.AddString64(h, l[i].value)
}
return h
}
func (l1 labels) equal(l2 labels) bool {
if len(l1) != len(l2) {
return false
}
for i := range l1 {
if !l1[i].equal(l2[i]) {
return false
}
}
return true
}
func (l1 labels) less(l2 labels) bool {
n1 := len(l1)
n2 := len(l2)
for i := 0; i != n1 && i != n2; i++ {
if !l1[i].equal(l2[i]) {
return l1[i].less(l2[i])
}
}
return n1 < n2
}
func (l labels) appendTags(tags ...stats.Tag) labels {
for _, t := range tags {
l = append(l, label{name: t.Name, value: t.Value})
}
return l
}