mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
This decreases total testing time by over a minute on my old Mac Pro. It probably has much less effect on systems with fewer cores, but shouldn't be any worse there. Swift SVN r22745
199 lines
4.6 KiB
Swift
199 lines
4.6 KiB
Swift
// RUN: %target-run-simple-swift | FileCheck %s
|
|
|
|
struct X : CollectionType {
|
|
typealias Element = String.Generator.Element
|
|
typealias Index = String.Index
|
|
var msg: String
|
|
|
|
init(_ msg: String) { self.msg = msg }
|
|
var startIndex: Index {
|
|
return msg.startIndex
|
|
}
|
|
var endIndex: Index {
|
|
return msg.endIndex
|
|
}
|
|
subscript(i: Index) -> Element { return msg[i] }
|
|
|
|
func generate() -> IndexingGenerator<X> {
|
|
return IndexingGenerator(self)
|
|
}
|
|
}
|
|
|
|
var foobar = X("foobar")
|
|
|
|
// CHECK: foobar
|
|
for a in foobar {
|
|
print(a)
|
|
}
|
|
println("")
|
|
|
|
// FIXME: separate r from the expression below pending
|
|
// <rdar://problem/15772601> Type checking failure
|
|
// CHECK: raboof
|
|
let i = indices(foobar)
|
|
let r = lazy(i).reverse()
|
|
for a in PermutationGenerator(elements: foobar, indices: r) {
|
|
|
|
print(a)
|
|
}
|
|
println("")
|
|
|
|
func isPalindrome0<
|
|
S: CollectionType
|
|
where S.Index: BidirectionalIndexType, S.Generator.Element: Equatable
|
|
>(seq: S) -> Bool {
|
|
typealias Index = S.Index
|
|
|
|
var a = indices(seq)
|
|
var i = indices(seq)
|
|
var ir = lazy(i).reverse()
|
|
var b = ir.generate()
|
|
for i in a {
|
|
if seq[i] != seq[b.next()!] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// CHECK: false
|
|
println(isPalindrome0(X("GoHangaSalamiImaLasagneHoG")))
|
|
// CHECK: true
|
|
println(isPalindrome0(X("GoHangaSalamiimalaSagnaHoG")))
|
|
|
|
func isPalindrome1<
|
|
S: CollectionType
|
|
where S.Index: BidirectionalIndexType, S.Generator.Element: Equatable
|
|
>(seq: S) -> Bool {
|
|
|
|
var a = PermutationGenerator(elements: seq, indices: indices(seq))
|
|
var b = lazy(seq).reverse().generate()
|
|
for nextChar in a {
|
|
if nextChar != b.next()! {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
func isPalindrome1_5<
|
|
S: CollectionType
|
|
where S.Index: BidirectionalIndexType, S.Generator.Element == S.Generator.Element, S.Generator.Element: Equatable
|
|
>(seq: S) -> Bool {
|
|
|
|
var b = lazy(seq).reverse().generate()
|
|
for nextChar in seq {
|
|
if nextChar != b.next()! {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// CHECK: false
|
|
println(isPalindrome1(X("MADAMINEDENIMWILLIAM")))
|
|
// CHECK: true
|
|
println(isPalindrome1(X("MadamInEdEnImadaM")))
|
|
|
|
// CHECK: false
|
|
println(isPalindrome1_5(X("FleetoMeRemoteelF")))
|
|
// CHECK: true
|
|
println(isPalindrome1_5(X("FleetoMeReMoteelF")))
|
|
|
|
// Finally, one that actually uses indexing to do half as much work.
|
|
// BidirectionalIndexType traversal finally pays off!
|
|
func isPalindrome2<
|
|
S: CollectionType
|
|
where S.Index: BidirectionalIndexType, S.Generator.Element: Equatable
|
|
>(seq: S) -> Bool {
|
|
|
|
var b = seq.startIndex, e = seq.endIndex
|
|
|
|
while (b != e) {
|
|
if (b == --e) {
|
|
break
|
|
}
|
|
if seq[b++] != seq[e] {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// Test even length
|
|
// CHECK: false
|
|
println(isPalindrome2(X("ZerimarRamireZ")))
|
|
// CHECK: true
|
|
println(isPalindrome2(X("ZerimaRRamireZ")))
|
|
|
|
// Test odd length
|
|
// CHECK: false
|
|
println(isPalindrome2(X("ZerimarORamireZ")))
|
|
// CHECK: true
|
|
println(isPalindrome2(X("Zerimar-O-ramireZ")))
|
|
|
|
func isPalindrome4<
|
|
S: CollectionType
|
|
where S.Index: BidirectionalIndexType, S.Generator.Element: Equatable
|
|
>(seq: S) -> Bool {
|
|
typealias Index = S.Index
|
|
|
|
var a = PermutationGenerator(elements: seq, indices: indices(seq))
|
|
// FIXME: separate ri from the expression below pending
|
|
// <rdar://problem/15772601> Type checking failure
|
|
var i = indices(seq)
|
|
let ri = lazy(i).reverse()
|
|
var b = PermutationGenerator(elements: seq, indices: ri)
|
|
for nextChar in a {
|
|
if nextChar != b.next()! {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|
|
|
|
// Can't put these literals into string interpolations pending
|
|
// <rdar://problem/16401145> hella-slow compilation
|
|
let array = [1, 2, 3, 4]
|
|
let dict = [0:0, 1:1, 2:2, 3:3, 4:4]
|
|
|
|
func testCount() {
|
|
// CHECK: testing count
|
|
println("testing count")
|
|
// CHECK-NEXT: random access: 4
|
|
println("random access: \(count(array))")
|
|
// CHECK-NEXT: bidirectional: 5
|
|
println("bidirectional: \(count(dict))")
|
|
}
|
|
testCount()
|
|
|
|
func testUnderestimateCount() {
|
|
// CHECK: testing underestimateCount
|
|
println("testing underestimateCount")
|
|
// CHECK-NEXT: random access: 4
|
|
println("random access: \(underestimateCount(array))")
|
|
// CHECK-NEXT: bidirectional: 5
|
|
println("bidirectional: \(underestimateCount(dict))")
|
|
// CHECK-NEXT: SequenceType only: 0
|
|
let s = SequenceOf(array)
|
|
println("SequenceType only: \(underestimateCount(s))")
|
|
}
|
|
testUnderestimateCount()
|
|
|
|
func testIsEmptyFirstLast() {
|
|
// CHECK: testing isEmpty
|
|
println("testing isEmpty")
|
|
// CHECK-NEXT: true
|
|
println(isEmpty(10..<10))
|
|
// CHECK-NEXT: false
|
|
println(isEmpty(10...10))
|
|
// CHECK-NEXT: 10
|
|
println(first(10..<100))
|
|
// CHECK-NEXT: 99
|
|
println(last(10..<100))
|
|
}
|
|
testIsEmptyFirstLast()
|
|
|
|
// CHECK: all done.
|
|
println("all done.")
|