diff --git a/Sources/FirebladeECS/Nexus+TypedFamily.swift b/Sources/FirebladeECS/Nexus+TypedFamily.swift index db99b9a..6b14dfa 100644 --- a/Sources/FirebladeECS/Nexus+TypedFamily.swift +++ b/Sources/FirebladeECS/Nexus+TypedFamily.swift @@ -47,4 +47,20 @@ public extension Nexus { excludesAll: excludedComponents) } + // swiftlint:disable function_parameter_count + func family(requiresAll componentA: A.Type, + _ componentB: B.Type, + _ componentC: C.Type, + _ componentD: D.Type, + _ componentE: E.Type, + excludesAll excludedComponents: Component.Type...) -> TypedFamily5 where A: Component, B: Component, C: Component, D: Component, E: Component { + return TypedFamily5(self, + requiresAll: componentA, + componentB, + componentC, + componentD, + componentE, + excludesAll: excludedComponents) + } + } diff --git a/Sources/FirebladeECS/TypedFamily5.swift b/Sources/FirebladeECS/TypedFamily5.swift new file mode 100644 index 0000000..ea8a21b --- /dev/null +++ b/Sources/FirebladeECS/TypedFamily5.swift @@ -0,0 +1,70 @@ +// +// TypedFamily5.swift +// FirebladeECS +// +// Created by Christian Treffs on 29.09.18. +// + +// swiftlint:disable large_tuple + +public final class TypedFamily5: TypedFamilyProtocol where A: Component, B: Component, C: Component, D: Component, E: Component { + public private(set) weak var nexus: Nexus? + public let traits: FamilyTraitSet + public lazy var members: FamilyMembers5 = FamilyMembers5(nexus, self) + + public init(_ nexus: Nexus, requiresAll compA: A.Type, _ compB: B.Type, _ compC: C.Type, _ compD: D.Type, _ compE: E.Type, excludesAll: [Component.Type]) { + self.nexus = nexus + traits = FamilyTraitSet(requiresAll: [compA, compB, compC, compD, compE], excludesAll: excludesAll) + defer { + nexus.onFamilyInit(traits: traits) + } + } + +} + +public struct FamilyMembers5: FamilyMembersProtocol where A: Component, B: Component, C: Component, D: Component, E: Component { + + public private(set) weak var nexus: Nexus? + public let family: TypedFamily5 + + public init(_ nexus: Nexus?, _ family: TypedFamily5) { + self.nexus = nexus + self.family = family + } + + public func makeIterator() -> ComponentIterator5 { + return ComponentIterator5(nexus, family) + } +} + +public struct ComponentIterator5: ComponentIteratorProtocol where A: Component, B: Component, C: Component, D: Component, E: Component { + + public private(set) weak var nexus: Nexus? + public let memberIds: UniformEntityIdentifiers + public var index: Int + + public init(_ nexus: Nexus?, _ family: TypedFamily5) { + self.nexus = nexus + memberIds = family.memberIds + index = memberIds.index(before: memberIds.startIndex) + } + + public mutating func next() -> (A, B, C, D, E)? { + guard let entityId: EntityIdentifier = nextEntityId() else { + return nil + } + + guard + let compA: A = nexus?.get(for: entityId), + let compB: B = nexus?.get(for: entityId), + let compC: C = nexus?.get(for: entityId), + let compD: D = nexus?.get(for: entityId), + let compE: E = nexus?.get(for: entityId) + else { + return nil + } + + return (compA, compB, compC, compD, compE) + } + +}