k8s.io/kubernetes@v1.31.0-alpha.0.0.20240520171757-56147500dadc/third_party/forked/gonum/graph/simple/edgeholder.go (about) 1 package simple 2 3 import "k8s.io/kubernetes/third_party/forked/gonum/graph" 4 5 // edgeHolder represents a set of edges, with no more than one edge to or from a particular neighbor node 6 type edgeHolder interface { 7 // Visit invokes visitor with each edge and the id of the neighbor node in the edge 8 Visit(visitor func(neighbor int, edge graph.Edge)) 9 // Delete removes edges to or from the specified neighbor 10 Delete(neighbor int) edgeHolder 11 // Set stores the edge to or from the specified neighbor 12 Set(neighbor int, edge graph.Edge) edgeHolder 13 // Get returns the edge to or from the specified neighbor 14 Get(neighbor int) (graph.Edge, bool) 15 // Len returns the number of edges 16 Len() int 17 } 18 19 // sliceEdgeHolder holds a list of edges to or from self 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 // mapEdgeHolder holds a map of neighbors to edges 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 }