Example #1
0
        public void Fill_And_Grow(DequeConstructors <int> constructors)
        {
            var capCtor = constructors.Item1;

            var buffer = capCtor(1);

            buffer.PushLeft(1);
            Assert.AreEqual(1, buffer.Count);
            buffer.PushLeft(2);
            Assert.AreEqual(2, buffer.Count);
            buffer.PushLeft(3);
            Assert.AreEqual(3, buffer.Count);
            buffer.PushLeft(4);
            Assert.AreEqual(4, buffer.Count);
            buffer.PushLeft(5);
            Assert.AreEqual(5, buffer.Count);
            Assert.AreEqual(1, buffer.PopRight());
            Assert.AreEqual(4, buffer.Count);
            Assert.AreEqual(2, buffer.PopRight());
            Assert.AreEqual(3, buffer.Count);
            Assert.AreEqual(3, buffer.PopRight());
            Assert.AreEqual(2, buffer.Count);
            Assert.AreEqual(4, buffer.PopRight());
            Assert.AreEqual(1, buffer.Count);
            Assert.AreEqual(5, buffer.PopRight());
            Assert.AreEqual(0, buffer.Count);
        }
Example #2
0
        public void InverseEnqueue_SunnyPath(DequeConstructors <int> constructors)
        {
            var capCtor = constructors.Item1;

            var buffer = capCtor(1);

            foreach (var i in Enumerable.Range(1, 100))
            {
                buffer.PushLeft(i);
                Assert.AreEqual(i, buffer.PeekLeft());
                Assert.AreEqual(1, buffer.PeekRight());
            }
        }
        public void ConcurrentlyPushPopWhateverOrder(DequeConstructors <int> constructors)
        {
            const int numItems = 100_000;
            var       capCtor  = constructors.Item1;
            var       buffer   = capCtor(1);

            var random = new Random(0);
            var bag    = new ConcurrentBag <int>();

            for (var i = 0; i < numItems; i++)
            {
                bag.Add(random.Next(0, 6));
            }

            var numElements = 0;

            Parallel.For(0, bag.Count, i =>
            {
                if (!bag.TryTake(out var j))
                {
                    return;
                }
                switch (j)
                {
                case 0:
                    buffer.PushLeft(i);
                    Interlocked.Increment(ref numElements);
                    break;

                case 1:
                    buffer.PushRight(i);
                    Interlocked.Increment(ref numElements);
                    break;

                case 2 when buffer.TryPopLeft(out _):
                    Interlocked.Decrement(ref numElements);
                    break;

                case 3 when buffer.TryPopRight(out _):
                    Interlocked.Decrement(ref numElements);
                    break;

                case 4:
                    buffer.TryPeekLeft(out _);
                    break;

                case 5:
                    buffer.TryPeekRight(out _);
                    break;
                }
            });
        public void ConcurrentlyPush(DequeConstructors <int> constructors)
        {
            const int numItems = 5_000;
            var       capCtor  = constructors.Item1;
            var       buffer   = capCtor(1);

            Parallel.For(0, numItems / 2, i => buffer.PushLeft(i));
            Parallel.For(numItems / 2, numItems, i => buffer.PushRight(i));
            Assert.AreEqual(numItems, buffer.Count);

            var list = new List <int>(buffer.Count);

            while (0 < buffer.Count)
            {
                list.Add(buffer.PopRight());
            }
            CollectionAssert.AreEquivalent(Enumerable.Range(0, numItems), list);
        }
Example #5
0
 public void SequencesOfPopsAndPushes(DequeConstructors <int> constructors)
 {
     var sequences = new[]