...

Source file src/k8s.io/kubernetes/third_party/forked/gonum/graph/simple/edgeholder.go

Documentation: k8s.io/kubernetes/third_party/forked/gonum/graph/simple

     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  }
   123  

View as plain text