namespace AssetRipper.VersionUtilities;
public readonly partial struct UnityVersion
{
///
/// A maximizing function for Unity versions
///
/// A Unity version
/// A Unity version
/// The larger Unity version
public static UnityVersion Max(UnityVersion left, UnityVersion right)
{
return left > right ? left : right;
}
///
/// A minimizing function for Unity versions
///
/// A Unity version
/// A Unity version
/// The smaller Unity version
public static UnityVersion Min(UnityVersion left, UnityVersion right)
{
return left < right ? left : right;
}
///
/// A distance function for measuring version proximity
///
///
/// The returned value is ordinal and should not be saved anywhere.
/// It's only for runtime comparisons, such as finding the closest version in a list.
///
/// A Unity version
/// A Unity version
///
/// An ordinal number representing the distance between 2 versions.
/// A value of zero means they're equal.
///
public static ulong Distance(UnityVersion left, UnityVersion right)
{
return left.m_data < right.m_data
? right.m_data - left.m_data
: left.m_data - right.m_data;
}
///
/// Get the closest Unity version in an array of versions using
///
/// The Unity version array
/// The closest Unity version
/// The array is null
/// The array is empty
public UnityVersion GetClosestVersion(UnityVersion[] versions)
{
if (versions is null)
{
throw new ArgumentNullException(nameof(versions));
}
if (versions.Length == 0)
{
throw new ArgumentException("Length cannot be zero", nameof(versions));
}
UnityVersion result = versions[0];
ulong currentDistance = Distance(this, result);
for(int i = 1; i < versions.Length; i++)
{
ulong newDistance = Distance(this, versions[i]);
if (newDistance < currentDistance)
{
currentDistance = newDistance;
result = versions[i];
}
}
return result;
}
}