|
// 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.Linq;
using Analyzer.Utilities.PooledObjects;
namespace System.Collections.Immutable
{
internal static class ImmutableHashSetExtensions
{
public static ImmutableHashSet<T> AddRange<T>(this ImmutableHashSet<T> set1, ImmutableHashSet<T> set2)
{
using var builder = PooledHashSet<T>.GetInstance();
foreach (var item in set1)
{
builder.Add(item);
}
foreach (var item in set2)
{
builder.Add(item);
}
if (builder.Count == set1.Count)
{
return set1;
}
if (builder.Count == set2.Count)
{
return set2;
}
return builder.ToImmutable();
}
public static ImmutableHashSet<T> IntersectSet<T>(this ImmutableHashSet<T> set1, ImmutableHashSet<T> set2)
{
if (set1.IsEmpty || set2.IsEmpty)
{
return ImmutableHashSet<T>.Empty;
}
else if (set1.Count == 1)
{
return set2.Contains(set1.First()) ? set1 : ImmutableHashSet<T>.Empty;
}
else if (set2.Count == 1)
{
return set1.Contains(set2.First()) ? set2 : ImmutableHashSet<T>.Empty;
}
using var builder = PooledHashSet<T>.GetInstance();
foreach (var item in set1)
{
if (set2.Contains(item))
{
builder.Add(item);
}
}
if (builder.Count == set1.Count)
{
return set1;
}
else if (builder.Count == set2.Count)
{
return set2;
}
return builder.ToImmutable();
}
public static bool IsSubsetOfSet<T>(this ImmutableHashSet<T> set1, ImmutableHashSet<T> set2)
{
if (set1.Count > set2.Count)
{
return false;
}
foreach (var item in set1)
{
if (!set2.Contains(item))
{
return false;
}
}
return true;
}
public static void AddIfNotNull<T>(this ImmutableHashSet<T>.Builder builder, T? item)
where T : class
{
if (item != null)
{
builder.Add(item);
}
}
}
}
|