diff --git a/Math/Math/Types.swift b/Math/Math/Types.swift index 37f4b88..8c5b8f0 100644 --- a/Math/Math/Types.swift +++ b/Math/Math/Types.swift @@ -20,11 +20,11 @@ public protocol EquatableWithinEpsilon: Strideable { static var Epsilon: Self.Stride { get } } -extension Float: EquatableWithinEpsilon { +extension Float: AlmostEquatable, EquatableWithinEpsilon { public static let Epsilon: Float.Stride = 1e-8 } -extension Double: EquatableWithinEpsilon { +extension Double: AlmostEquatable, EquatableWithinEpsilon { public static let Epsilon: Double.Stride = 1e-16 } diff --git a/Math/Math/Vector.swift b/Math/Math/Vector.swift index 53948a8..34538e8 100644 --- a/Math/Math/Vector.swift +++ b/Math/Math/Vector.swift @@ -9,7 +9,7 @@ import Foundation /** A vector. */ -public protocol Vector { +public protocol Vector: Equatable, AlmostEquatable { init() /** Number of elements in the vector. */ @@ -246,4 +246,31 @@ public func ×=(inout lhs: Vector3, rhs: Vector3) { infix operator × { associativity left precedence 151 } public func ×(lhs: Vector3, rhs: Vector3) -> Vector3 { return lhs.cross(rhs) +} + +// MARK: Equality + +public func ==(lhs: T, rhs: T) -> Bool { + for i in 0..(lhs: T, rhs: T) -> Bool { + for i in 0..(lhs: T?, rhs: T?) -> Bool { + if let lhs = lhs, rhs = rhs { + return lhs ==~ rhs + } + return false } \ No newline at end of file