diff --git a/Sources/FirebladeECS/EntityIdentifier.swift b/Sources/FirebladeECS/EntityIdentifier.swift index 04ca439..03b8e79 100644 --- a/Sources/FirebladeECS/EntityIdentifier.swift +++ b/Sources/FirebladeECS/EntityIdentifier.swift @@ -8,14 +8,14 @@ public struct EntityIdentifier { static let invalid = EntityIdentifier(.max) - public typealias Id = Int + public typealias Idx = Int /// provides 4294967295 unique identifiers since it's constrained to UInt32 - invalid. - @usableFromInline let id: Id + @usableFromInline let id: Idx @usableFromInline init(_ uint32: UInt32) { - self.id = Id(uint32) + self.id = Idx(uint32) } } diff --git a/Sources/FirebladeECS/Family+Coding.swift b/Sources/FirebladeECS/Family+Coding.swift index 6dadf68..f6b6047 100644 --- a/Sources/FirebladeECS/Family+Coding.swift +++ b/Sources/FirebladeECS/Family+Coding.swift @@ -10,7 +10,7 @@ private struct FamilyMemberContainer where R: FamilyRequirementsManaging { } extension CodingUserInfoKey { - fileprivate static let nexusCodingStrategy = CodingUserInfoKey(rawValue: "nexusCodingStrategy")! + static let nexusCodingStrategy = CodingUserInfoKey(rawValue: "nexusCodingStrategy").unsafelyUnwrapped } // MARK: - encoding @@ -43,7 +43,7 @@ extension Family where R: FamilyEncoding { /// - Returns: The encoded data. public func encodeMembers(using encoder: inout Encoder) throws -> Encoder.Output where Encoder: TopLevelEncoder { encoder.userInfo[.nexusCodingStrategy] = nexus.codingStrategy - let components: [R.Components] = self.map { $0 } + let components = [R.Components](self) let container = FamilyMemberContainer(components: components) return try encoder.encode(container) } diff --git a/Sources/FirebladeECS/Family.swift b/Sources/FirebladeECS/Family.swift index 6310d3c..e154dc9 100644 --- a/Sources/FirebladeECS/Family.swift +++ b/Sources/FirebladeECS/Family.swift @@ -17,7 +17,7 @@ public struct Family where R: FamilyRequirementsManaging { nexus.onFamilyInit(traits: traits) } - @inlinable public var memberIds: UnorderedSparseSet { + @inlinable public var memberIds: UnorderedSparseSet { nexus.members(withFamilyTraits: traits) } @@ -58,7 +58,7 @@ extension Family: LazySequenceProtocol { } // MARK: - components iterator extension Family { public struct ComponentsIterator: IteratorProtocol { - @usableFromInline var memberIdsIterator: UnorderedSparseSet.ElementIterator + @usableFromInline var memberIdsIterator: UnorderedSparseSet.ElementIterator @usableFromInline unowned let nexus: Nexus public init(family: Family) { @@ -85,7 +85,7 @@ extension Family { } public struct EntityIterator: IteratorProtocol { - @usableFromInline var memberIdsIterator: UnorderedSparseSet.ElementIterator + @usableFromInline var memberIdsIterator: UnorderedSparseSet.ElementIterator @usableFromInline unowned let nexus: Nexus public init(family: Family) { @@ -111,7 +111,7 @@ extension Family { } public struct EntityComponentIterator: IteratorProtocol { - @usableFromInline var memberIdsIterator: UnorderedSparseSet.ElementIterator + @usableFromInline var memberIdsIterator: UnorderedSparseSet.ElementIterator @usableFromInline unowned let nexus: Nexus public init(family: Family) { diff --git a/Sources/FirebladeECS/Nexus+Family.swift b/Sources/FirebladeECS/Nexus+Family.swift index 95f3b30..f4357b2 100644 --- a/Sources/FirebladeECS/Nexus+Family.swift +++ b/Sources/FirebladeECS/Nexus+Family.swift @@ -18,8 +18,8 @@ extension Nexus { return traits.isMatch(components: componentIds) } - public func members(withFamilyTraits traits: FamilyTraitSet) -> UnorderedSparseSet { - familyMembersByTraits[traits] ?? UnorderedSparseSet() + public func members(withFamilyTraits traits: FamilyTraitSet) -> UnorderedSparseSet { + familyMembersByTraits[traits] ?? UnorderedSparseSet() } public func isMember(_ entity: Entity, in family: FamilyTraitSet) -> Bool { diff --git a/Sources/FirebladeECS/Nexus+Internal.swift b/Sources/FirebladeECS/Nexus+Internal.swift index 2ba5263..d0e570d 100644 --- a/Sources/FirebladeECS/Nexus+Internal.swift +++ b/Sources/FirebladeECS/Nexus+Internal.swift @@ -86,7 +86,7 @@ extension Nexus { return } - familyMembersByTraits[traits] = UnorderedSparseSet() + familyMembersByTraits[traits] = UnorderedSparseSet() update(familyMembership: traits) } @@ -127,10 +127,10 @@ extension Nexus { } func add(entityWithId entityId: EntityIdentifier, toFamilyWithTraits traits: FamilyTraitSet) { - familyMembersByTraits[traits]!.insert(entityId, at: entityId.id) + familyMembersByTraits[traits].unsafelyUnwrapped.insert(entityId, at: entityId.id) } func remove(entityWithId entityId: EntityIdentifier, fromFamilyWithTraits traits: FamilyTraitSet) { - familyMembersByTraits[traits]!.remove(at: entityId.id) + familyMembersByTraits[traits].unsafelyUnwrapped.remove(at: entityId.id) } } diff --git a/Sources/FirebladeECS/Nexus.swift b/Sources/FirebladeECS/Nexus.swift index 306e4d4..d40da02 100644 --- a/Sources/FirebladeECS/Nexus.swift +++ b/Sources/FirebladeECS/Nexus.swift @@ -8,7 +8,7 @@ public final class Nexus { /// Main entity storage. /// Entities are tightly packed by EntityIdentifier. - @usableFromInline final var entityStorage: UnorderedSparseSet + @usableFromInline final var entityStorage: UnorderedSparseSet /// Entity ids that are currently not used. let entityIdGenerator: EntityIdentifierGenerator @@ -29,14 +29,14 @@ public final class Nexus { /// - Key: FamilyTraitSet aka component types that make up one distinct family. /// - Value: Tightly packed EntityIdentifiers that represent the association of an entity to the family. - @usableFromInline final var familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet] + @usableFromInline final var familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet] public final var codingStrategy: CodingStrategy public final weak var delegate: NexusEventDelegate? public convenience init() { - self.init(entityStorage: UnorderedSparseSet(), + self.init(entityStorage: UnorderedSparseSet(), componentsByType: [:], componentsByEntity: [:], entityIdGenerator: EntityIdentifierGenerator(), @@ -45,11 +45,11 @@ public final class Nexus { codingStrategy: DefaultCodingStrategy()) } - internal init(entityStorage: UnorderedSparseSet, + internal init(entityStorage: UnorderedSparseSet, componentsByType: [ComponentIdentifier: ManagedContiguousArray], componentsByEntity: [EntityIdentifier: Set], entityIdGenerator: EntityIdentifierGenerator, - familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet], + familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet], childrenByParentEntity: [EntityIdentifier: Set], codingStrategy: CodingStrategy) { self.entityStorage = entityStorage @@ -87,6 +87,6 @@ public struct DefaultCodingStrategy: CodingStrategy { public init() { } public func codingKey(for componentType: C.Type) -> DynamicCodingKey where C: Component { - DynamicCodingKey(stringValue: "\(C.self)")! + DynamicCodingKey(stringValue: "\(C.self)").unsafelyUnwrapped } } diff --git a/Sources/FirebladeECS/UnorderedSparseSet.swift b/Sources/FirebladeECS/UnorderedSparseSet.swift index ef0df7f..046f43c 100644 --- a/Sources/FirebladeECS/UnorderedSparseSet.swift +++ b/Sources/FirebladeECS/UnorderedSparseSet.swift @@ -13,15 +13,20 @@ /// /// See for a reference implementation. public struct UnorderedSparseSet { - @usableFromInline final class Storage { + // swiftlint:disable nesting + @usableFromInline + final class Storage { /// An index into the dense store. - public typealias DenseIndex = Int + @usableFromInline + typealias DenseIndex = Int /// A sparse store holding indices into the dense mapped to key. - public typealias SparseStore = [Key: DenseIndex] + @usableFromInline + typealias SparseStore = [Key: DenseIndex] /// A dense store holding all the entries. - public typealias DenseStore = ContiguousArray + @usableFromInline + typealias DenseStore = ContiguousArray @usableFromInline struct Entry { @@ -122,7 +127,8 @@ public struct UnorderedSparseSet { dense.removeAll(keepingCapacity: keepingCapacity) } - @inlinable func makeIterator() -> IndexingIterator> { + @inlinable + func makeIterator() -> IndexingIterator> { dense.makeIterator() } }