123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- // 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]
- }
|