Optimize UnorderedSparseSet
This commit is contained in:
parent
98f2ff5d20
commit
589a8c2ec1
|
|
@ -5,7 +5,7 @@
|
||||||
// Created by Christian Treffs on 30.10.17.
|
// Created by Christian Treffs on 30.10.17.
|
||||||
//
|
//
|
||||||
|
|
||||||
open class UnorderedSparseSet<Element> {
|
public struct UnorderedSparseSet<Element> {
|
||||||
public typealias Index = Int
|
public typealias Index = Int
|
||||||
public typealias Key = Int
|
public typealias Key = Int
|
||||||
|
|
||||||
|
|
@ -22,10 +22,6 @@ open class UnorderedSparseSet<Element> {
|
||||||
dense = ContiguousArray<Entry>()
|
dense = ContiguousArray<Entry>()
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
|
||||||
removeAll()
|
|
||||||
}
|
|
||||||
|
|
||||||
public var count: Int { return dense.count }
|
public var count: Int { return dense.count }
|
||||||
public var isEmpty: Bool { return dense.isEmpty }
|
public var isEmpty: Bool { return dense.isEmpty }
|
||||||
|
|
||||||
|
|
@ -42,7 +38,7 @@ open class UnorderedSparseSet<Element> {
|
||||||
/// - key: the key
|
/// - key: the key
|
||||||
/// - Returns: true if new, false if replaced.
|
/// - Returns: true if new, false if replaced.
|
||||||
@discardableResult
|
@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) {
|
if let (denseIndex, _) = find(at: key) {
|
||||||
dense[denseIndex] = Entry(key: key, element: element)
|
dense[denseIndex] = Entry(key: key, element: element)
|
||||||
return false
|
return false
|
||||||
|
|
@ -77,7 +73,7 @@ open class UnorderedSparseSet<Element> {
|
||||||
/// - Parameter key: the key
|
/// - Parameter key: the key
|
||||||
/// - Returns: removed value or nil if key not found.
|
/// - Returns: removed value or nil if key not found.
|
||||||
@discardableResult
|
@discardableResult
|
||||||
public func remove(at key: Key) -> Entry? {
|
public mutating func remove(at key: Key) -> Entry? {
|
||||||
guard let (denseIndex, _) = find(at: key) else {
|
guard let (denseIndex, _) = find(at: key) else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
@ -92,7 +88,7 @@ open class UnorderedSparseSet<Element> {
|
||||||
}
|
}
|
||||||
|
|
||||||
@inlinable
|
@inlinable
|
||||||
public func removeAll(keepingCapacity: Bool = false) {
|
public mutating func removeAll(keepingCapacity: Bool = false) {
|
||||||
sparse.removeAll(keepingCapacity: keepingCapacity)
|
sparse.removeAll(keepingCapacity: keepingCapacity)
|
||||||
dense.removeAll(keepingCapacity: keepingCapacity)
|
dense.removeAll(keepingCapacity: keepingCapacity)
|
||||||
}
|
}
|
||||||
|
|
@ -107,7 +103,7 @@ open class UnorderedSparseSet<Element> {
|
||||||
///
|
///
|
||||||
/// - Parameter denseIndex: the dense index
|
/// - Parameter denseIndex: the dense index
|
||||||
/// - Returns: the element entry
|
/// - 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)
|
dense.swapAt(denseIndex, dense.count - 1)
|
||||||
return dense.removeLast()
|
return dense.removeLast()
|
||||||
}
|
}
|
||||||
|
|
@ -145,6 +141,7 @@ open class UnorderedSparseSet<Element> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Equatable
|
||||||
extension UnorderedSparseSet.Entry: Equatable where Element: Equatable { }
|
extension UnorderedSparseSet.Entry: Equatable where Element: Equatable { }
|
||||||
extension UnorderedSparseSet: Equatable where Element: Equatable {
|
extension UnorderedSparseSet: Equatable where Element: Equatable {
|
||||||
public static func == (lhs: UnorderedSparseSet<Element>, rhs: UnorderedSparseSet<Element>) -> Bool {
|
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
|
// MARK: - UnorderedSparseSetIterator
|
||||||
public struct UnorderedSparseSetIterator<Element>: IteratorProtocol {
|
public struct UnorderedSparseSetIterator<Element>: IteratorProtocol {
|
||||||
public private(set) var iterator: IndexingIterator<ContiguousArray<UnorderedSparseSet<Element>.Entry>>
|
public private(set) var iterator: IndexingIterator<ContiguousArray<UnorderedSparseSet<Element>.Entry>>
|
||||||
|
|
|
||||||
|
|
@ -387,7 +387,7 @@ class SparseSetTests: XCTestCase {
|
||||||
|
|
||||||
func testSparseSetDoubleRemove() {
|
func testSparseSetDoubleRemove() {
|
||||||
class AClass { }
|
class AClass { }
|
||||||
let set = UnorderedSparseSet<AClass>()
|
var set = UnorderedSparseSet<AClass>()
|
||||||
let a = AClass()
|
let a = AClass()
|
||||||
let b = AClass()
|
let b = AClass()
|
||||||
set.insert(a, at: 0)
|
set.insert(a, at: 0)
|
||||||
|
|
@ -471,7 +471,7 @@ class SparseSetTests: XCTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
func testSparseSetReduce() {
|
func testSparseSetReduce() {
|
||||||
let characters = UnorderedSparseSet<Character>()
|
var characters = UnorderedSparseSet<Character>()
|
||||||
|
|
||||||
characters.insert("H", at: 4)
|
characters.insert("H", at: 4)
|
||||||
characters.insert("e", at: 13)
|
characters.insert("e", at: 13)
|
||||||
|
|
@ -497,7 +497,7 @@ class SparseSetTests: XCTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
func testSubscript() {
|
func testSubscript() {
|
||||||
let characters = UnorderedSparseSet<Character>()
|
var characters = UnorderedSparseSet<Character>()
|
||||||
|
|
||||||
characters[4] = "H"
|
characters[4] = "H"
|
||||||
characters[13] = "e"
|
characters[13] = "e"
|
||||||
|
|
@ -528,7 +528,7 @@ class SparseSetTests: XCTestCase {
|
||||||
}
|
}
|
||||||
|
|
||||||
func testStartEndIndex() {
|
func testStartEndIndex() {
|
||||||
let set = UnorderedSparseSet<Character>()
|
var set = UnorderedSparseSet<Character>()
|
||||||
|
|
||||||
set.insert("C", at: 33)
|
set.insert("C", at: 33)
|
||||||
set.insert("A", at: 11)
|
set.insert("A", at: 11)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue