예제 #1
0
        public void DMCArrayPriority()
        {
            var ca = new DMCompactingArray <I>(4);

            DeletionMarker <I>[] dmi = new DeletionMarker <I> [12];
            for (int ii = 0; ii < 8; ++ii)
            {
                var x = new I(ii);
                dmi[ii] = ca.AddPriority(x, 10 - ii);
            }
            for (int ii = 0; ii < 8; ++ii)
            {
                //Inserted backwards!
                Assert.AreEqual(ca[7 - ii].x, ii);
            }
            ca.Compact();
            dmi[7].MarkForDeletion();
            dmi[6].MarkForDeletion();
            dmi[5].MarkForDeletion();
            dmi[3].MarkForDeletion();
            ca.Compact();
            Assert.AreEqual(ca.Count, 4);
            Assert.AreEqual(ca[0].x, 4);
            Assert.AreEqual(ca[1].x, 2);
            Assert.AreEqual(ca[2].x, 1);
            Assert.AreEqual(ca[3].x, 0);
            ca.AddPriority(new I(999), -1);
            Assert.AreEqual(ca[0].x, 999);
            Assert.AreEqual(ca[4].x, 0);
            ca.AddPriority(new I(555), 1000);
            Assert.AreEqual(ca[4].x, 0);
            Assert.AreEqual(ca[5].x, 555);
            ca.Empty();
            Assert.AreEqual(ca.Count, 0);
        }
예제 #2
0
        public void DMCArray()
        {
            var ca = new DMCompactingArray <I>(4);

            DeletionMarker <I>[] dmi = new DeletionMarker <I> [12];
            for (int ii = 0; ii < 8; ++ii)
            {
                var x = new I(ii);
                dmi[ii] = ca.Add(x);
            }
            for (int ii = 0; ii < 8; ++ii)
            {
                Assert.AreEqual(ca[ii].x, ii);
            }
            ca.Compact();
            dmi[0].MarkForDeletion();
            dmi[1].MarkForDeletion();
            dmi[2].MarkForDeletion();
            dmi[4].MarkForDeletion();
            ca.Compact();
            Assert.AreEqual(ca.Count, 4);
            Assert.AreEqual(ca[0].x, 3);
            Assert.AreEqual(ca[1].x, 5);
            Assert.AreEqual(ca[2].x, 6);
            Assert.AreEqual(ca[3].x, 7);
            dmi[8]  = ca.Add(new I(20));
            dmi[9]  = ca.Add(new I(30));
            dmi[10] = ca.Add(new I(40));
            dmi[11] = ca.Add(new I(50));
            dmi[11].MarkForDeletion();
            dmi[8].MarkForDeletion();
            dmi[3].MarkForDeletion(); //ca[0]
            ca.Compact();
            Assert.AreEqual(ca[1].x, 6);
            Assert.AreEqual(ca[3].x, 30);
            Assert.AreEqual(ca[4].x, 40);
            Assert.AreEqual(ca.Count, 5);
            ca.Empty();
            Assert.AreEqual(ca.Count, 0);
        }
예제 #3
0
파일: Events.cs 프로젝트: Bagoum/danmokou
            public void Publish(T obj)
            {
                int temp_last = callbacks.Count;

                for (int ii = 0; ii < temp_last; ++ii)
                {
                    DeletionMarker <Action <T> > listener = callbacks.arr[ii];
                    if (!listener.markedForDeletion)
                    {
                        listener.obj(obj);
                    }
                }
                callbacks.Compact();
            }
예제 #4
0
 public override void RegularUpdate()
 {
     //The reason this is done in RU instead of immediately on Queue
     // is to allow successive Appear/Disappears in one frame to cancel out
     // in the ReturnTo menu situation.
     if (!isRunning && continuations.Count > 0)
     {
         Dequeue();
     }
     for (int ii = 0; ii < updaters.Count; ++ii)
     {
         if (!updaters.arr[ii].markedForDeletion)
         {
             if (updaters[ii].DoUpdate())
             {
                 updaters.arr[ii].MarkForDeletion();
             }
         }
     }
     updaters.Compact();
     base.RegularUpdate();
 }