|
// 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.Diagnostics.CodeAnalysis;
#nullable enable
namespace ILLink.Shared.TypeSystemProxy
{
/// <summary>
/// Used to indicate the index of the parameter in the Parameters metadata section (i.e. the first parameter that is not the implicit 'this' is 0)
/// It is very error prone to use an int to represent the index in parameters metadata section / source code parameter index as well as for indexing into argument lists.
/// Instead, use this struct whenever representing an index of a parameter.
/// </summary>
/// <example>
/// In a call to a non-static function Foo(int a, int b, int c)
/// 0 refers to 'this'
/// 1 refers to a,
/// 2 refers to b,
/// 3 refers to c.
/// In a call to a static extension function Foo(this Bar a, int b, int c)
/// 0 refers to "this Bar a"
/// 1 refers to b,
/// 2 refers to c.
/// In a call to a static function Foo(int a, int b, int c)
/// 0 refers to a,
/// 1 refers to b,
/// 2 refers to c.
/// </example>
public readonly struct ParameterIndex : System.IEquatable<ParameterIndex>
{
public readonly int Index;
public ParameterIndex (int x)
=> Index = x;
public static bool operator == (ParameterIndex left, ParameterIndex right) => left.Index == right.Index;
public static bool operator != (ParameterIndex left, ParameterIndex right) => left.Index != right.Index;
public static ParameterIndex operator ++ (ParameterIndex val) => new ParameterIndex (val.Index + 1);
public override bool Equals ([NotNullWhen (true)] object? obj)
=> obj is ParameterIndex other && Index == other.Index;
public bool Equals (ParameterIndex other)
=> Index == other.Index;
public override int GetHashCode () => Index.GetHashCode ();
public static explicit operator ParameterIndex (int x)
=> new ParameterIndex (x);
public static explicit operator int (ParameterIndex x)
=> x.Index;
public static ParameterIndex operator + (ParameterIndex left, ParameterIndex right)
=> new ParameterIndex (left.Index + right.Index);
public static ParameterIndex operator - (ParameterIndex left, ParameterIndex right)
=> new ParameterIndex (left.Index - right.Index);
public static ParameterIndex operator + (ParameterIndex left, int right)
=> new ParameterIndex (left.Index + right);
public static ParameterIndex operator - (ParameterIndex left, int right)
=> new ParameterIndex (left.Index - right);
}
}
|