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 }