//===--- IntegerArithmetic.swift.gyb --------------------------*- swift -*-===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// %# Ignore the following admonition; it applies to the resulting .swift file only // Automatically Generated From IntegerArithmetic.swift.gyb. Do Not Edit // Directly! %{ integerBinaryOps = [ ('add', '+', 'Adds', 'the result'), ('subtract', '-', 'Subtracts', 'the result'), ('multiply', '*', 'Multiplies', 'the result'), ('divide', '/', 'Divides', 'the result'), ('remainder', '%', 'Divides', 'the remainder') ] }% /// This protocol is an implementation detail of `IntegerArithmetic`; do /// not use it directly. /// /// Its requirements are inherited by `IntegerArithmetic` and thus must /// be satisfied by types conforming to that protocol. @_show_in_interface public protocol _IntegerArithmetic { % for name, _, Action, result in integerBinaryOps: /// ${Action} `lhs` and `rhs`, returning ${result} and a `Bool` that is /// `true` iff the operation caused an arithmetic overflow. static func ${name}WithOverflow(_ lhs: Self, _ rhs: Self) -> (Self, overflow: Bool) % end } /// The common requirements for types that support integer arithmetic. public protocol IntegerArithmetic : _IntegerArithmetic, Comparable { // Checked arithmetic functions. Specific implementations in // FixedPoint.swift.gyb support static checking for integer types. % for name, op, Action, result in integerBinaryOps: /// ${Action} `lhs` and `rhs`, returning ${result} and trapping in case of /// arithmetic overflow (except in -Ounchecked builds). static func ${op} (lhs: Self, rhs: Self) -> Self % end /// Explicitly convert to `IntMax`, trapping on overflow (except in /// -Ounchecked builds). func toIntMax() -> IntMax } % for name, op, Action, result in integerBinaryOps: /// ${Action} `lhs` and `rhs`, returning ${result} and trapping in case of /// arithmetic overflow (except in -Ounchecked builds). @_transparent public func ${op} (lhs: T, rhs: T) -> T { return _overflowChecked(T.${name}WithOverflow(lhs, rhs)) } % if (op != '/') and (op != '%'): /// ${Action} `lhs` and `rhs`, silently discarding any overflow. @_transparent public func &${op} (lhs: T, rhs: T) -> T { return T.${name}WithOverflow(lhs, rhs).0 } % end /// ${Action} `lhs` and `rhs` and stores ${result} in `lhs`, trapping in /// case of arithmetic overflow (except in -Ounchecked builds). @_transparent public func ${op}= (lhs: inout T, rhs: T) { lhs = lhs ${op} rhs } % end //===--- SignedNumber -----------------------------------------------------===// // A numeric type that supports abs(x), +x and -x //===----------------------------------------------------------------------===// // SignedNumber itself contains only operator requirements having // default implementations on the base protocol. /// Instances of conforming types can be subtracted, arithmetically /// negated, and initialized from `0`. /// /// Axioms: /// /// - `x - 0 == x` /// - `-x == 0 - x` /// - `-(-x) == x` public protocol SignedNumber : Comparable, ExpressibleByIntegerLiteral { /// Returns the result of negating `x`. static prefix func - (x: Self) -> Self /// Returns the difference between `lhs` and `rhs`. static func - (lhs: Self, rhs: Self) -> Self // Do not use this operator directly; call abs(x) instead static func ~> (_:Self,_:(_Abs, ())) -> Self } // Unary negation in terms of subtraction. This is a default // implementation; models of SignedNumber can provide their own // implementations. @_transparent public prefix func - (x: T) -> T { return 0 - x } // Unary + @_transparent public prefix func + (x: T) -> T { return x } //===--- abs(x) -----------------------------------------------------------===// public struct _Abs {} @_versioned internal func _abs(_ args: Args) -> (_Abs, Args) { return (_Abs(), args) } // Do not use this operator directly; call abs(x) instead @_transparent public func ~> (x:T,_:(_Abs, ())) -> T { return x < 0 ? -x : x } // FIXME: should this be folded into SignedNumber? /// A type that supports an "absolute value" function. public protocol AbsoluteValuable : SignedNumber { /// Returns the absolute value of `x`. static func abs(_ x: Self) -> Self } // Do not use this operator directly; call abs(x) instead @_transparent public func ~> (x:T,_:(_Abs, ())) -> T { return T.abs(x) } /// Returns the absolute value of `x`. /// /// Concrete instances of `SignedNumber` can specialize this /// function by conforming to `AbsoluteValuable`. @_transparent public func abs(_ x: T) -> T { return x~>_abs() } @available(*, unavailable, renamed: "IntegerArithmetic") public typealias IntegerArithmeticType = IntegerArithmetic @available(*, unavailable, renamed: "SignedNumber") public typealias SignedNumberType = SignedNumber // ${'Local Variables'}: // eval: (read-only-mode 1) // End: