File: Telemetry\PersistenceChannel\SnapshottingDictionary.cs
Web Access
Project: ..\..\..\src\Cli\dotnet\dotnet.csproj (dotnet)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
#nullable disable
 
namespace Microsoft.DotNet.Cli.Telemetry.PersistenceChannel;
 
internal class SnapshottingDictionary<TKey, TValue> :
    SnapshottingCollection<KeyValuePair<TKey, TValue>, IDictionary<TKey, TValue>>, IDictionary<TKey, TValue>
{
    public SnapshottingDictionary()
        : base(new Dictionary<TKey, TValue>())
    {
    }
 
    public ICollection<TKey> Keys => GetSnapshot().Keys;
 
    public ICollection<TValue> Values => GetSnapshot().Values;
 
    public TValue this[TKey key]
    {
        get => GetSnapshot()[key];
 
        set
        {
            lock (Collection)
            {
                Collection[key] = value;
                snapshot = null;
            }
        }
    }
 
    public void Add(TKey key, TValue value)
    {
        lock (Collection)
        {
            Collection.Add(key, value);
            snapshot = null;
        }
    }
 
    public bool ContainsKey(TKey key)
    {
        return GetSnapshot().ContainsKey(key);
    }
 
    public bool Remove(TKey key)
    {
        lock (Collection)
        {
            bool removed = Collection.Remove(key);
            if (removed)
            {
                snapshot = null;
            }
 
            return removed;
        }
    }
 
    public bool TryGetValue(TKey key, out TValue value)
    {
        return GetSnapshot().TryGetValue(key, out value);
    }
 
    protected sealed override IDictionary<TKey, TValue> CreateSnapshot(IDictionary<TKey, TValue> collection)
    {
        return new Dictionary<TKey, TValue>(collection);
    }
}