SparseSet iterator implementation

This commit is contained in:
Christian Treffs 2017-11-01 08:11:55 +01:00
parent 19cab7af5d
commit 5dd149dd82
1 changed files with 22 additions and 6 deletions

View File

@ -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> {