| // Copyright ©2018 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 iterator |
| |
| import "gonum.org/v1/gonum/graph" |
| |
| // OrderedEdges implements the graph.Edges and graph.EdgeSlicer interfaces. |
| // The iteration order of OrderedEdges is the order of edges passed to |
| // NewEdgeIterator. |
| type OrderedEdges struct { |
| idx int |
| edges []graph.Edge |
| } |
| |
| // NewOrderedEdges returns an OrderedEdges initialized with the provided edges. |
| func NewOrderedEdges(edges []graph.Edge) *OrderedEdges { |
| return &OrderedEdges{idx: -1, edges: edges} |
| } |
| |
| // Len returns the remaining number of edges to be iterated over. |
| func (e *OrderedEdges) Len() int { |
| if e.idx >= len(e.edges) { |
| return 0 |
| } |
| if e.idx <= 0 { |
| return len(e.edges) |
| } |
| return len(e.edges[e.idx:]) |
| } |
| |
| // Next returns whether the next call of Edge will return a valid edge. |
| func (e *OrderedEdges) Next() bool { |
| if uint(e.idx)+1 < uint(len(e.edges)) { |
| e.idx++ |
| return true |
| } |
| e.idx = len(e.edges) |
| return false |
| } |
| |
| // Edge returns the current edge of the iterator. Next must have been |
| // called prior to a call to Edge. |
| func (e *OrderedEdges) Edge() graph.Edge { |
| if e.idx >= len(e.edges) || e.idx < 0 { |
| return nil |
| } |
| return e.edges[e.idx] |
| } |
| |
| // EdgeSlice returns all the remaining edges in the iterator and advances |
| // the iterator. |
| func (e *OrderedEdges) EdgeSlice() []graph.Edge { |
| if e.idx >= len(e.edges) { |
| return nil |
| } |
| idx := e.idx |
| if idx == -1 { |
| idx = 0 |
| } |
| e.idx = len(e.edges) |
| return e.edges[idx:] |
| } |
| |
| // Reset returns the iterator to its initial state. |
| func (e *OrderedEdges) Reset() { |
| e.idx = -1 |
| } |
| |
| // OrderedWeightedEdges implements the graph.Edges and graph.EdgeSlicer interfaces. |
| // The iteration order of OrderedWeightedEdges is the order of edges passed to |
| // NewEdgeIterator. |
| type OrderedWeightedEdges struct { |
| idx int |
| edges []graph.WeightedEdge |
| } |
| |
| // NewOrderedWeightedEdges returns an OrderedWeightedEdges initialized with the provided edges. |
| func NewOrderedWeightedEdges(edges []graph.WeightedEdge) *OrderedWeightedEdges { |
| return &OrderedWeightedEdges{idx: -1, edges: edges} |
| } |
| |
| // Len returns the remaining number of edges to be iterated over. |
| func (e *OrderedWeightedEdges) Len() int { |
| if e.idx >= len(e.edges) { |
| return 0 |
| } |
| if e.idx <= 0 { |
| return len(e.edges) |
| } |
| return len(e.edges[e.idx:]) |
| } |
| |
| // Next returns whether the next call of WeightedEdge will return a valid edge. |
| func (e *OrderedWeightedEdges) Next() bool { |
| if uint(e.idx)+1 < uint(len(e.edges)) { |
| e.idx++ |
| return true |
| } |
| e.idx = len(e.edges) |
| return false |
| } |
| |
| // WeightedEdge returns the current edge of the iterator. Next must have been |
| // called prior to a call to WeightedEdge. |
| func (e *OrderedWeightedEdges) WeightedEdge() graph.WeightedEdge { |
| if e.idx >= len(e.edges) || e.idx < 0 { |
| return nil |
| } |
| return e.edges[e.idx] |
| } |
| |
| // WeightedEdgeSlice returns all the remaining edges in the iterator and advances |
| // the iterator. |
| func (e *OrderedWeightedEdges) WeightedEdgeSlice() []graph.WeightedEdge { |
| if e.idx >= len(e.edges) { |
| return nil |
| } |
| idx := e.idx |
| if idx == -1 { |
| idx = 0 |
| } |
| e.idx = len(e.edges) |
| return e.edges[idx:] |
| } |
| |
| // Reset returns the iterator to its initial state. |
| func (e *OrderedWeightedEdges) Reset() { |
| e.idx = -1 |
| } |