Skip to content

Commit

Permalink
Add MessageQueue
Browse files Browse the repository at this point in the history
  • Loading branch information
blowfishpro committed Oct 4, 2017
1 parent e40426a commit 7a2e18d
Show file tree
Hide file tree
Showing 4 changed files with 150 additions and 0 deletions.
95 changes: 95 additions & 0 deletions ModuleManager/Collections/MessageQueue.cs
@@ -0,0 +1,95 @@
using System;
using System.Collections;
using System.Collections.Generic;

namespace ModuleManager.Collections
{
public interface IMessageQueue<T>
{
void Add(T value);
}

public class MessageQueue<T> : IMessageQueue<T>, IEnumerable<T>
{
public class Enumerator : IEnumerator<T>
{
private readonly MessageQueue<T> queue;
private Node current;

public Enumerator(MessageQueue<T> queue)
{
this.queue = queue;
}

public T Current => current.value;
object IEnumerator.Current => Current;

public void Dispose() { }

public bool MoveNext()
{
if (current == null)
current = queue.head;
else
current = current.next;

return current != null;
}

public void Reset()
{
current = null;
}
}

private class Node
{
public Node next;
public readonly T value;

public Node(T value)
{
this.value = value;
}
}

private readonly object lockObject = new object();
private Node head;
private Node tail;

public void Add(T value)
{
Node node = new Node(value);
lock (lockObject)
{
if (head == null)
{
head = node;
tail = node;
}
else
{
tail.next = node;
tail = node;
}
}
}

public MessageQueue<T> TakeAll()
{
MessageQueue<T> queue = new MessageQueue<T>();
lock(lockObject)
{
queue.head = head;
queue.tail = tail;
head = null;
tail = null;
}
return queue;
}

public Enumerator GetEnumerator() => new Enumerator(this);
IEnumerator<T> IEnumerable<T>.GetEnumerator() => GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
}
}
1 change: 1 addition & 0 deletions ModuleManager/ModuleManager.csproj
Expand Up @@ -46,6 +46,7 @@
<Compile Include="IPatchProgress.cs" />
<Compile Include="Logging\IBasicLogger.cs" />
<Compile Include="Logging\ModLogger.cs" />
<Compile Include="Collections\MessageQueue.cs" />
<Compile Include="MMPatchLoader.cs" />
<Compile Include="ModuleManager.cs" />
<Compile Include="ModListGenerator.cs" />
Expand Down
53 changes: 53 additions & 0 deletions ModuleManagerTests/Collections/MessageQueueTest.cs
@@ -0,0 +1,53 @@
using System;
using Xunit;
using ModuleManager.Collections;

namespace ModuleManagerTests.Collections
{
public class MessageQueueTest
{
private class TestClass { }

private MessageQueue<TestClass> queue = new MessageQueue<TestClass>();

[Fact]
public void Test__Empty()
{
Assert.Empty(queue);
}

[Fact]
public void TestAdd()
{
TestClass o1 = new TestClass();
TestClass o2 = new TestClass();
TestClass o3 = new TestClass();

queue.Add(o1);
queue.Add(o2);
queue.Add(o3);

Assert.Equal(new[] { o1, o2, o3 }, queue);
}

[Fact]
public void TestTakeAll()
{
TestClass o1 = new TestClass();
TestClass o2 = new TestClass();
TestClass o3 = new TestClass();
TestClass o4 = new TestClass();

queue.Add(o1);
queue.Add(o2);
queue.Add(o3);

MessageQueue<TestClass> queue2 = queue.TakeAll();

queue.Add(o4);

Assert.Equal(new[] { o4 }, queue);
Assert.Equal(new[] { o1, o2, o3 }, queue2);
}
}
}
1 change: 1 addition & 0 deletions ModuleManagerTests/ModuleManagerTests.csproj
Expand Up @@ -52,6 +52,7 @@
<Compile Include="Extensions\StringExtensionsTest.cs" />
<Compile Include="Extensions\UrlConfigExtensionsTest.cs" />
<Compile Include="NeedsCheckerTest.cs" />
<Compile Include="Collections\MessageQueueTest.cs" />
<Compile Include="PatchListTest.cs" />
<Compile Include="Collections\ArrayEnumeratorTest.cs" />
<Compile Include="Collections\ImmutableStackTest.cs" />
Expand Down

0 comments on commit 7a2e18d

Please sign in to comment.