return false;
}
+ public bool TryPop (out T data)
+ {
+ return ListPop (out data);
+ }
+
public bool Contains (T data)
{
return ContainsHash (comparer.GetHashCode (data));
return true;
}
+
+ bool ListPop (out T data)
+ {
+ Node rightNode = null, rightNodeNext = null, leftNode = null;
+ data = default (T);
+
+ do {
+ rightNode = head.Next;
+ if (rightNode == tail)
+ return false;
+
+ data = rightNode.Data;
+
+ rightNodeNext = rightNode.Next;
+ if (!rightNodeNext.Marked)
+ if (Interlocked.CompareExchange (ref rightNode.Next, new Node (rightNodeNext), rightNodeNext) == rightNodeNext)
+ break;
+ } while (true);
+
+ if (Interlocked.CompareExchange (ref leftNode.Next, rightNodeNext, rightNode) != rightNodeNext)
+ ListSearch (rightNode.Key, ref leftNode);
+
+ return true;
+ }
bool ListInsert (Node newNode)
{