github.com/gorgonia/agogo@v0.1.1/pool.go (about)

     1  package agogo
     2  
     3  import (
     4  	"sync"
     5  )
     6  
     7  var iterPool = make(map[int]map[int]*sync.Pool)
     8  
     9  func borrowIterator(m, n int) [][]float32 {
    10  	if d, ok := iterPool[m]; ok {
    11  		if d2, ok := d[n]; ok {
    12  			return d2.Get().([][]float32)
    13  		}
    14  	}
    15  	retVal := make([][]float32, m)
    16  	for i := range retVal {
    17  		retVal[i] = make([]float32, n)
    18  	}
    19  	return retVal
    20  }
    21  
    22  func ReturnIterator(m, n int, it [][]float32) {
    23  	if d, ok := iterPool[m]; ok {
    24  		if _, ok := d[n]; ok {
    25  			iterPool[m][n].Put(it)
    26  		} else {
    27  			iterPool[m][n] = &sync.Pool{
    28  				New: func() interface{} {
    29  					retVal := make([][]float32, m)
    30  					for i := range retVal {
    31  						retVal[i] = make([]float32, n)
    32  					}
    33  					return retVal
    34  				},
    35  			}
    36  			iterPool[m][n].Put(it)
    37  		}
    38  	} else {
    39  		iterPool[m] = make(map[int]*sync.Pool)
    40  		iterPool[m][n] = &sync.Pool{
    41  			New: func() interface{} {
    42  				retVal := make([][]float32, m)
    43  				for i := range retVal {
    44  					retVal[i] = make([]float32, n)
    45  				}
    46  				return retVal
    47  			},
    48  		}
    49  		iterPool[m][n].Put(it)
    50  	}
    51  }