...
1 package match
2
3 import (
4 "sync"
5 )
6
7 type SomePool interface {
8 Get() []int
9 Put([]int)
10 }
11
12 var segmentsPools [1024]sync.Pool
13
14 func toPowerOfTwo(v int) int {
15 v--
16 v |= v >> 1
17 v |= v >> 2
18 v |= v >> 4
19 v |= v >> 8
20 v |= v >> 16
21 v++
22
23 return v
24 }
25
26 const (
27 cacheFrom = 16
28 cacheToAndHigher = 1024
29 cacheFromIndex = 15
30 cacheToAndHigherIndex = 1023
31 )
32
33 var (
34 segments0 = []int{0}
35 segments1 = []int{1}
36 segments2 = []int{2}
37 segments3 = []int{3}
38 segments4 = []int{4}
39 )
40
41 var segmentsByRuneLength [5][]int = [5][]int{
42 0: segments0,
43 1: segments1,
44 2: segments2,
45 3: segments3,
46 4: segments4,
47 }
48
49 func init() {
50 for i := cacheToAndHigher; i >= cacheFrom; i >>= 1 {
51 func(i int) {
52 segmentsPools[i-1] = sync.Pool{New: func() interface{} {
53 return make([]int, 0, i)
54 }}
55 }(i)
56 }
57 }
58
59 func getTableIndex(c int) int {
60 p := toPowerOfTwo(c)
61 switch {
62 case p >= cacheToAndHigher:
63 return cacheToAndHigherIndex
64 case p <= cacheFrom:
65 return cacheFromIndex
66 default:
67 return p - 1
68 }
69 }
70
71 func acquireSegments(c int) []int {
72
73
74 if c < cacheFrom {
75 return make([]int, 0, c)
76 }
77
78 return segmentsPools[getTableIndex(c)].Get().([]int)[:0]
79 }
80
81 func releaseSegments(s []int) {
82 c := cap(s)
83
84
85
86 if c < cacheFrom {
87 return
88 }
89
90 segmentsPools[getTableIndex(c)].Put(s)
91 }
92
View as plain text