SparseSet iterator implementation
This commit is contained in:
parent
19cab7af5d
commit
5dd149dd82
|
|
@ -65,15 +65,31 @@ public class SparseSet<Element>: UniformStorage, Sequence {
|
||||||
sparse.removeAll(keepingCapacity: keepingCapacity)
|
sparse.removeAll(keepingCapacity: keepingCapacity)
|
||||||
}
|
}
|
||||||
|
|
||||||
public func makeIterator() -> AnyIterator<Element> {
|
public func makeIterator() -> SparseIterator<Element> {
|
||||||
|
return SparseIterator<Element>(self)
|
||||||
|
/*
|
||||||
|
// NOTE: was optimized by using a dedicated iterator implementation
|
||||||
var iter = dense.makeIterator()
|
var iter = dense.makeIterator()
|
||||||
return AnyIterator<Element> {
|
return AnyIterator<Element>.init {
|
||||||
guard let next: Pair? = iter.next() else { return nil }
|
guard let next: Pair = iter.next() as? Pair else { return nil }
|
||||||
guard let pair: Pair = next else { return nil }
|
return next.value
|
||||||
return pair.value
|
}*/
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public struct SparseIterator<Element>: IteratorProtocol {
|
||||||
|
private let sparseSet: SparseSet<Element>
|
||||||
|
private var iterator: IndexingIterator<ContiguousArray<(key: Index, value: Element)?>>
|
||||||
|
init(_ sparseSet: SparseSet<Element>) {
|
||||||
|
self.sparseSet = sparseSet
|
||||||
|
self.iterator = sparseSet.dense.makeIterator()
|
||||||
|
}
|
||||||
|
|
||||||
|
mutating public func next() -> Element? {
|
||||||
|
guard let next: Pair = iterator.next() as? Pair else { return nil }
|
||||||
|
return next.value as? Element
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class SparseComponentSet: SparseSet<Component> {
|
public class SparseComponentSet: SparseSet<Component> {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue