1//  Copyright (c) 2014 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 InterfacesPool struct {
17	pool *sync.Pool
18	size int
19}
20
21func NewInterfacesPool(size int) *InterfacesPool {
22	rv := &InterfacesPool{
23		pool: &sync.Pool{
24			New: func() interface{} {
25				return make([][]interface{}, 0, size)
26			},
27		},
28		size: size,
29	}
30
31	return rv
32}
33
34func (this *InterfacesPool) Get() [][]interface{} {
35	return this.pool.Get().([][]interface{})
36}
37
38func (this *InterfacesPool) GetSized(length int) [][]interface{} {
39	if length > this.size {
40		return make([][]interface{}, 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 *InterfacesPool) Put(s [][]interface{}) {
53	if cap(s) != this.size {
54		return
55	}
56
57	this.pool.Put(s[0:0])
58}
59