...

Source file src/github.com/gobwas/glob/match/segments.go

Documentation: github.com/gobwas/glob/match

     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  	// make []int with less capacity than cacheFrom
    73  	// is faster than acquiring it from pool
    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  	// make []int with less capacity than cacheFrom
    85  	// is faster than acquiring it from pool
    86  	if c < cacheFrom {
    87  		return
    88  	}
    89  
    90  	segmentsPools[getTableIndex(c)].Put(s)
    91  }
    92  

View as plain text