DiagLinkedList<T>
using System.Collections;
using System.Collections.Generic;
namespace System.Diagnostics
{
internal sealed class DiagLinkedList<T> : IEnumerable<T>, IEnumerable
{
private DiagNode<T> _first;
private DiagNode<T> _last;
public DiagNode<T> First => _first;
public DiagLinkedList()
{
}
public DiagLinkedList(T firstValue)
{
_last = (_first = new DiagNode<T>(firstValue));
}
public DiagLinkedList(IEnumerator<T> e)
{
_last = (_first = new DiagNode<T>(e.Current));
while (e.MoveNext()) {
_last.Next = new DiagNode<T>(e.Current);
_last = _last.Next;
}
}
public void Clear()
{
lock (this) {
_first = (_last = null);
}
}
private void UnsafeAdd(DiagNode<T> newNode)
{
if (_first == null)
_first = (_last = newNode);
else {
_last.Next = newNode;
_last = newNode;
}
}
public void Add(T value)
{
DiagNode<T> newNode = new DiagNode<T>(value);
lock (this) {
UnsafeAdd(newNode);
}
}
public bool AddIfNotExist(T value, Func<T, T, bool> compare)
{
lock (this) {
for (DiagNode<T> diagNode = _first; diagNode != null; diagNode = diagNode.Next) {
if (compare(value, diagNode.Value))
return false;
}
DiagNode<T> newNode = new DiagNode<T>(value);
UnsafeAdd(newNode);
return true;
}
}
public T Remove(T value, Func<T, T, bool> compare)
{
lock (this) {
DiagNode<T> diagNode = _first;
if (diagNode != null) {
if (!compare(diagNode.Value, value)) {
for (DiagNode<T> next = diagNode.Next; next != null; next = next.Next) {
if (compare(next.Value, value)) {
diagNode.Next = next.Next;
if (_last == next)
_last = diagNode;
return next.Value;
}
diagNode = next;
}
return default(T);
}
_first = diagNode.Next;
if (_first == null)
_last = null;
return diagNode.Value;
}
return default(T);
}
}
public void AddFront(T value)
{
DiagNode<T> diagNode = new DiagNode<T>(value);
lock (this) {
diagNode.Next = _first;
_first = diagNode;
}
}
public Enumerator<T> GetEnumerator()
{
return new Enumerator<T>(_first);
}
IEnumerator<T> IEnumerable<T>.GetEnumerator()
{
return GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}