summaryrefslogtreecommitdiff
path: root/vendor/k8s.io/client-go/util/buffer/ring_growing.go
diff options
context:
space:
mode:
authorDaniel J Walsh <dwalsh@redhat.com>2018-03-26 18:26:55 -0400
committerAtomic Bot <atomic-devel@projectatomic.io>2018-03-27 18:09:12 +0000
commitaf64e10400f8533a0c48ecdf5ab9b7fbf329e14e (patch)
tree59160e3841b440dd35189c724bbb4375a7be173b /vendor/k8s.io/client-go/util/buffer/ring_growing.go
parent26d7e3c7b85e28c4e42998c90fdcc14079f13eef (diff)
downloadpodman-af64e10400f8533a0c48ecdf5ab9b7fbf329e14e.tar.gz
podman-af64e10400f8533a0c48ecdf5ab9b7fbf329e14e.tar.bz2
podman-af64e10400f8533a0c48ecdf5ab9b7fbf329e14e.zip
Vendor in lots of kubernetes stuff to shrink image size
Signed-off-by: Daniel J Walsh <dwalsh@redhat.com> Closes: #554 Approved by: mheon
Diffstat (limited to 'vendor/k8s.io/client-go/util/buffer/ring_growing.go')
-rw-r--r--vendor/k8s.io/client-go/util/buffer/ring_growing.go72
1 files changed, 72 insertions, 0 deletions
diff --git a/vendor/k8s.io/client-go/util/buffer/ring_growing.go b/vendor/k8s.io/client-go/util/buffer/ring_growing.go
new file mode 100644
index 000000000..86965a513
--- /dev/null
+++ b/vendor/k8s.io/client-go/util/buffer/ring_growing.go
@@ -0,0 +1,72 @@
+/*
+Copyright 2017 The Kubernetes Authors.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package buffer
+
+// RingGrowing is a growing ring buffer.
+// Not thread safe.
+type RingGrowing struct {
+ data []interface{}
+ n int // Size of Data
+ beg int // First available element
+ readable int // Number of data items available
+}
+
+// NewRingGrowing constructs a new RingGrowing instance with provided parameters.
+func NewRingGrowing(initialSize int) *RingGrowing {
+ return &RingGrowing{
+ data: make([]interface{}, initialSize),
+ n: initialSize,
+ }
+}
+
+// ReadOne reads (consumes) first item from the buffer if it is available, otherwise returns false.
+func (r *RingGrowing) ReadOne() (data interface{}, ok bool) {
+ if r.readable == 0 {
+ return nil, false
+ }
+ r.readable--
+ element := r.data[r.beg]
+ r.data[r.beg] = nil // Remove reference to the object to help GC
+ if r.beg == r.n-1 {
+ // Was the last element
+ r.beg = 0
+ } else {
+ r.beg++
+ }
+ return element, true
+}
+
+// WriteOne adds an item to the end of the buffer, growing it if it is full.
+func (r *RingGrowing) WriteOne(data interface{}) {
+ if r.readable == r.n {
+ // Time to grow
+ newN := r.n * 2
+ newData := make([]interface{}, newN)
+ to := r.beg + r.readable
+ if to <= r.n {
+ copy(newData, r.data[r.beg:to])
+ } else {
+ copied := copy(newData, r.data[r.beg:])
+ copy(newData[copied:], r.data[:(to%r.n)])
+ }
+ r.beg = 0
+ r.data = newData
+ r.n = newN
+ }
+ r.data[(r.readable+r.beg)%r.n] = data
+ r.readable++
+}