1// Copyright (c) 2016 Couchbase, Inc. 2// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 3// except in compliance with the License. You may obtain a copy of the License at 4// http://www.apache.org/licenses/LICENSE-2.0 5// Unless required by applicable law or agreed to in writing, software distributed under the 6// License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, 7// either express or implied. See the License for the specific language governing permissions 8// and limitations under the License. 9 10package util 11 12import ( 13 "sync" 14) 15 16type IPairsPool struct { 17 pool *sync.Pool 18 size int 19} 20 21func NewIPairsPool(size int) *IPairsPool { 22 rv := &IPairsPool{ 23 pool: &sync.Pool{ 24 New: func() interface{} { 25 return make([][]IPair, 0, size) 26 }, 27 }, 28 size: size, 29 } 30 31 return rv 32} 33 34func (this *IPairsPool) Get() [][]IPair { 35 return this.pool.Get().([][]IPair) 36} 37 38func (this *IPairsPool) GetSized(length int) [][]IPair { 39 if length > this.size { 40 return make([][]IPair, length) 41 } 42 43 rv := this.Get() 44 rv = rv[0:length] 45 for i := 0; i < length; i++ { 46 rv[i] = nil 47 } 48 49 return rv 50} 51 52func (this *IPairsPool) Put(s [][]IPair) { 53 if cap(s) != this.size { 54 return 55 } 56 57 this.pool.Put(s[0:0]) 58} 59