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:
parent
379b3d576c
commit
322234151a
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue