|
// 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;
using System.Collections.Generic;
using ILLink.Shared;
using MultiValue = ILLink.Shared.DataFlow.ValueSet<ILLink.Shared.DataFlow.SingleValue>;
namespace Mono.Linker.Dataflow
{
public class ValueNodeList : List<MultiValue>
{
public ValueNodeList ()
{
}
public ValueNodeList (int capacity)
: base (capacity)
{
}
public ValueNodeList (List<MultiValue> other)
: base (other)
{
}
public override int GetHashCode ()
{
HashCode hashCode = default;
foreach (var item in this)
hashCode.Add (item.GetHashCode ());
return hashCode.ToHashCode ();
}
public override bool Equals (object? other)
{
if (!(other is ValueNodeList otherList))
return false;
if (otherList.Count != Count)
return false;
for (int i = 0; i < Count; i++) {
if (!otherList[i].Equals (this[i]))
return false;
}
return true;
}
}
public struct ValueBasicBlockPair : IEquatable<ValueBasicBlockPair>
{
public ValueBasicBlockPair (MultiValue value, int basicBlockIndex)
{
Value = value;
BasicBlockIndex = basicBlockIndex;
}
public MultiValue Value { get; }
public int BasicBlockIndex { get; }
public bool Equals (ValueBasicBlockPair other) => Value.Equals (other.Value) && BasicBlockIndex.Equals (other.BasicBlockIndex);
public override bool Equals (object? obj) => obj is ValueBasicBlockPair other && Equals (other);
public override int GetHashCode () => HashUtils.Combine (Value.GetHashCode (), BasicBlockIndex);
public static bool operator == (ValueBasicBlockPair left, ValueBasicBlockPair right) => left.Equals (right);
public static bool operator != (ValueBasicBlockPair left, ValueBasicBlockPair right) => !(left == right);
}
}
|