Merge branch 'feature/lint' into develop

This commit is contained in:
Christian Treffs 2020-08-03 11:28:39 +02:00
commit d0db124960
No known key found for this signature in database
GPG Key ID: 49A4B4B460BE3ED4
7 changed files with 31 additions and 25 deletions

View File

@ -8,14 +8,14 @@
public struct EntityIdentifier { public struct EntityIdentifier {
static let invalid = EntityIdentifier(.max) static let invalid = EntityIdentifier(.max)
public typealias Id = Int public typealias Idx = Int
/// provides 4294967295 unique identifiers since it's constrained to UInt32 - invalid. /// provides 4294967295 unique identifiers since it's constrained to UInt32 - invalid.
@usableFromInline let id: Id @usableFromInline let id: Idx
@usableFromInline @usableFromInline
init(_ uint32: UInt32) { init(_ uint32: UInt32) {
self.id = Id(uint32) self.id = Idx(uint32)
} }
} }

View File

@ -10,7 +10,7 @@ private struct FamilyMemberContainer<R> where R: FamilyRequirementsManaging {
} }
extension CodingUserInfoKey { extension CodingUserInfoKey {
fileprivate static let nexusCodingStrategy = CodingUserInfoKey(rawValue: "nexusCodingStrategy")! static let nexusCodingStrategy = CodingUserInfoKey(rawValue: "nexusCodingStrategy").unsafelyUnwrapped
} }
// MARK: - encoding // MARK: - encoding
@ -43,7 +43,7 @@ extension Family where R: FamilyEncoding {
/// - Returns: The encoded data. /// - Returns: The encoded data.
public func encodeMembers<Encoder>(using encoder: inout Encoder) throws -> Encoder.Output where Encoder: TopLevelEncoder { public func encodeMembers<Encoder>(using encoder: inout Encoder) throws -> Encoder.Output where Encoder: TopLevelEncoder {
encoder.userInfo[.nexusCodingStrategy] = nexus.codingStrategy encoder.userInfo[.nexusCodingStrategy] = nexus.codingStrategy
let components: [R.Components] = self.map { $0 } let components = [R.Components](self)
let container = FamilyMemberContainer<R>(components: components) let container = FamilyMemberContainer<R>(components: components)
return try encoder.encode(container) return try encoder.encode(container)
} }

View File

@ -17,7 +17,7 @@ public struct Family<R> where R: FamilyRequirementsManaging {
nexus.onFamilyInit(traits: traits) nexus.onFamilyInit(traits: traits)
} }
@inlinable public var memberIds: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id> { @inlinable public var memberIds: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx> {
nexus.members(withFamilyTraits: traits) nexus.members(withFamilyTraits: traits)
} }
@ -58,7 +58,7 @@ extension Family: LazySequenceProtocol { }
// MARK: - components iterator // MARK: - components iterator
extension Family { extension Family {
public struct ComponentsIterator: IteratorProtocol { public struct ComponentsIterator: IteratorProtocol {
@usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id>.ElementIterator @usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>.ElementIterator
@usableFromInline unowned let nexus: Nexus @usableFromInline unowned let nexus: Nexus
public init(family: Family<R>) { public init(family: Family<R>) {
@ -85,7 +85,7 @@ extension Family {
} }
public struct EntityIterator: IteratorProtocol { public struct EntityIterator: IteratorProtocol {
@usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id>.ElementIterator @usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>.ElementIterator
@usableFromInline unowned let nexus: Nexus @usableFromInline unowned let nexus: Nexus
public init(family: Family<R>) { public init(family: Family<R>) {
@ -111,7 +111,7 @@ extension Family {
} }
public struct EntityComponentIterator: IteratorProtocol { public struct EntityComponentIterator: IteratorProtocol {
@usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id>.ElementIterator @usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>.ElementIterator
@usableFromInline unowned let nexus: Nexus @usableFromInline unowned let nexus: Nexus
public init(family: Family<R>) { public init(family: Family<R>) {

View File

@ -18,8 +18,8 @@ extension Nexus {
return traits.isMatch(components: componentIds) return traits.isMatch(components: componentIds)
} }
public func members(withFamilyTraits traits: FamilyTraitSet) -> UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id> { public func members(withFamilyTraits traits: FamilyTraitSet) -> UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx> {
familyMembersByTraits[traits] ?? UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id>() familyMembersByTraits[traits] ?? UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>()
} }
public func isMember(_ entity: Entity, in family: FamilyTraitSet) -> Bool { public func isMember(_ entity: Entity, in family: FamilyTraitSet) -> Bool {

View File

@ -86,7 +86,7 @@ extension Nexus {
return return
} }
familyMembersByTraits[traits] = UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id>() familyMembersByTraits[traits] = UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>()
update(familyMembership: traits) update(familyMembership: traits)
} }
@ -127,10 +127,10 @@ extension Nexus {
} }
func add(entityWithId entityId: EntityIdentifier, toFamilyWithTraits traits: FamilyTraitSet) { 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) { func remove(entityWithId entityId: EntityIdentifier, fromFamilyWithTraits traits: FamilyTraitSet) {
familyMembersByTraits[traits]!.remove(at: entityId.id) familyMembersByTraits[traits].unsafelyUnwrapped.remove(at: entityId.id)
} }
} }

View File

@ -8,7 +8,7 @@
public final class Nexus { public final class Nexus {
/// Main entity storage. /// Main entity storage.
/// Entities are tightly packed by EntityIdentifier. /// Entities are tightly packed by EntityIdentifier.
@usableFromInline final var entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id> @usableFromInline final var entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>
/// Entity ids that are currently not used. /// Entity ids that are currently not used.
let entityIdGenerator: EntityIdentifierGenerator let entityIdGenerator: EntityIdentifierGenerator
@ -29,14 +29,14 @@ public final class Nexus {
/// - Key: FamilyTraitSet aka component types that make up one distinct family. /// - 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. /// - Value: Tightly packed EntityIdentifiers that represent the association of an entity to the family.
@usableFromInline final var familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id>] @usableFromInline final var familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>]
public final var codingStrategy: CodingStrategy public final var codingStrategy: CodingStrategy
public final weak var delegate: NexusEventDelegate? public final weak var delegate: NexusEventDelegate?
public convenience init() { public convenience init() {
self.init(entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id>(), self.init(entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>(),
componentsByType: [:], componentsByType: [:],
componentsByEntity: [:], componentsByEntity: [:],
entityIdGenerator: EntityIdentifierGenerator(), entityIdGenerator: EntityIdentifierGenerator(),
@ -45,11 +45,11 @@ public final class Nexus {
codingStrategy: DefaultCodingStrategy()) codingStrategy: DefaultCodingStrategy())
} }
internal init(entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id>, internal init(entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>,
componentsByType: [ComponentIdentifier: ManagedContiguousArray<Component>], componentsByType: [ComponentIdentifier: ManagedContiguousArray<Component>],
componentsByEntity: [EntityIdentifier: Set<ComponentIdentifier>], componentsByEntity: [EntityIdentifier: Set<ComponentIdentifier>],
entityIdGenerator: EntityIdentifierGenerator, entityIdGenerator: EntityIdentifierGenerator,
familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Id>], familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>],
childrenByParentEntity: [EntityIdentifier: Set<EntityIdentifier>], childrenByParentEntity: [EntityIdentifier: Set<EntityIdentifier>],
codingStrategy: CodingStrategy) { codingStrategy: CodingStrategy) {
self.entityStorage = entityStorage self.entityStorage = entityStorage
@ -87,6 +87,6 @@ public struct DefaultCodingStrategy: CodingStrategy {
public init() { } public init() { }
public func codingKey<C>(for componentType: C.Type) -> DynamicCodingKey where C: Component { public func codingKey<C>(for componentType: C.Type) -> DynamicCodingKey where C: Component {
DynamicCodingKey(stringValue: "\(C.self)")! DynamicCodingKey(stringValue: "\(C.self)").unsafelyUnwrapped
} }
} }

View File

@ -13,15 +13,20 @@
/// ///
/// See <https://github.com/bombela/sparseset/blob/master/src/lib.rs> for a reference implementation. /// See <https://github.com/bombela/sparseset/blob/master/src/lib.rs> for a reference implementation.
public struct UnorderedSparseSet<Element, Key: Hashable & Codable> { public struct UnorderedSparseSet<Element, Key: Hashable & Codable> {
@usableFromInline final class Storage { // swiftlint:disable nesting
@usableFromInline
final class Storage {
/// An index into the dense store. /// 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. /// 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. /// A dense store holding all the entries.
public typealias DenseStore = ContiguousArray<Entry> @usableFromInline
typealias DenseStore = ContiguousArray<Entry>
@usableFromInline @usableFromInline
struct Entry { struct Entry {
@ -122,7 +127,8 @@ public struct UnorderedSparseSet<Element, Key: Hashable & Codable> {
dense.removeAll(keepingCapacity: keepingCapacity) dense.removeAll(keepingCapacity: keepingCapacity)
} }
@inlinable func makeIterator() -> IndexingIterator<ContiguousArray<Storage.Entry>> { @inlinable
func makeIterator() -> IndexingIterator<ContiguousArray<Storage.Entry>> {
dense.makeIterator() dense.makeIterator()
} }
} }