From 5dd149dd82aa8db50e8089d795600e6303de1467 Mon Sep 17 00:00:00 2001 From: Christian Treffs Date: Wed, 1 Nov 2017 08:11:55 +0100 Subject: [PATCH] SparseSet iterator implementation --- Sources/FirebladeECS/SparseSet.swift | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/Sources/FirebladeECS/SparseSet.swift b/Sources/FirebladeECS/SparseSet.swift index 957f9fa..cbe9f9f 100644 --- a/Sources/FirebladeECS/SparseSet.swift +++ b/Sources/FirebladeECS/SparseSet.swift @@ -65,15 +65,31 @@ public class SparseSet: UniformStorage, Sequence { sparse.removeAll(keepingCapacity: keepingCapacity) } - public func makeIterator() -> AnyIterator { + public func makeIterator() -> SparseIterator { + return SparseIterator(self) + /* + // NOTE: was optimized by using a dedicated iterator implementation var iter = dense.makeIterator() - return AnyIterator { - guard let next: Pair? = iter.next() else { return nil } - guard let pair: Pair = next else { return nil } - return pair.value - } + return AnyIterator.init { + guard let next: Pair = iter.next() as? Pair else { return nil } + return next.value + }*/ } + public struct SparseIterator: IteratorProtocol { + private let sparseSet: SparseSet + private var iterator: IndexingIterator> + init(_ sparseSet: SparseSet) { + 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 {