e79aa3c0ed
Former-commit-id: a2155e9bd80020e49e72e86c44da02a8ac0e57a4
86 lines
2.3 KiB
C#
86 lines
2.3 KiB
C#
//------------------------------------------------------------
|
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
|
//------------------------------------------------------------
|
|
namespace System.Runtime
|
|
{
|
|
using System.Collections.Generic;
|
|
|
|
class DuplicateDetector<T>
|
|
where T : class
|
|
{
|
|
LinkedList<T> fifoList;
|
|
Dictionary<T, LinkedListNode<T>> items;
|
|
int capacity;
|
|
object thisLock;
|
|
|
|
public DuplicateDetector(int capacity)
|
|
{
|
|
Fx.Assert(capacity >= 0, "The capacity parameter must be a positive value.");
|
|
|
|
this.capacity = capacity;
|
|
this.items = new Dictionary<T, LinkedListNode<T>>();
|
|
this.fifoList = new LinkedList<T>();
|
|
this.thisLock = new object();
|
|
}
|
|
|
|
public bool AddIfNotDuplicate(T value)
|
|
{
|
|
Fx.Assert(value != null, "The value must be non null.");
|
|
bool success = false;
|
|
|
|
lock (this.thisLock)
|
|
{
|
|
if (!this.items.ContainsKey(value))
|
|
{
|
|
Add(value);
|
|
success = true;
|
|
}
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
void Add(T value)
|
|
{
|
|
Fx.Assert(this.items.Count == this.fifoList.Count, "The items and fifoList must be synchronized.");
|
|
|
|
if (this.items.Count == this.capacity)
|
|
{
|
|
LinkedListNode<T> node = this.fifoList.Last;
|
|
this.items.Remove(node.Value);
|
|
this.fifoList.Remove(node);
|
|
}
|
|
|
|
this.items.Add(value, this.fifoList.AddFirst(value));
|
|
}
|
|
|
|
public bool Remove(T value)
|
|
{
|
|
Fx.Assert(value != null, "The value must be non null.");
|
|
|
|
bool success = false;
|
|
LinkedListNode<T> node;
|
|
lock (this.thisLock)
|
|
{
|
|
if (this.items.TryGetValue(value, out node))
|
|
{
|
|
this.items.Remove(value);
|
|
this.fifoList.Remove(node);
|
|
success = true;
|
|
}
|
|
}
|
|
|
|
return success;
|
|
}
|
|
|
|
public void Clear()
|
|
{
|
|
lock (this.thisLock)
|
|
{
|
|
this.fifoList.Clear();
|
|
this.items.Clear();
|
|
}
|
|
}
|
|
}
|
|
}
|