using System.Collections.Generic; namespace SharpCifs.Util.Sharpen { internal class ConcurrentHashMap : AbstractMap, IConcurrentMap { private Dictionary _table; public ConcurrentHashMap() { _table = new Dictionary(); } public ConcurrentHashMap(int initialCapacity, float loadFactor, int concurrencyLevel) { _table = new Dictionary(initialCapacity); } public override void Clear() { lock (_table) { _table = new Dictionary(); } } public override bool ContainsKey(object name) { return _table.ContainsKey((T)name); } public override ICollection> EntrySet() { return this; } public override TU Get(object key) { TU local; _table.TryGetValue((T)key, out local); return local; } protected override IEnumerator> InternalGetEnumerator() { return _table.GetEnumerator(); } public override bool IsEmpty() { return _table.Count == 0; } public override TU Put(T key, TU value) { lock (_table) { TU old = Get(key); Dictionary newTable = new Dictionary(_table); newTable[key] = value; _table = newTable; return old; } } public TU PutIfAbsent(T key, TU value) { lock (_table) { if (!ContainsKey(key)) { Dictionary newTable = new Dictionary(_table); newTable[key] = value; _table = newTable; return value; } return Get(key); } } public override TU Remove(object key) { lock (_table) { TU old = Get((T)key); Dictionary newTable = new Dictionary(_table); newTable.Remove((T)key); _table = newTable; return old; } } public bool Remove(object key, object value) { lock (_table) { if (ContainsKey(key) && value.Equals(Get(key))) { Dictionary newTable = new Dictionary(_table); newTable.Remove((T)key); _table = newTable; return true; } return false; } } public bool Replace(T key, TU oldValue, TU newValue) { lock (_table) { if (ContainsKey(key) && oldValue.Equals(Get(key))) { Dictionary newTable = new Dictionary(_table); newTable[key] = newValue; _table = newTable; return true; } return false; } } public override IEnumerable Keys { get { return _table.Keys; } } public override IEnumerable Values { get { return _table.Values; } } } }