blob: c44c198d6542b14507957ab955cbfe2af1734cd8 [file] [log] [blame]
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();
}
}
}