// Copyright (c) .NET Foundation and contributors. All rights reserved. // Licensed under the MIT license. See LICENSE file in the project root for full license information. using System; // This is needed due to NativeAOT which doesn't enable nullable globally yet #nullable enable namespace ILLink.Shared.DataFlow { // A lattice over dictionaries where the stored values are also from a lattice. public readonly struct DictionaryLattice<TKey, TValue, TValueLattice> : ILattice<DefaultValueDictionary<TKey, TValue>> where TKey : IEquatable<TKey> where TValue : IEquatable<TValue> where TValueLattice : ILattice<TValue> { public readonly TValueLattice ValueLattice; public DefaultValueDictionary<TKey, TValue> Top { get; } public DictionaryLattice(TValueLattice valueLattice) { ValueLattice = valueLattice; Top = new DefaultValueDictionary<TKey, TValue>(valueLattice.Top); } public DefaultValueDictionary<TKey, TValue> Meet(DefaultValueDictionary<TKey, TValue> left, DefaultValueDictionary<TKey, TValue> right) { var met = new DefaultValueDictionary<TKey, TValue>(left); foreach (var kvp in right) { TKey key = kvp.Key; TValue rightValue = kvp.Value; met.Set(key, ValueLattice.Meet(left.Get(key), rightValue)); } return met; } } }