mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
The rule changes are as follows: * All functions (introduced with the 'func' keyword) have argument labels for arguments beyond the first, by default. Methods are no longer special in this regard. * The presence of a default argument no longer implies an argument label. The actual changes to the parser and printer are fairly simple; the rest of the noise is updating the standard library, overlays, tests, etc. With the standard library, this change is intended to be API neutral: I've added/removed #'s and _'s as appropriate to keep the user interface the same. If we want to separately consider using argument labels for more free functions now that the defaults in the language have shifted, we can tackle that separately. Fixes rdar://problem/17218256. Swift SVN r27704
664 lines
14 KiB
Swift
664 lines
14 KiB
Swift
//===--- CGFloat.swift.gyb ------------------------------------*- swift -*-===//
|
|
//
|
|
// This source file is part of the Swift.org open source project
|
|
//
|
|
// Copyright (c) 2014 - 2015 Apple Inc. and the Swift project authors
|
|
// Licensed under Apache License v2.0 with Runtime Library Exception
|
|
//
|
|
// See http://swift.org/LICENSE.txt for license information
|
|
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
%{
|
|
|
|
from SwiftIntTypes import *
|
|
|
|
# Number of bits in the Builtin.Word type
|
|
word_bits = int(CMAKE_SIZEOF_VOID_P) * 8
|
|
|
|
}%
|
|
|
|
@exported import CoreGraphics
|
|
import Darwin
|
|
|
|
public struct CGFloat {
|
|
#if arch(i386) || arch(arm)
|
|
/// The native type used to store the CGFloat, which is Float on
|
|
/// 32-bit architectures and Double on 64-bit architectures.
|
|
public typealias NativeType = Float
|
|
#elseif arch(x86_64) || arch(arm64)
|
|
/// The native type used to store the CGFloat, which is Float on
|
|
/// 32-bit architectures and Double on 64-bit architectures.
|
|
public typealias NativeType = Double
|
|
#endif
|
|
|
|
@transparent public init() {
|
|
self.native = 0.0
|
|
}
|
|
|
|
@transparent public init(_ value: Float) {
|
|
self.native = NativeType(value)
|
|
}
|
|
|
|
@transparent public init(_ value: Double) {
|
|
self.native = NativeType(value)
|
|
}
|
|
|
|
/// The native value.
|
|
public var native: NativeType
|
|
}
|
|
|
|
@transparent extension CGFloat : FloatingPointType {
|
|
public typealias _BitsType = UInt
|
|
|
|
public static func _fromBitPattern(bits: UInt) -> CGFloat {
|
|
return CGFloat(NativeType._fromBitPattern(NativeType._BitsType(bits)))
|
|
}
|
|
|
|
public func _toBitPattern() -> UInt {
|
|
return UInt(native._toBitPattern())
|
|
}
|
|
|
|
% for src_ty in all_integer_types(word_bits):
|
|
|
|
@transparent public init(_ value: ${src_ty.stdlib_name}) {
|
|
self.native = NativeType(value)
|
|
}
|
|
|
|
% end
|
|
|
|
public static var infinity: CGFloat {
|
|
return CGFloat(NativeType.infinity)
|
|
}
|
|
|
|
public static var NaN: CGFloat {
|
|
return CGFloat(NativeType.NaN)
|
|
}
|
|
|
|
public static var quietNaN: CGFloat {
|
|
return CGFloat(NativeType.quietNaN)
|
|
}
|
|
|
|
public var isSignMinus: Bool {
|
|
return native.isSignMinus
|
|
}
|
|
|
|
public var isNormal: Bool {
|
|
return native.isNormal
|
|
}
|
|
|
|
public var isFinite: Bool {
|
|
return native.isFinite
|
|
}
|
|
|
|
public var isZero: Bool {
|
|
return native.isZero
|
|
}
|
|
|
|
public var isSubnormal: Bool {
|
|
return native.isSubnormal
|
|
}
|
|
|
|
public var isInfinite: Bool {
|
|
return native.isInfinite
|
|
}
|
|
|
|
public var isNaN: Bool {
|
|
return native.isNaN
|
|
}
|
|
|
|
public var isSignaling: Bool {
|
|
return native.isSignaling
|
|
}
|
|
|
|
public var floatingPointClass: FloatingPointClassification {
|
|
return native.floatingPointClass
|
|
}
|
|
}
|
|
|
|
extension CGFloat {
|
|
@transparent public static var min: CGFloat {
|
|
#if arch(i386) || arch(arm)
|
|
return CGFloat(FLT_MIN)
|
|
#else
|
|
return CGFloat(DBL_MIN)
|
|
#endif
|
|
}
|
|
|
|
@transparent public static var max: CGFloat {
|
|
#if arch(i386) || arch(arm)
|
|
return CGFloat(FLT_MAX)
|
|
#else
|
|
return CGFloat(DBL_MAX)
|
|
#endif
|
|
}
|
|
}
|
|
|
|
@availability(*,unavailable,message="use CGFloat.min")
|
|
public let CGFLOAT_MIN = CGFloat.min
|
|
|
|
@availability(*,unavailable,message="use CGFloat.max")
|
|
public let CGFLOAT_MAX = CGFloat.max
|
|
|
|
extension CGFloat : Reflectable {
|
|
/// Returns a mirror that reflects `self`.
|
|
public func getMirror() -> MirrorType {
|
|
return reflect(native)
|
|
}
|
|
}
|
|
|
|
@transparent extension CGFloat : CustomStringConvertible {
|
|
/// A textual representation of `self`.
|
|
public var description: String {
|
|
return native.description
|
|
}
|
|
}
|
|
|
|
@transparent extension CGFloat : Hashable {
|
|
/// The hash value.
|
|
///
|
|
/// **Axiom:** `x == y` implies `x.hashValue == y.hashValue`
|
|
///
|
|
/// **Note:** the hash value is not guaranteed to be stable across
|
|
/// different invocations of the same program. Do not persist the
|
|
/// hash value across program runs.
|
|
public var hashValue: Int {
|
|
return native.hashValue
|
|
}
|
|
}
|
|
|
|
@transparent extension CGFloat : FloatLiteralConvertible {
|
|
/// Create an instance initialized to `value`.
|
|
public init(floatLiteral value: NativeType) {
|
|
self = CGFloat(value)
|
|
}
|
|
}
|
|
|
|
@transparent extension CGFloat : IntegerLiteralConvertible {
|
|
/// Create an instance initialized to `value`.
|
|
public init(integerLiteral value: Int) {
|
|
self = CGFloat(value)
|
|
}
|
|
}
|
|
|
|
@transparent extension CGFloat : AbsoluteValuable {
|
|
/// Returns the absolute value of `x`
|
|
@transparent
|
|
public static func abs(x: CGFloat) -> CGFloat {
|
|
return CGFloat(NativeType.abs(x.native))
|
|
}
|
|
}
|
|
|
|
% for dst_ty in all_integer_types(word_bits):
|
|
|
|
@transparent extension ${dst_ty.stdlib_name} {
|
|
public init(_ value: CGFloat) {
|
|
self = ${dst_ty.stdlib_name}(value.native)
|
|
}
|
|
}
|
|
|
|
% end
|
|
|
|
|
|
@transparent extension Double {
|
|
public init(_ value: CGFloat) {
|
|
self = Double(value.native)
|
|
}
|
|
}
|
|
|
|
@transparent extension Float {
|
|
public init(_ value: CGFloat) {
|
|
self = Float(value.native)
|
|
}
|
|
}
|
|
|
|
// Comparisons.
|
|
@transparent extension CGFloat : Equatable { }
|
|
|
|
@transparent
|
|
public func ==(lhs: CGFloat, rhs: CGFloat) -> Bool {
|
|
return lhs.native == rhs.native
|
|
}
|
|
|
|
@transparent extension CGFloat : Comparable { }
|
|
|
|
@transparent
|
|
public func <(lhs: CGFloat, rhs: CGFloat) -> Bool {
|
|
return lhs.native < rhs.native
|
|
}
|
|
|
|
@transparent extension CGFloat : Strideable {
|
|
/// Returns a stride `x` such that `self.advancedBy(x)` approximates
|
|
/// `other`.
|
|
///
|
|
/// Complexity: O(1).
|
|
@transparent public
|
|
func distanceTo(other: CGFloat) -> CGFloat {
|
|
return CGFloat(other.native - self.native)
|
|
}
|
|
|
|
/// Returns a `Self` `x` such that `self.distanceTo(x)` approximates
|
|
/// `n`.
|
|
///
|
|
/// Complexity: O(1).
|
|
@transparent public
|
|
func advancedBy(amount: CGFloat) -> CGFloat {
|
|
return CGFloat(self.native + amount.native)
|
|
}
|
|
}
|
|
|
|
// CGFloat unary operators
|
|
@transparent
|
|
public prefix func + (x: CGFloat) -> CGFloat { return x }
|
|
|
|
@transparent
|
|
public prefix func - (x: CGFloat) -> CGFloat { return CGFloat(-x.native) }
|
|
|
|
@transparent
|
|
public prefix func ++ (inout x: CGFloat) -> CGFloat {
|
|
x.native += 1.0
|
|
return x
|
|
}
|
|
|
|
@transparent
|
|
public prefix func -- (inout x: CGFloat) -> CGFloat {
|
|
x.native -= 1.0
|
|
return x
|
|
}
|
|
|
|
@transparent
|
|
public postfix func ++ (inout x: CGFloat) -> CGFloat {
|
|
let tmp = x
|
|
x.native += 1.0
|
|
return tmp
|
|
}
|
|
|
|
@transparent
|
|
public postfix func -- (inout x: CGFloat) -> CGFloat {
|
|
let tmp = x
|
|
x.native -= 1.0
|
|
return tmp
|
|
}
|
|
|
|
// CGFloat arithmetic
|
|
@transparent
|
|
public func +(lhs: CGFloat, rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(lhs.native + rhs.native)
|
|
}
|
|
|
|
@transparent
|
|
public func -(lhs: CGFloat, rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(lhs.native - rhs.native)
|
|
}
|
|
|
|
@transparent
|
|
public func *(lhs: CGFloat, rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(lhs.native * rhs.native)
|
|
}
|
|
|
|
@transparent
|
|
public func /(lhs: CGFloat, rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(lhs.native / rhs.native)
|
|
}
|
|
|
|
@transparent
|
|
public func %(lhs: CGFloat, rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(lhs.native % rhs.native)
|
|
}
|
|
|
|
// CGFloat assignment operators.
|
|
@transparent
|
|
public func +=(inout lhs: CGFloat, rhs: CGFloat) {
|
|
lhs.native = lhs.native + rhs.native
|
|
}
|
|
|
|
@transparent
|
|
public func -=(inout lhs: CGFloat, rhs: CGFloat) {
|
|
lhs.native = lhs.native - rhs.native
|
|
}
|
|
|
|
@transparent
|
|
public func *=(inout lhs: CGFloat, rhs: CGFloat) {
|
|
lhs.native = lhs.native * rhs.native
|
|
}
|
|
|
|
@transparent
|
|
public func /=(inout lhs: CGFloat, rhs: CGFloat) {
|
|
lhs.native = lhs.native / rhs.native
|
|
}
|
|
|
|
@transparent
|
|
public func %=(inout lhs: CGFloat, rhs: CGFloat) {
|
|
lhs.native = lhs.native % rhs.native
|
|
}
|
|
|
|
// CGFloat tgmath.
|
|
@transparent
|
|
public func acos(x: CGFloat) -> CGFloat {
|
|
return CGFloat(acos(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func cos(x: CGFloat) -> CGFloat {
|
|
return CGFloat(cos(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func sin(x: CGFloat) -> CGFloat {
|
|
return CGFloat(sin(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func asin(x: CGFloat) -> CGFloat {
|
|
return CGFloat(asin(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func atan(x: CGFloat) -> CGFloat {
|
|
return CGFloat(atan(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func tan(x: CGFloat) -> CGFloat {
|
|
return CGFloat(tan(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func acosh(x: CGFloat) -> CGFloat {
|
|
return CGFloat(acosh(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func asinh(x: CGFloat) -> CGFloat {
|
|
return CGFloat(asinh(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func atanh(x: CGFloat) -> CGFloat {
|
|
return CGFloat(atanh(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func cosh(x: CGFloat) -> CGFloat {
|
|
return CGFloat(cosh(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func sinh(x: CGFloat) -> CGFloat {
|
|
return CGFloat(sinh(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func tanh(x: CGFloat) -> CGFloat {
|
|
return CGFloat(tanh(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func exp(x: CGFloat) -> CGFloat {
|
|
return CGFloat(exp(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func exp2(x: CGFloat) -> CGFloat {
|
|
return CGFloat(exp2(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func expm1(x: CGFloat) -> CGFloat {
|
|
return CGFloat(expm1(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func log(x: CGFloat) -> CGFloat {
|
|
return CGFloat(log(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func log10(x: CGFloat) -> CGFloat {
|
|
return CGFloat(log10(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func log2(x: CGFloat) -> CGFloat {
|
|
return CGFloat(log2(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func log1p(x: CGFloat) -> CGFloat {
|
|
return CGFloat(log1p(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func logb(x: CGFloat) -> CGFloat {
|
|
return CGFloat(logb(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func cbrt(x: CGFloat) -> CGFloat {
|
|
return CGFloat(cbrt(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func erf(x: CGFloat) -> CGFloat {
|
|
return CGFloat(erf(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func erfc(x: CGFloat) -> CGFloat {
|
|
return CGFloat(erfc(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func tgamma(x: CGFloat) -> CGFloat {
|
|
return CGFloat(tgamma(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func fabs(x: CGFloat) -> CGFloat {
|
|
return CGFloat(fabs(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func sqrt(x: CGFloat) -> CGFloat {
|
|
return CGFloat(sqrt(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func ceil(x: CGFloat) -> CGFloat {
|
|
return CGFloat(ceil(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func floor(x: CGFloat) -> CGFloat {
|
|
return CGFloat(floor(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func nearbyint(x: CGFloat) -> CGFloat {
|
|
return CGFloat(nearbyint(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func rint(x: CGFloat) -> CGFloat {
|
|
return CGFloat(rint(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func round(x: CGFloat) -> CGFloat {
|
|
return CGFloat(round(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func trunc(x: CGFloat) -> CGFloat {
|
|
return CGFloat(trunc(x.native))
|
|
}
|
|
|
|
@transparent
|
|
public func atan2(lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(atan2(lhs.native, rhs.native))
|
|
}
|
|
|
|
@transparent
|
|
public func hypot(lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(hypot(lhs.native, rhs.native))
|
|
}
|
|
|
|
@transparent
|
|
public func pow(lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(pow(lhs.native, rhs.native))
|
|
}
|
|
|
|
@transparent
|
|
public func fmod(lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(fmod(lhs.native, rhs.native))
|
|
}
|
|
|
|
@transparent
|
|
public func remainder(lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(remainder(lhs.native, rhs.native))
|
|
}
|
|
|
|
@transparent
|
|
public func copysign(lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(copysign(lhs.native, rhs.native))
|
|
}
|
|
|
|
@transparent
|
|
public func nextafter(lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(nextafter(lhs.native, rhs.native))
|
|
}
|
|
|
|
@transparent
|
|
public func fdim(lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(fdim(lhs.native, rhs.native))
|
|
}
|
|
|
|
@transparent
|
|
public func fmax(lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(fmax(lhs.native, rhs.native))
|
|
}
|
|
|
|
@transparent
|
|
public func fmin(lhs: CGFloat, _ rhs: CGFloat) -> CGFloat {
|
|
return CGFloat(fmin(lhs.native, rhs.native))
|
|
}
|
|
|
|
@transparent
|
|
public func fpclassify(x: CGFloat) -> Int {
|
|
return fpclassify(x.native)
|
|
}
|
|
|
|
@transparent
|
|
public func isnormal(x: CGFloat) -> Bool {
|
|
return isnormal(x.native)
|
|
}
|
|
|
|
@transparent
|
|
public func isfinite(x: CGFloat) -> Bool {
|
|
return isfinite(x.native)
|
|
}
|
|
|
|
@transparent
|
|
public func isinf(x: CGFloat) -> Bool {
|
|
return isinf(x.native)
|
|
}
|
|
|
|
@transparent
|
|
public func isnan(x: CGFloat) -> Bool {
|
|
return isnan(x.native)
|
|
}
|
|
|
|
@transparent
|
|
public func signbit(x: CGFloat) -> Int {
|
|
return signbit(x.native)
|
|
}
|
|
|
|
@transparent
|
|
public func modf(x: CGFloat) -> (CGFloat, CGFloat) {
|
|
let (ipart, fpart) = modf(x.native)
|
|
return (CGFloat(ipart), CGFloat(fpart))
|
|
}
|
|
|
|
@transparent
|
|
public func ldexp(x: CGFloat, _ n: Int) -> CGFloat {
|
|
return CGFloat(ldexp(x.native, n))
|
|
}
|
|
|
|
@transparent
|
|
public func frexp(x: CGFloat) -> (CGFloat, Int) {
|
|
let (frac, exp) = frexp(x.native)
|
|
return (CGFloat(frac), exp)
|
|
}
|
|
|
|
@transparent
|
|
public func ilogb(x: CGFloat) -> Int {
|
|
return ilogb(x.native)
|
|
}
|
|
|
|
@transparent
|
|
public func scalbn(x: CGFloat, _ n: Int) -> CGFloat {
|
|
return CGFloat(scalbn(x.native, n))
|
|
}
|
|
|
|
@transparent
|
|
public func lgamma(x: CGFloat) -> (CGFloat, Int) {
|
|
let (value, sign) = lgamma(x.native)
|
|
return (CGFloat(value), sign)
|
|
}
|
|
|
|
@transparent
|
|
public func remquo(x: CGFloat, _ y: CGFloat) -> (CGFloat, Int) {
|
|
let (rem, quo) = remquo(x.native, y.native)
|
|
return (CGFloat(rem), quo)
|
|
}
|
|
|
|
@transparent
|
|
public func nan(tag: String) -> CGFloat {
|
|
return CGFloat(nan(tag) as CGFloat.NativeType)
|
|
}
|
|
|
|
@transparent
|
|
public func fma(x: CGFloat, _ y: CGFloat, _ z: CGFloat) -> CGFloat {
|
|
return CGFloat(fma(x.native, y.native, z.native))
|
|
}
|
|
|
|
@transparent
|
|
public func j0(x: CGFloat) -> CGFloat {
|
|
return CGFloat(j0(Double(x.native)))
|
|
}
|
|
|
|
@transparent
|
|
public func j1(x: CGFloat) -> CGFloat {
|
|
return CGFloat(j1(Double(x.native)))
|
|
}
|
|
|
|
@transparent
|
|
public func jn(n: Int, _ x: CGFloat) -> CGFloat {
|
|
return CGFloat(jn(n, Double(x.native)))
|
|
}
|
|
|
|
@transparent
|
|
public func y0(x: CGFloat) -> CGFloat {
|
|
return CGFloat(y0(Double(x.native)))
|
|
}
|
|
|
|
@transparent
|
|
public func y1(x: CGFloat) -> CGFloat {
|
|
return CGFloat(y1(Double(x.native)))
|
|
}
|
|
|
|
@transparent
|
|
public func yn(n: Int, _ x: CGFloat) -> CGFloat {
|
|
return CGFloat(yn(n, Double(x.native)))
|
|
}
|
|
|
|
@transparent
|
|
extension CGFloat : _CVarArgPassedAsDouble {
|
|
/// Transform `self` into a series of machine words that can be
|
|
/// appropriately interpreted by C varargs
|
|
public var _cVarArgEncoding: [Word] {
|
|
return native._cVarArgEncoding
|
|
}
|
|
}
|