Made the code leaner, and removed a few unnecessary self references.

Signed-off-by: Adam Rocska <adam.rocska@adams.solutions>
This commit is contained in:
Adam Rocska 2020-05-01 14:51:09 +02:00
parent 379b3d576c
commit 322234151a
1 changed files with 17 additions and 22 deletions

View File

@ -5,25 +5,25 @@ extension Data {
fileprivate func boyerMoore(data: Data, from: Index) -> Index? { fileprivate func boyerMoore(data: Data, from: Index) -> Index? {
let patternLength = data.count let patternLength = data.count
precondition(patternLength > 0, "Pattern can't be empty.") precondition(patternLength > 0, "Pattern can't be empty.")
precondition(self.count >= patternLength, "Pattern can't be >= than the Data to search in.") precondition(count >= patternLength, "Pattern can't be >= than the Data to search in.")
precondition(self.indices.contains(from), "Index from which to start the lookup must be contained in the Data.") precondition(indices.contains(from), "Index from which to start the lookup must be contained in the Data.")
var skipTable = [UInt8: Int]() var skipTable = [UInt8: Int]()
for (i, byte) in data.enumerated() { for (i, byte) in data.enumerated() {
skipTable[byte] = patternLength - i - 1 skipTable[byte] = patternLength - i - 1
} }
let lastIndexOfSelf = self.endIndex let lastIndexOfSelf = endIndex
let lastIndexOfData = data.index(before: data.endIndex) let lastIndexOfData = data.index(before: data.endIndex)
let lastByteOfData = data.last let lastByteOfData = data.last
var i = self.index(from, offsetBy: patternLength - 1, limitedBy: lastIndexOfSelf) ?? lastIndexOfSelf var i = index(from, offsetBy: patternLength - 1, limitedBy: lastIndexOfSelf) ?? lastIndexOfSelf
func reverseMatch() -> Index? { func reverseMatch() -> Index? {
var dataIndex = lastIndexOfData var dataIndex = lastIndexOfData
var selfIndex = i var selfIndex = i
while dataIndex > data.startIndex { while dataIndex > data.startIndex {
selfIndex = self.index(before: selfIndex) selfIndex = index(before: selfIndex)
dataIndex = self.index(before: dataIndex) dataIndex = index(before: dataIndex)
if self[selfIndex] != data[dataIndex] { return nil } if self[selfIndex] != data[dataIndex] { return nil }
} }
return selfIndex return selfIndex
@ -36,9 +36,9 @@ extension Data {
if let foundIndex = reverseMatch() { if let foundIndex = reverseMatch() {
return foundIndex return foundIndex
} }
i = self.index(after: i) i = index(after: i)
} else { } else {
i = self.index( i = index(
i, i,
offsetBy: skipTable[byte] ?? patternLength, offsetBy: skipTable[byte] ?? patternLength,
limitedBy: lastIndexOfSelf limitedBy: lastIndexOfSelf
@ -49,7 +49,7 @@ extension Data {
} }
func index(of data: Data) -> Index? { func index(of data: Data) -> Index? {
return boyerMoore(data: data, from: self.startIndex) return boyerMoore(data: data, from: startIndex)
} }
func index(of data: Data, from: Index) -> Index? { func index(of data: Data, from: Index) -> Index? {
@ -57,23 +57,18 @@ extension Data {
} }
func lastIndex(of data: Data) -> Index? { func lastIndex(of data: Data) -> Index? {
return lastIndex(of: data, from: self.startIndex) return lastIndex(of: data, from: startIndex)
} }
func lastIndex(of data: Data, from: Index) -> Index? { func lastIndex(of data: Data, from: Index) -> Index? {
var lastIndexOfData: Index? = from var last: Index? = from
while lastIndexOfData != nil { while last != nil {
let upcomingIndex = self.index(after: lastIndexOfData!) let next = index(after: last!)
if !self.indices.contains(upcomingIndex) { return lastIndexOfData == from ? nil : lastIndexOfData } if !indices.contains(next) { break }
guard let currentIndexOfData = index( guard let current = index(of: data, from: next) else { break }
of: data, last = current
from: upcomingIndex
) else {
break
}
lastIndexOfData = currentIndexOfData
} }
return lastIndexOfData == from ? nil : lastIndexOfData return last == from ? nil : last
} }
} }