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; } }