示例#1
0
 public static void EnqueueAll <T>(this UniqueQueue <T> queue, IEnumerable <T> enu)
 {
     foreach (T obj in enu)
     {
         queue.Enqueue(obj);
     }
 }
示例#2
0
        public static void Update(IGate gate, Action updated)
        {
            //Initialize
            int maxRepeat = 19;
            Dictionary <IGate, int> repeatMap = new Dictionary <IGate, int>();
            UniqueQueue <IGate>     newGates  = new UniqueQueue <IGate>();

            gate.Update();
            updated();
            repeatMap.Add(gate, 1);
            newGates.EnqueueAll(gate.OutputConnections
                                .Where(connection => !connection.Connected)
                                .Select(connection => connection.Inputee));

            //Loop through gates
            while (newGates.Count > 0)
            {
                gate = newGates.Dequeue();

                //Prevent looping forever
                if (!repeatMap.ContainsKey(gate))
                {
                    repeatMap.Add(gate, 0);
                }
                repeatMap[gate]++;

                if (repeatMap[gate] > maxRepeat)
                {
                    break;
                }

                gate.Update();
                updated();
                var candidates = gate.OutputConnections
                                 .Where(connection => !connection.Connected)
                                 .Select(connection => connection.Inputee);

                newGates.EnqueueAll(candidates);
            }
        }