...
1 package simple
2
3 import "k8s.io/kubernetes/third_party/forked/gonum/graph"
4
5
6 type edgeHolder interface {
7
8 Visit(visitor func(neighbor int, edge graph.Edge))
9
10 Delete(neighbor int) edgeHolder
11
12 Set(neighbor int, edge graph.Edge) edgeHolder
13
14 Get(neighbor int) (graph.Edge, bool)
15
16 Len() int
17 }
18
19
20 type sliceEdgeHolder struct {
21 self int
22 edges []graph.Edge
23 }
24
25 func (e *sliceEdgeHolder) Visit(visitor func(neighbor int, edge graph.Edge)) {
26 for _, edge := range e.edges {
27 if edge.From().ID() == e.self {
28 visitor(edge.To().ID(), edge)
29 } else {
30 visitor(edge.From().ID(), edge)
31 }
32 }
33 }
34 func (e *sliceEdgeHolder) Delete(neighbor int) edgeHolder {
35 edges := e.edges[:0]
36 for i, edge := range e.edges {
37 if edge.From().ID() == e.self {
38 if edge.To().ID() == neighbor {
39 continue
40 }
41 } else {
42 if edge.From().ID() == neighbor {
43 continue
44 }
45 }
46 edges = append(edges, e.edges[i])
47 }
48 e.edges = edges
49 return e
50 }
51 func (e *sliceEdgeHolder) Set(neighbor int, newEdge graph.Edge) edgeHolder {
52 for i, edge := range e.edges {
53 if edge.From().ID() == e.self {
54 if edge.To().ID() == neighbor {
55 e.edges[i] = newEdge
56 return e
57 }
58 } else {
59 if edge.From().ID() == neighbor {
60 e.edges[i] = newEdge
61 return e
62 }
63 }
64 }
65
66 if len(e.edges) < 4 {
67 e.edges = append(e.edges, newEdge)
68 return e
69 }
70
71 h := mapEdgeHolder(make(map[int]graph.Edge, len(e.edges)+1))
72 for i, edge := range e.edges {
73 if edge.From().ID() == e.self {
74 h[edge.To().ID()] = e.edges[i]
75 } else {
76 h[edge.From().ID()] = e.edges[i]
77 }
78 }
79 h[neighbor] = newEdge
80 return h
81 }
82 func (e *sliceEdgeHolder) Get(neighbor int) (graph.Edge, bool) {
83 for _, edge := range e.edges {
84 if edge.From().ID() == e.self {
85 if edge.To().ID() == neighbor {
86 return edge, true
87 }
88 } else {
89 if edge.From().ID() == neighbor {
90 return edge, true
91 }
92 }
93 }
94 return nil, false
95 }
96 func (e *sliceEdgeHolder) Len() int {
97 return len(e.edges)
98 }
99
100
101 type mapEdgeHolder map[int]graph.Edge
102
103 func (e mapEdgeHolder) Visit(visitor func(neighbor int, edge graph.Edge)) {
104 for neighbor, edge := range e {
105 visitor(neighbor, edge)
106 }
107 }
108 func (e mapEdgeHolder) Delete(neighbor int) edgeHolder {
109 delete(e, neighbor)
110 return e
111 }
112 func (e mapEdgeHolder) Set(neighbor int, edge graph.Edge) edgeHolder {
113 e[neighbor] = edge
114 return e
115 }
116 func (e mapEdgeHolder) Get(neighbor int) (graph.Edge, bool) {
117 edge, ok := e[neighbor]
118 return edge, ok
119 }
120 func (e mapEdgeHolder) Len() int {
121 return len(e)
122 }
123
View as plain text