mirror of https://github.com/k3s-io/k3s
75 lines
1.7 KiB
Go
75 lines
1.7 KiB
Go
// Copyright ©2015 The gonum Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
// Package linear provides common linear data structures.
|
|
package linear
|
|
|
|
import (
|
|
"k8s.io/kubernetes/third_party/forked/gonum/graph"
|
|
)
|
|
|
|
// NodeStack implements a LIFO stack of graph.Node.
|
|
type NodeStack []graph.Node
|
|
|
|
// Len returns the number of graph.Nodes on the stack.
|
|
func (s *NodeStack) Len() int { return len(*s) }
|
|
|
|
// Pop returns the last graph.Node on the stack and removes it
|
|
// from the stack.
|
|
func (s *NodeStack) Pop() graph.Node {
|
|
v := *s
|
|
v, n := v[:len(v)-1], v[len(v)-1]
|
|
*s = v
|
|
return n
|
|
}
|
|
|
|
// Push adds the node n to the stack at the last position.
|
|
func (s *NodeStack) Push(n graph.Node) { *s = append(*s, n) }
|
|
|
|
// NodeQueue implements a FIFO queue.
|
|
type NodeQueue struct {
|
|
head int
|
|
data []graph.Node
|
|
}
|
|
|
|
// Len returns the number of graph.Nodes in the queue.
|
|
func (q *NodeQueue) Len() int { return len(q.data) - q.head }
|
|
|
|
// Enqueue adds the node n to the back of the queue.
|
|
func (q *NodeQueue) Enqueue(n graph.Node) {
|
|
if len(q.data) == cap(q.data) && q.head > 0 {
|
|
l := q.Len()
|
|
copy(q.data, q.data[q.head:])
|
|
q.head = 0
|
|
q.data = append(q.data[:l], n)
|
|
} else {
|
|
q.data = append(q.data, n)
|
|
}
|
|
}
|
|
|
|
// Dequeue returns the graph.Node at the front of the queue and
|
|
// removes it from the queue.
|
|
func (q *NodeQueue) Dequeue() graph.Node {
|
|
if q.Len() == 0 {
|
|
panic("queue: empty queue")
|
|
}
|
|
|
|
var n graph.Node
|
|
n, q.data[q.head] = q.data[q.head], nil
|
|
q.head++
|
|
|
|
if q.Len() == 0 {
|
|
q.head = 0
|
|
q.data = q.data[:0]
|
|
}
|
|
|
|
return n
|
|
}
|
|
|
|
// Reset clears the queue for reuse.
|
|
func (q *NodeQueue) Reset() {
|
|
q.head = 0
|
|
q.data = q.data[:0]
|
|
}
|