| using J2N.Collections.Generic.Extensions; |
| using System; |
| using System.Collections.Generic; |
| using System.Threading; |
| |
| namespace Lucene.Net.Support |
| { |
| /* |
| * Licensed to the Apache Software Foundation (ASF) under one or more |
| * contributor license agreements. See the NOTICE file distributed with |
| * this work for additional information regarding copyright ownership. |
| * The ASF licenses this file to You under the Apache License, Version 2.0 |
| * (the "License"); you may not use this file except in compliance with |
| * the License. You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| internal class ConcurrentDictionaryWrapper<TKey, TValue> : IDictionary<TKey, TValue> |
| { |
| private readonly ReaderWriterLockSlim _lock = new ReaderWriterLockSlim(LockRecursionPolicy.SupportsRecursion); |
| private readonly IDictionary<TKey, TValue> _dict; |
| |
| public ConcurrentDictionaryWrapper(IDictionary<TKey, TValue> wrapped) |
| { |
| this._dict = wrapped; |
| } |
| |
| public void Add(TKey key, TValue value) |
| { |
| _lock.EnterWriteLock(); |
| try |
| { |
| _dict.Add(key, value); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| public bool ContainsKey(TKey key) |
| { |
| _lock.EnterReadLock(); |
| try |
| { |
| return _dict.ContainsKey(key); |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| |
| public ICollection<TKey> Keys |
| { |
| get |
| { |
| _lock.EnterReadLock(); |
| try |
| { |
| return _dict.Keys.AsReadOnly(); |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| } |
| |
| public bool Remove(TKey key) |
| { |
| _lock.EnterWriteLock(); |
| try |
| { |
| return _dict.Remove(key); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| public bool TryGetValue(TKey key, out TValue value) |
| { |
| _lock.EnterReadLock(); |
| try |
| { |
| return _dict.TryGetValue(key, out value); |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| |
| public ICollection<TValue> Values |
| { |
| get |
| { |
| _lock.EnterReadLock(); |
| try |
| { |
| return _dict.Values.AsReadOnly(); |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| } |
| |
| public TValue this[TKey key] |
| { |
| get |
| { |
| _lock.EnterReadLock(); |
| try |
| { |
| TValue result; |
| if (!_dict.TryGetValue(key, out result)) |
| return default(TValue); |
| return result; |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| set |
| { |
| _lock.EnterWriteLock(); |
| try |
| { |
| _dict[key] = value; |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| } |
| |
| public void Add(KeyValuePair<TKey, TValue> item) |
| { |
| _lock.EnterWriteLock(); |
| try |
| { |
| _dict.Add(item); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| public void Clear() |
| { |
| _lock.EnterWriteLock(); |
| try |
| { |
| _dict.Clear(); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| public bool Contains(KeyValuePair<TKey, TValue> item) |
| { |
| _lock.EnterReadLock(); |
| try |
| { |
| return _dict.Contains(item); |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| |
| public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) |
| { |
| _lock.EnterReadLock(); |
| try |
| { |
| _dict.CopyTo(array, arrayIndex); |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| |
| public int Count |
| { |
| get |
| { |
| _lock.EnterReadLock(); |
| try |
| { |
| return _dict.Count; |
| } |
| finally |
| { |
| _lock.ExitReadLock(); |
| } |
| } |
| } |
| |
| public bool IsReadOnly => _dict.IsReadOnly; |
| |
| public bool Remove(KeyValuePair<TKey, TValue> item) |
| { |
| _lock.EnterWriteLock(); |
| try |
| { |
| return _dict.Remove(item); |
| } |
| finally |
| { |
| _lock.ExitWriteLock(); |
| } |
| } |
| |
| public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() |
| { |
| throw new NotSupportedException(); |
| } |
| |
| System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() |
| { |
| throw new NotSupportedException(); |
| } |
| } |
| } |