diff --git a/stdlib/public/core/Algorithm.swift b/stdlib/public/core/Algorithm.swift index f8d829c515e7f..15b2fd94f918a 100644 --- a/stdlib/public/core/Algorithm.swift +++ b/stdlib/public/core/Algorithm.swift @@ -74,27 +74,15 @@ public func min(x: T, _ y: T, _ z: T, _ rest: T...) -> T { /// Returns the greater of `x` and `y`. @warn_unused_result public func max(x: T, _ y: T) -> T { - var r = y - if y < x { - r = x - } - return r + return y >= x ? y : x } /// Returns the greatest argument passed. @warn_unused_result public func max(x: T, _ y: T, _ z: T, _ rest: T...) -> T { - var r = y - if y < x { - r = x - } - if r < z { - r = z - } - for t in rest { - if t >= r { - r = t - } + var r = max(max(x, y), z) + for t in rest where t >= r { + r = t } return r } diff --git a/validation-test/stdlib/Algorithm.swift b/validation-test/stdlib/Algorithm.swift index c8ef76fd8a3b7..b24ccab9192b1 100644 --- a/validation-test/stdlib/Algorithm.swift +++ b/validation-test/stdlib/Algorithm.swift @@ -25,14 +25,58 @@ public func == ( // FIXME(prext): move this struct to the point of use. Algorithm.test("min,max") { - expectEqual(2, min(3, 2)) - expectEqual(3, min(3, 7, 5)) - expectEqual(3, max(3, 2)) - expectEqual(7, max(3, 7, 5)) - - // FIXME: add tests that check that min/max return the - // first element of the sequence (by reference equality) that satisfy the - // condition. + // Identities are unique in this set. + let a1 = MinimalComparableValue(0, identity: 1) + let a2 = MinimalComparableValue(0, identity: 2) + let a3 = MinimalComparableValue(0, identity: 3) + let b1 = MinimalComparableValue(1, identity: 4) + let b2 = MinimalComparableValue(1, identity: 5) + let b3 = MinimalComparableValue(1, identity: 6) + let c1 = MinimalComparableValue(2, identity: 7) + let c2 = MinimalComparableValue(2, identity: 8) + let c3 = MinimalComparableValue(2, identity: 9) + + // 2-arg min() + expectEqual(a1.identity, min(a1, b1).identity) + expectEqual(a1.identity, min(b1, a1).identity) + expectEqual(a1.identity, min(a1, a2).identity) + + // 2-arg max() + expectEqual(c1.identity, max(c1, b1).identity) + expectEqual(c1.identity, max(b1, c1).identity) + expectEqual(c1.identity, max(c2, c1).identity) + + // 3-arg min() + expectEqual(a1.identity, min(a1, b1, c1).identity) + expectEqual(a1.identity, min(b1, a1, c1).identity) + expectEqual(a1.identity, min(c1, b1, a1).identity) + expectEqual(a1.identity, min(c1, a1, b1).identity) + expectEqual(a1.identity, min(a1, a2, a3).identity) + expectEqual(a1.identity, min(a1, a2, b1).identity) + expectEqual(a1.identity, min(a1, b1, a2).identity) + expectEqual(a1.identity, min(b1, a1, a2).identity) + + // 3-arg max() + expectEqual(c1.identity, max(c1, b1, a1).identity) + expectEqual(c1.identity, max(a1, c1, b1).identity) + expectEqual(c1.identity, max(b1, a1, c1).identity) + expectEqual(c1.identity, max(b1, c1, a1).identity) + expectEqual(c1.identity, max(c3, c2, c1).identity) + expectEqual(c1.identity, max(c2, c1, b1).identity) + expectEqual(c1.identity, max(c2, b1, c1).identity) + expectEqual(c1.identity, max(b1, c2, c1).identity) + + // 4-arg min() + expectEqual(a1.identity, min(a1, b1, a2, b2).identity) + expectEqual(a1.identity, min(b1, a1, a2, b2).identity) + expectEqual(a1.identity, min(c1, b1, b2, a1).identity) + expectEqual(a1.identity, min(c1, b1, a1, a2).identity) + + // 4-arg max() + expectEqual(c1.identity, max(c2, b1, c1, b2).identity) + expectEqual(c1.identity, max(b1, c2, c1, b2).identity) + expectEqual(c1.identity, max(a1, b1, b2, c1).identity) + expectEqual(c1.identity, max(a1, b1, c2, c1).identity) } Algorithm.test("sorted/strings")