public bool MoveNext() { if (_version != _graph._version) { throw new VersionChangedException(); } if (_done) { return(false); } if (!_started) { _started = true; foreach (T vertex in _graph.Keys) { _queue.Enqueue(vertex); } } // visit the next queued edge if (_edges.Count > 0) { _current = _edges.Dequeue(); return(true); } // no more vertices to explore if (_queue.Count == 0) { _done = true; return(false); } // Queue the next edges while (_queue.Count > 0) { T from = _queue.Dequeue(); KeyedCollection <T, GraphEdge <T, TWeight> > edges = _graph[from]; if (edges == null || edges.Count == 0) { continue; } foreach (GraphEdge <T, TWeight> edge in edges) { _edges.Enqueue(new EdgeEntry <T, GraphEdge <T, TWeight> >(from, edge)); } _current = _edges.Dequeue(); if (_edges.Count > 0) { break; } } return(true); }
void IEnumerator.Reset() { if (_version != _graph._version) { throw new VersionChangedException(); } _current = default(EdgeEntry <T, GraphEdge <T, TWeight> >); _started = false; _queue.Clear(); _edges.Clear(); _done = _graph.Count == 0; }
internal EdgeEnumerator([NotNull] WeightedGraphList <T, TWeight> graph) { _graph = graph; _version = graph._version; _current = default(EdgeEntry <T, GraphEdge <T, TWeight> >); _started = false; _done = _graph.Count == 0; if (_done) { _queue = null; _edges = null; } else { _queue = new Queue <T>(); _edges = new Queue <EdgeEntry <T, GraphEdge <T, TWeight> > >(); } }