diff --git a/Sources/TimeSpecification/TimeSpecification.swift b/Sources/TimeSpecification/TimeSpecification.swift index e77eee6..ef16893 100644 --- a/Sources/TimeSpecification/TimeSpecification.swift +++ b/Sources/TimeSpecification/TimeSpecification.swift @@ -112,6 +112,11 @@ extension TimeSpecification: ExpressibleByFloatLiteral { let double_seconds = floor(value) self.init(seconds: Int64(double_seconds), nanoseconds: Int32((value - double_seconds) * 1.0E+9)) } + + /// Creates an instance initialized to the specified floating-point value. + public init(_ value: F) where F: BinaryFloatingPoint { + self.init(floatLiteral: FloatLiteralType(value)) + } } extension TimeSpecification { @@ -121,6 +126,14 @@ extension TimeSpecification { /// Double representation of the time. @inlinable public var doubleValue: Double { return Double(self.nanoseconds) * 1.0E-9 + Double(self.seconds) } + + #if arch(i386) || arch(x86_64) + /// Float80 representation of the time. + @inlinable + public var float80Value: Float80 { + return Float80(self.nanoseconds) * 1.0E-9 + Float80(self.seconds) + } + #endif } extension TimeSpecification: CustomStringConvertible, CustomDebugStringConvertible { @@ -210,6 +223,23 @@ extension TimeSpecification { } } +/// Type used to represent a specific point in time relative +/// to the absolute reference date of 1 Jan 2001 00:00:00 GMT. +public typealias NanosecondAbsoluteTime = TimeSpecification + +/// Type used to represent elapsed time in naoseconds. +public typealias NanosecondTimeInterval = TimeSpecification + +extension TimeSpecification { + /// The number of nanoseconds from 1 January 1970 to the reference date, 1 January 2001. + public static let timeIntervalBetween1970AndReferenceDate = NanosecondTimeInterval(Date.timeIntervalBetween1970AndReferenceDate) + + /// The interval between 00:00:00 UTC on 1 January 2001 and the current date and time. + public static var timeIntervalSinceReferenceDate: NanosecondAbsoluteTime { + return TimeSpecification(clock: .calendar) - TimeSpecification.timeIntervalBetween1970AndReferenceDate + } +} + extension TimeSpecification { /// Measure a processing time of the closure. ///