Ejemplo n.º 1
0
            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);
            }
Ejemplo n.º 2
0
 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;
 }
Ejemplo n.º 3
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> > >();
                }
            }