| //===--- StringEdits.swift ------------------------------------------------===// |
| // |
| // This source file is part of the Swift.org open source project |
| // |
| // Copyright (c) 2014 - 2017 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 |
| // |
| //===----------------------------------------------------------------------===// |
| |
| import TestsUtils |
| #if os(Linux) |
| import Glibc |
| #else |
| import Darwin |
| #endif |
| |
| public let StringEdits = BenchmarkInfo( |
| name: "StringEdits", |
| runFunction: run_StringEdits, |
| tags: [.validation, .api, .String]) |
| |
| var editWords: [String] = [ |
| "woodshed", |
| "lakism", |
| "gastroperiodynia", |
| ] |
| |
| let alphabet = "abcdefghijklmnopqrstuvwxyz" |
| /// All edits that are one edit away from `word` |
| func edits(_ word: String) -> Set<String> { |
| let splits = word.indices.map { |
| (String(word[..<$0]), String(word[$0...])) |
| } |
| |
| var result: Array<String> = [] |
| |
| for (left, right) in splits { |
| // drop a character |
| result.append(left + right.dropFirst()) |
| |
| // transpose two characters |
| if let fst = right.first { |
| let drop1 = right.dropFirst() |
| if let snd = drop1.first { |
| result.append(left + [snd,fst] + drop1.dropFirst()) |
| } |
| } |
| |
| // replace each character with another |
| for letter in alphabet { |
| result.append(left + [letter] + right.dropFirst()) |
| } |
| |
| // insert rogue characters |
| for letter in alphabet { |
| result.append(left + [letter] + right) |
| } |
| } |
| |
| // have to map back to strings right at the end |
| return Set(result) |
| } |
| |
| @inline(never) |
| public func run_StringEdits(_ N: Int) { |
| for _ in 1...N*100 { |
| for word in editWords { |
| _ = edits(word) |
| } |
| } |
| } |
| |