Optimize UnorderedSparseSet

This commit is contained in:
Christian Treffs 2019-10-05 14:54:33 +02:00
parent 98f2ff5d20
commit 589a8c2ec1
2 changed files with 14 additions and 13 deletions

View File

@ -5,7 +5,7 @@
// Created by Christian Treffs on 30.10.17.
//
open class UnorderedSparseSet<Element> {
public struct UnorderedSparseSet<Element> {
public typealias Index = Int
public typealias Key = Int
@ -22,10 +22,6 @@ open class UnorderedSparseSet<Element> {
dense = ContiguousArray<Entry>()
}
deinit {
removeAll()
}
public var count: Int { return dense.count }
public var isEmpty: Bool { return dense.isEmpty }
@ -42,7 +38,7 @@ open class UnorderedSparseSet<Element> {
/// - key: the key
/// - Returns: true if new, false if replaced.
@discardableResult
public func insert(_ element: Element, at key: Key) -> Bool {
public mutating func insert(_ element: Element, at key: Key) -> Bool {
if let (denseIndex, _) = find(at: key) {
dense[denseIndex] = Entry(key: key, element: element)
return false
@ -77,7 +73,7 @@ open class UnorderedSparseSet<Element> {
/// - Parameter key: the key
/// - Returns: removed value or nil if key not found.
@discardableResult
public func remove(at key: Key) -> Entry? {
public mutating func remove(at key: Key) -> Entry? {
guard let (denseIndex, _) = find(at: key) else {
return nil
}
@ -92,7 +88,7 @@ open class UnorderedSparseSet<Element> {
}
@inlinable
public func removeAll(keepingCapacity: Bool = false) {
public mutating func removeAll(keepingCapacity: Bool = false) {
sparse.removeAll(keepingCapacity: keepingCapacity)
dense.removeAll(keepingCapacity: keepingCapacity)
}
@ -107,7 +103,7 @@ open class UnorderedSparseSet<Element> {
///
/// - Parameter denseIndex: the dense index
/// - Returns: the element entry
private func swapRemove(at denseIndex: Int) -> Entry {
private mutating func swapRemove(at denseIndex: Int) -> Entry {
dense.swapAt(denseIndex, dense.count - 1)
return dense.removeLast()
}
@ -145,6 +141,7 @@ open class UnorderedSparseSet<Element> {
}
}
// MARK: - Equatable
extension UnorderedSparseSet.Entry: Equatable where Element: Equatable { }
extension UnorderedSparseSet: Equatable where Element: Equatable {
public static func == (lhs: UnorderedSparseSet<Element>, rhs: UnorderedSparseSet<Element>) -> Bool {
@ -152,6 +149,10 @@ extension UnorderedSparseSet: Equatable where Element: Equatable {
}
}
// MARK: - Codable
extension UnorderedSparseSet.Entry: Codable where Element: Codable { }
extension UnorderedSparseSet: Codable where Element: Codable { }
// MARK: - UnorderedSparseSetIterator
public struct UnorderedSparseSetIterator<Element>: IteratorProtocol {
public private(set) var iterator: IndexingIterator<ContiguousArray<UnorderedSparseSet<Element>.Entry>>

View File

@ -387,7 +387,7 @@ class SparseSetTests: XCTestCase {
func testSparseSetDoubleRemove() {
class AClass { }
let set = UnorderedSparseSet<AClass>()
var set = UnorderedSparseSet<AClass>()
let a = AClass()
let b = AClass()
set.insert(a, at: 0)
@ -471,7 +471,7 @@ class SparseSetTests: XCTestCase {
}
func testSparseSetReduce() {
let characters = UnorderedSparseSet<Character>()
var characters = UnorderedSparseSet<Character>()
characters.insert("H", at: 4)
characters.insert("e", at: 13)
@ -497,7 +497,7 @@ class SparseSetTests: XCTestCase {
}
func testSubscript() {
let characters = UnorderedSparseSet<Character>()
var characters = UnorderedSparseSet<Character>()
characters[4] = "H"
characters[13] = "e"
@ -528,7 +528,7 @@ class SparseSetTests: XCTestCase {
}
func testStartEndIndex() {
let set = UnorderedSparseSet<Character>()
var set = UnorderedSparseSet<Character>()
set.insert("C", at: 33)
set.insert("A", at: 11)