From bfcd1b520fd79b893e721ba916ae5e1656407d2f Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Wed, 16 Aug 2017 02:43:41 -0400 Subject: merge common implementations and server implementations --- .../IO/SharpCifs/Util/Sharpen/ConcurrentHashMap.cs | 122 +++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/ConcurrentHashMap.cs (limited to 'Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/ConcurrentHashMap.cs') diff --git a/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/ConcurrentHashMap.cs b/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/ConcurrentHashMap.cs new file mode 100644 index 000000000..7f464ad36 --- /dev/null +++ b/Emby.Server.Implementations/IO/SharpCifs/Util/Sharpen/ConcurrentHashMap.cs @@ -0,0 +1,122 @@ +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; } + } + } +} -- cgit v1.2.3