| File: Log\CountLogAggregator.cs | Web Access |
| Project: src\roslyn\src\Workspaces\Core\Portable\Microsoft.CodeAnalysis.Workspaces.csproj (Microsoft.CodeAnalysis.Workspaces) |
// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. using System.Threading; namespace Microsoft.CodeAnalysis.Internal.Log; internal sealed class CountLogAggregator<TKey> : AbstractLogAggregator<TKey, CountLogAggregator<TKey>.Counter> where TKey : notnull { protected override Counter CreateCounter() => new(); public void SetCount(TKey key, int count) { var counter = GetCounter(key); counter.SetCount(count); } public void IncreaseCount(TKey key) { var counter = GetCounter(key); counter.IncreaseCount(); } public void IncreaseCountBy(TKey key, int value) { var counter = GetCounter(key); counter.IncreaseCountBy(value); } public int GetCount(TKey key) { if (TryGetCounter(key, out var counter)) { return counter.GetCount(); } return 0; } internal sealed class Counter { private int _count; public void SetCount(int count) => _count = count; public void IncreaseCount() { // Counter class probably not needed. but it is here for 2 reasons. // make handling concurrency easier and be a place holder for different type of counter Interlocked.Increment(ref _count); } public void IncreaseCountBy(int value) { // Counter class probably not needed. but it is here for 2 reasons. // make handling concurrency easier and be a place holder for different type of counter Interlocked.Add(ref _count, value); } public int GetCount() => _count; } }