// 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" // OrderedLines implements the graph.Lines and graph.LineSlicer interfaces. // The iteration order of OrderedLines is the order of lines passed to // NewLineIterator. type OrderedLines struct { idx int lines []graph.Line } // NewOrderedLines returns an OrderedLines initialized with the provided lines. func NewOrderedLines(lines []graph.Line) *OrderedLines { return &OrderedLines{idx: -1, lines: lines} } // Len returns the remaining number of lines to be iterated over. func (e *OrderedLines) Len() int { if e.idx >= len(e.lines) { return 0 } if e.idx <= 0 { return len(e.lines) } return len(e.lines[e.idx:]) } // Next returns whether the next call of Line will return a valid line. func (e *OrderedLines) Next() bool { if uint(e.idx)+1 < uint(len(e.lines)) { e.idx++ return true } e.idx = len(e.lines) return false } // Line returns the current line of the iterator. Next must have been // called prior to a call to Line. func (e *OrderedLines) Line() graph.Line { if e.idx >= len(e.lines) || e.idx < 0 { return nil } return e.lines[e.idx] } // LineSlice returns all the remaining lines in the iterator and advances // the iterator. func (e *OrderedLines) LineSlice() []graph.Line { if e.idx >= len(e.lines) { return nil } idx := e.idx if idx == -1 { idx = 0 } e.idx = len(e.lines) return e.lines[idx:] } // Reset returns the iterator to its initial state. func (e *OrderedLines) Reset() { e.idx = -1 } // OrderedWeightedLines implements the graph.Lines and graph.LineSlicer interfaces. // The iteration order of OrderedWeightedLines is the order of lines passed to // NewLineIterator. type OrderedWeightedLines struct { idx int lines []graph.WeightedLine } // NewWeightedLineIterator returns an OrderedWeightedLines initialized with the provided lines. func NewOrderedWeightedLines(lines []graph.WeightedLine) *OrderedWeightedLines { return &OrderedWeightedLines{idx: -1, lines: lines} } // Len returns the remaining number of lines to be iterated over. func (e *OrderedWeightedLines) Len() int { if e.idx >= len(e.lines) { return 0 } if e.idx <= 0 { return len(e.lines) } return len(e.lines[e.idx:]) } // Next returns whether the next call of WeightedLine will return a valid line. func (e *OrderedWeightedLines) Next() bool { if uint(e.idx)+1 < uint(len(e.lines)) { e.idx++ return true } e.idx = len(e.lines) return false } // WeightedLine returns the current line of the iterator. Next must have been // called prior to a call to WeightedLine. func (e *OrderedWeightedLines) WeightedLine() graph.WeightedLine { if e.idx >= len(e.lines) || e.idx < 0 { return nil } return e.lines[e.idx] } // WeightedLineSlice returns all the remaining lines in the iterator and advances // the iterator. func (e *OrderedWeightedLines) WeightedLineSlice() []graph.WeightedLine { if e.idx >= len(e.lines) { return nil } idx := e.idx if idx == -1 { idx = 0 } e.idx = len(e.lines) return e.lines[idx:] } // Reset returns the iterator to its initial state. func (e *OrderedWeightedLines) Reset() { e.idx = -1 }