three-dee/Math/Math/Types.swift

44 lines
No EOL
1.2 KiB
Swift

//
// Types.swift
// Math
//
// Created by Eryn Wells on 11/6/15.
// Copyright © 2015 Eryn Wells. All rights reserved.
//
import Foundation
public typealias Float = Swift.Float
public typealias Double = Swift.Double
public protocol AlmostEquatable {
@warn_unused_result
func ==~(lhs: Self, rhs: Self) -> Bool
}
public protocol EquatableWithinEpsilon: Strideable {
static var Epsilon: Self.Stride { get }
}
extension Float: AlmostEquatable, EquatableWithinEpsilon {
public static let Epsilon: Float.Stride = 1e-8
}
extension Double: AlmostEquatable, EquatableWithinEpsilon {
public static let Epsilon: Double.Stride = 1e-16
}
private func almostEqual<T: EquatableWithinEpsilon>(lhs: T, _ rhs: T, epsilon: T.Stride) -> Bool {
return abs(lhs - rhs) <= epsilon
}
/** Almost-equality of floating point types. */
infix operator ==~ { associativity left precedence 130 }
public func ==~<T: protocol<AlmostEquatable, EquatableWithinEpsilon>>(lhs: T, rhs: T) -> Bool {
return almostEqual(lhs, rhs, epsilon: T.Epsilon)
}
infix operator !==~ { associativity left precedence 130 }
public func !==~<T: AlmostEquatable>(lhs: T, rhs: T) -> Bool {
return !(lhs ==~ rhs)
}