| //===----------------------------------------------------------------------===// |
| // |
| // 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 http://swift.org/LICENSE.txt for license information |
| // See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors |
| // |
| //===----------------------------------------------------------------------===// |
| |
| // Generate comparison functions for tuples up to some reasonable arity. |
| |
| % for arity in range(2,7): |
| % typeParams = [chr(ord("A") + i) for i in range(arity)] |
| % tupleT = "({})".format(",".join(typeParams)) |
| |
| % equatableTypeParams = ", ".join(["{} : Equatable".format(c) for c in typeParams]) |
| |
| /// Returns `true` iff each component of `lhs` is equal to the corresponding |
| /// component of `rhs`. |
| @warn_unused_result |
| public func == <${equatableTypeParams}>(lhs: ${tupleT}, rhs: ${tupleT}) -> Bool { |
| guard lhs.0 == rhs.0 else { return false } |
| /*tail*/ return ( |
| ${", ".join("lhs.{}".format(i) for i in range(1, arity))} |
| ) == ( |
| ${", ".join("rhs.{}".format(i) for i in range(1, arity))} |
| ) |
| } |
| |
| /// Returns `true` iff any component of `lhs` is not equal to the corresponding |
| /// component of `rhs`. |
| @warn_unused_result |
| public func != <${equatableTypeParams}>(lhs: ${tupleT}, rhs: ${tupleT}) -> Bool { |
| guard lhs.0 == rhs.0 else { return true } |
| /*tail*/ return ( |
| ${", ".join("lhs.{}".format(i) for i in range(1, arity))} |
| ) != ( |
| ${", ".join("rhs.{}".format(i) for i in range(1, arity))} |
| ) |
| } |
| |
| % comparableTypeParams = ", ".join(["{} : Comparable".format(c) for c in typeParams]) |
| % for op in ["<", ">"]: |
| % for opeq in ["", "="]: |
| /// A [lexicographical order](https://en.wikipedia.org/wiki/Lexicographical_order) |
| /// over tuples of `Comparable` elements. |
| /// |
| /// Given two tuples `(a1, a2, ..., aN)` and `(b1, b2, ..., bN)`, the |
| /// first tuple is `${op}${opeq}` the second tuple iff `a1 ${op} b1` or |
| /// (`a1 == b1` and `(a2, ..., aN) ${op}${opeq} (b2, ..., bN)`). |
| @warn_unused_result |
| public func ${op}${opeq} <${comparableTypeParams}>(lhs: ${tupleT}, rhs: ${tupleT}) -> Bool { |
| if lhs.0 != rhs.0 { return lhs.0 ${op}${opeq} rhs.0 } |
| /*tail*/ return ( |
| ${", ".join("lhs.{}".format(i) for i in range(1, arity))} |
| ) ${op}${opeq} ( |
| ${", ".join("rhs.{}".format(i) for i in range(1, arity))} |
| ) |
| } |
| % end |
| % end |
| % end |