You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
2.1 KiB
68 lines
2.1 KiB
using System;
|
|
using System.Text.RegularExpressions;
|
|
|
|
namespace UnityEditor.VFX.UI
|
|
{
|
|
static class VFXAttributeHelper
|
|
{
|
|
[Flags]
|
|
public enum VFXAttributeMatch
|
|
{
|
|
None = 0x0,
|
|
Name = 0x1,
|
|
Type = 0x2,
|
|
Casing = 0x4,
|
|
PerfectMath = Name|Type|Casing,
|
|
}
|
|
|
|
private static readonly Regex s_VariadicMatch = new Regex("(.*)[X|Y|Z]", RegexOptions.Compiled);
|
|
|
|
public struct Match
|
|
{
|
|
public Match(VFXAttribute attribute, VFXAttributeMatch status)
|
|
{
|
|
this.attribute = attribute;
|
|
this.status = status;
|
|
}
|
|
|
|
public VFXAttribute attribute { get; }
|
|
public VFXAttributeMatch status { get; }
|
|
}
|
|
|
|
public static Match GetMatch(VFXAttribute x, VFXAttribute y)
|
|
{
|
|
var status = VFXAttributeMatch.None;
|
|
if (x.name == y.name)
|
|
{
|
|
status = VFXAttributeMatch.Name | VFXAttributeMatch.Casing;
|
|
status = x.type == y.type ? status | VFXAttributeMatch.Type : status;
|
|
}
|
|
else if (string.Compare(x.name, y.name, StringComparison.OrdinalIgnoreCase) == 0)
|
|
{
|
|
status = VFXAttributeMatch.Name;
|
|
status = x.type == y.type ? status | VFXAttributeMatch.Type : status;
|
|
}
|
|
|
|
return new Match(y, status);
|
|
}
|
|
|
|
public static bool IsMatching(string a, string b, bool matchVariadic)
|
|
{
|
|
if (string.Compare(a, b, StringComparison.OrdinalIgnoreCase) == 0)
|
|
return true;
|
|
if (matchVariadic)
|
|
{
|
|
if (s_VariadicMatch.Matches(a) is { Count: 1 } aMatches)
|
|
{
|
|
return string.Compare(aMatches[0].Groups[1].Value, b, StringComparison.OrdinalIgnoreCase) == 0;
|
|
}
|
|
if (s_VariadicMatch.Matches(b) is { Count: 1 } bMatches)
|
|
{
|
|
return string.Compare(bMatches[0].Groups[1].Value, a, StringComparison.OrdinalIgnoreCase) == 0;
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
}
|
|
}
|