Skip to content

Commit d304508

Browse files
authored
Merge pull request #3 from RougeWare/feature/Clamps
2 parents d43e243 + 1b1ee87 commit d304508

File tree

4 files changed

+175
-3
lines changed

4 files changed

+175
-3
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
//
2+
// Clamps.swift
3+
// BasicMathTools
4+
//
5+
// Created by Ky Leggiero on 10/16/21.
6+
//
7+
8+
import Foundation
9+
10+
11+
12+
/// Returns the given `value`, or `min` if it's less than `min`, or `max` if it's greater than `max`
13+
///
14+
/// - Parameters:
15+
/// - min: The lowest possible returned value
16+
/// - value: The value to be clamped
17+
/// - max: The highest possible returned value
18+
///
19+
/// - Returns: `value`, clamped to be between `min` (inclusive) and `max` (inclusive)
20+
@inline(__always)
21+
public func clamp <Value: Comparable> (min: Value, value: Value, max: Value) -> Value {
22+
Swift.max(min, Swift.min(value, max))
23+
}
24+
25+
26+
27+
public extension Comparable {
28+
29+
/// Returns this value, or `min` if it's less than `min`, or `max` if it's greater than `max`
30+
///
31+
/// - Parameters:
32+
/// - min: The lowest possible returned value
33+
/// - max: The highest possible returned value
34+
///
35+
/// - Returns: this value, clamped to be between `min` (inclusive) and `max` (inclusive)
36+
@inline(__always)
37+
func clamped(min: Self, max: Self) -> Self {
38+
clamp(min: min, value: self, max: max)
39+
}
40+
41+
42+
/// Returns this value, or `range.lowerBound` if it's less than `range.lowerBound`, or `range.upperBound` if it's greater than `range.upperBound`
43+
///
44+
/// - Parameter range: The range of possible values to be returned
45+
///
46+
/// - Returns: this value, clamped to be between `range.lowerBound` (inclusive) and `range.upperBound` (inclusive)
47+
@inline(__always)
48+
func clamped(within range: ClosedRange<Self>) -> Self {
49+
clamped(min: range.lowerBound, max: range.upperBound)
50+
}
51+
}

Sources/BasicMathTools/TolerablyEqual.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//
22
// Equality with tolerance.swift
3-
//
3+
// BasicMathTools
44
//
55
// Created by Ben Leggiero on 2020-08-02.
66
//
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
//
2+
// Clamps tests.swift
3+
// BasicMathToolsTests
4+
//
5+
// Created by Ky Leggiero on 10/16/21.
6+
//
7+
8+
import XCTest
9+
import BasicMathTools
10+
11+
12+
13+
final class Clamps_Tests: XCTestCase {
14+
15+
func testGlobalClamp() {
16+
XCTAssertEqual(2, clamp(min: 2, value: 0, max: 7))
17+
XCTAssertEqual(2, clamp(min: 2, value: 1, max: 7))
18+
XCTAssertEqual(2, clamp(min: 2, value: 2, max: 7))
19+
XCTAssertEqual(3, clamp(min: 2, value: 3, max: 7))
20+
XCTAssertEqual(4, clamp(min: 2, value: 4, max: 7))
21+
XCTAssertEqual(5, clamp(min: 2, value: 5, max: 7))
22+
XCTAssertEqual(6, clamp(min: 2, value: 6, max: 7))
23+
XCTAssertEqual(7, clamp(min: 2, value: 7, max: 7))
24+
XCTAssertEqual(7, clamp(min: 2, value: 8, max: 7))
25+
XCTAssertEqual(7, clamp(min: 2, value: 9, max: 7))
26+
27+
28+
XCTAssertEqual(2, clamp(min: 2, value: 1.9, max: 7))
29+
XCTAssertEqual(2, clamp(min: 2, value: 1.99, max: 7))
30+
XCTAssertEqual(2, clamp(min: 2, value: 1.999, max: 7))
31+
32+
XCTAssertEqual(2.0, clamp(min: 2, value: 2.0, max: 7))
33+
XCTAssertEqual(2.0001, clamp(min: 2, value: 2.0001, max: 7))
34+
XCTAssertEqual(2.001, clamp(min: 2, value: 2.001, max: 7))
35+
XCTAssertEqual(2.01, clamp(min: 2, value: 2.01, max: 7))
36+
XCTAssertEqual(2.1, clamp(min: 2, value: 2.1, max: 7))
37+
38+
39+
XCTAssertEqual(6.9, clamp(min: 2, value: 6.9, max: 7))
40+
XCTAssertEqual(6.99, clamp(min: 2, value: 6.99, max: 7))
41+
XCTAssertEqual(6.999, clamp(min: 2, value: 6.999, max: 7))
42+
43+
XCTAssertEqual(7.0, clamp(min: 2, value: 7.0, max: 7))
44+
XCTAssertEqual(7.0, clamp(min: 2, value: 7.0001, max: 7))
45+
XCTAssertEqual(7.0, clamp(min: 2, value: 7.001, max: 7))
46+
XCTAssertEqual(7.0, clamp(min: 2, value: 7.01, max: 7))
47+
XCTAssertEqual(7.0, clamp(min: 2, value: 7.1, max: 7))
48+
}
49+
50+
51+
func testInstanceWithExplicitMinAndMax() {
52+
XCTAssertEqual(2, 0.clamped(min: 2, max: 7))
53+
XCTAssertEqual(2, 1.clamped(min: 2, max: 7))
54+
XCTAssertEqual(2, 2.clamped(min: 2, max: 7))
55+
XCTAssertEqual(3, 3.clamped(min: 2, max: 7))
56+
XCTAssertEqual(4, 4.clamped(min: 2, max: 7))
57+
XCTAssertEqual(5, 5.clamped(min: 2, max: 7))
58+
XCTAssertEqual(6, 6.clamped(min: 2, max: 7))
59+
XCTAssertEqual(7, 7.clamped(min: 2, max: 7))
60+
XCTAssertEqual(7, 8.clamped(min: 2, max: 7))
61+
XCTAssertEqual(7, 9.clamped(min: 2, max: 7))
62+
63+
64+
XCTAssertEqual(2, 1.9.clamped(min: 2, max: 7))
65+
XCTAssertEqual(2, 1.99.clamped(min: 2, max: 7))
66+
XCTAssertEqual(2, 1.999.clamped(min: 2, max: 7))
67+
68+
XCTAssertEqual(2.0, 2.0.clamped(min: 2, max: 7))
69+
XCTAssertEqual(2.0001, 2.0001.clamped(min: 2, max: 7))
70+
XCTAssertEqual(2.001, 2.001.clamped(min: 2, max: 7))
71+
XCTAssertEqual(2.01, 2.01.clamped(min: 2, max: 7))
72+
XCTAssertEqual(2.1, 2.1.clamped(min: 2, max: 7))
73+
74+
75+
XCTAssertEqual(6.9, 6.9.clamped(min: 2, max: 7))
76+
XCTAssertEqual(6.99, 6.99.clamped(min: 2, max: 7))
77+
XCTAssertEqual(6.999, 6.999.clamped(min: 2, max: 7))
78+
79+
XCTAssertEqual(7.0, 7.0.clamped(min: 2, max: 7))
80+
XCTAssertEqual(7.0, 7.0001.clamped(min: 2, max: 7))
81+
XCTAssertEqual(7.0, 7.001.clamped(min: 2, max: 7))
82+
XCTAssertEqual(7.0, 7.01.clamped(min: 2, max: 7))
83+
XCTAssertEqual(7.0, 7.1.clamped(min: 2, max: 7))
84+
}
85+
86+
87+
func testInstanceWithClosedRange() {
88+
XCTAssertEqual(2, 0.clamped(within: 2...7))
89+
XCTAssertEqual(2, 1.clamped(within: 2...7))
90+
XCTAssertEqual(2, 2.clamped(within: 2...7))
91+
XCTAssertEqual(3, 3.clamped(within: 2...7))
92+
XCTAssertEqual(4, 4.clamped(within: 2...7))
93+
XCTAssertEqual(5, 5.clamped(within: 2...7))
94+
XCTAssertEqual(6, 6.clamped(within: 2...7))
95+
XCTAssertEqual(7, 7.clamped(within: 2...7))
96+
XCTAssertEqual(7, 8.clamped(within: 2...7))
97+
XCTAssertEqual(7, 9.clamped(within: 2...7))
98+
99+
100+
XCTAssertEqual(2, 1.9.clamped(within: 2...7))
101+
XCTAssertEqual(2, 1.99.clamped(within: 2...7))
102+
XCTAssertEqual(2, 1.999.clamped(within: 2...7))
103+
104+
XCTAssertEqual(2.0, 2.0.clamped(within: 2...7))
105+
XCTAssertEqual(2.0001, 2.0001.clamped(within: 2...7))
106+
XCTAssertEqual(2.001, 2.001.clamped(within: 2...7))
107+
XCTAssertEqual(2.01, 2.01.clamped(within: 2...7))
108+
XCTAssertEqual(2.1, 2.1.clamped(within: 2...7))
109+
110+
111+
XCTAssertEqual(6.9, 6.9.clamped(within: 2...7))
112+
XCTAssertEqual(6.99, 6.99.clamped(within: 2...7))
113+
XCTAssertEqual(6.999, 6.999.clamped(within: 2...7))
114+
115+
XCTAssertEqual(7.0, 7.0.clamped(within: 2...7))
116+
XCTAssertEqual(7.0, 7.0001.clamped(within: 2...7))
117+
XCTAssertEqual(7.0, 7.001.clamped(within: 2...7))
118+
XCTAssertEqual(7.0, 7.01.clamped(within: 2...7))
119+
XCTAssertEqual(7.0, 7.1.clamped(within: 2...7))
120+
}
121+
}

Tests/BasicMathToolsTests/TolerablyEqual Tests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,8 @@ final class TolerablyEqual_Tests: XCTestCase {
3232

3333
func testTildeDoubleEquals_Float64() {
3434

35-
XCTAssertFalse(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1)
36-
XCTAssertTrue (0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 ~== 1)
35+
XCTAssertFalse(0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 == 1.0)
36+
XCTAssertTrue (0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 ~== 1.0)
3737

3838
XCTAssertFalse(2 == sqrt(2) * sqrt(2))
3939
XCTAssertTrue (2 ~== sqrt(2) * sqrt(2))

0 commit comments

Comments
 (0)