diff --git a/Sources/FirebladeECS/Entity.swift b/Sources/FirebladeECS/Entity.swift index ece1467..758e559 100644 --- a/Sources/FirebladeECS/Entity.swift +++ b/Sources/FirebladeECS/Entity.swift @@ -5,7 +5,7 @@ // Created by Christian Treffs on 08.10.17. // -public struct Entity: UniqueEntityIdentifiable { +public struct Entity: UniqueEntityIdentifiable, Equatable { public internal(set) var identifier = EntityIdentifier.invalid public var name: String? public let nexus: Nexus diff --git a/Sources/FirebladeECS/EntityIdentifier.swift b/Sources/FirebladeECS/EntityIdentifier.swift index 1bf5c6e..6c376a4 100644 --- a/Sources/FirebladeECS/EntityIdentifier.swift +++ b/Sources/FirebladeECS/EntityIdentifier.swift @@ -25,12 +25,6 @@ public extension EntityIndex { } // MARK: Unique Entity Identifiable -public protocol UniqueEntityIdentifiable: Hashable { +public protocol UniqueEntityIdentifiable { var identifier: EntityIdentifier { get } } - -public extension UniqueEntityIdentifiable { - func hash(into hasher: inout Hasher) { - hasher.combine(identifier.hashValue) - } -} diff --git a/Sources/FirebladeECS/FamilyTraitSet.swift b/Sources/FirebladeECS/FamilyTraitSet.swift index d59e474..bf7a855 100644 --- a/Sources/FirebladeECS/FamilyTraitSet.swift +++ b/Sources/FirebladeECS/FamilyTraitSet.swift @@ -5,7 +5,7 @@ // Created by Christian Treffs on 09.10.17. // -public struct FamilyTraitSet: CustomStringConvertible, CustomDebugStringConvertible { +public struct FamilyTraitSet { public let requiresAll: ComponentSet public let excludesAll: ComponentSet @@ -45,14 +45,6 @@ public struct FamilyTraitSet: CustomStringConvertible, CustomDebugStringConverti return !requiresAll.isEmpty && requiresAll.isDisjoint(with: excludesAll) } - - @inlinable public var description: String { - return "" - } - - @inlinable public var debugDescription: String { - return "" - } } // MARK: - Equatable @@ -68,3 +60,13 @@ extension FamilyTraitSet: Hashable { hasher.combine(setHash) } } + +extension FamilyTraitSet: CustomStringConvertible, CustomDebugStringConvertible { + @inlinable public var description: String { + return "" + } + + @inlinable public var debugDescription: String { + return "" + } +} diff --git a/Sources/FirebladeECS/Nexus+Family.swift b/Sources/FirebladeECS/Nexus+Family.swift index b7f096e..f37e469 100644 --- a/Sources/FirebladeECS/Nexus+Family.swift +++ b/Sources/FirebladeECS/Nexus+Family.swift @@ -20,8 +20,8 @@ public extension Nexus { return traits.isMatch(components: componentSet) } - func members(withFamilyTraits traits: FamilyTraitSet) -> UniformEntityIdentifiers? { - return familyMembersByTraits[traits] + func members(withFamilyTraits traits: FamilyTraitSet) -> UniformEntityIdentifiers { + return familyMembersByTraits[traits] ?? UniformEntityIdentifiers() } func isMember(_ entity: Entity, in family: FamilyTraitSet) -> Bool { @@ -33,9 +33,6 @@ public extension Nexus { } func isMember(entity entityId: EntityIdentifier, inFamilyWithTraits traits: FamilyTraitSet) -> Bool { - guard let members: UniformEntityIdentifiers = members(withFamilyTraits: traits) else { - return false - } - return members.contains(entityId.index) + return members(withFamilyTraits: traits).contains(entityId.index) } } diff --git a/Sources/FirebladeECS/TypedFamily.swift b/Sources/FirebladeECS/TypedFamily.swift index 847b94f..a3767d0 100644 --- a/Sources/FirebladeECS/TypedFamily.swift +++ b/Sources/FirebladeECS/TypedFamily.swift @@ -39,7 +39,7 @@ public extension TypedFamilyProtocol { } @inlinable var memberIds: UniformEntityIdentifiers { - return nexus.members(withFamilyTraits: traits) ?? UniformEntityIdentifiers() + return nexus.members(withFamilyTraits: traits) } @inlinable var count: Int { diff --git a/Tests/FirebladeECSTests/FamilyTests.swift b/Tests/FirebladeECSTests/FamilyTests.swift index 01f80e4..dd9af75 100644 --- a/Tests/FirebladeECSTests/FamilyTests.swift +++ b/Tests/FirebladeECSTests/FamilyTests.swift @@ -5,7 +5,7 @@ // Created by Christian Treffs on 09.10.17. // -@testable import FirebladeECS +import FirebladeECS import XCTest class FamilyTests: XCTestCase { @@ -35,8 +35,9 @@ class FamilyTests: XCTestCase { XCTAssertEqual(family.nexus, self.nexus) XCTAssertTrue(family.nexus === self.nexus) - XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1) - XCTAssertEqual(nexus.familyMembersByTraits.values.count, 1) + XCTAssertEqual(nexus.numFamilies, 1) + XCTAssertEqual(nexus.numComponents, 0) + XCTAssertEqual(nexus.numEntities, 0) let traits = FamilyTraitSet(requiresAll: [Position.self], excludesAll: [Name.self]) XCTAssertEqual(family.traits, traits) @@ -50,36 +51,56 @@ class FamilyTests: XCTestCase { let familyB = nexus.family(requires: Position.self, excludesAll: Name.self) - XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1) - XCTAssertEqual(nexus.familyMembersByTraits.values.count, 1) + XCTAssertEqual(nexus.numFamilies, 1) + XCTAssertEqual(nexus.numComponents, 0) XCTAssertEqual(familyA, familyB) } func testFamilyAbandoned() { - - XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 0) + XCTAssertEqual(nexus.numFamilies, 0) + XCTAssertEqual(nexus.numComponents, 0) + XCTAssertEqual(nexus.numEntities, 0) _ = nexus.family(requires: Position.self) - XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1) + XCTAssertEqual(nexus.numFamilies, 1) + XCTAssertEqual(nexus.numComponents, 0) + XCTAssertEqual(nexus.numEntities, 0) let entity = nexus.create(entity: "eimer") + XCTAssertFalse(entity.has(Position.self)) + XCTAssertEqual(nexus.numFamilies, 1) + XCTAssertEqual(nexus.numComponents, 0) + XCTAssertEqual(nexus.numEntities, 1) entity.assign(Position(x: 1, y: 1)) - XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1) + XCTAssertTrue(entity.has(Position.self)) + XCTAssertEqual(nexus.numFamilies, 1) + XCTAssertEqual(nexus.numComponents, 1) + XCTAssertEqual(nexus.numEntities, 1) entity.remove(Position.self) - XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1) + XCTAssertEqual(nexus.numFamilies, 1) + XCTAssertEqual(nexus.numComponents, 0) + XCTAssertEqual(nexus.numEntities, 1) nexus.destroy(entity: entity) - XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1) + XCTAssertEqual(nexus.numFamilies, 1) + XCTAssertEqual(nexus.numComponents, 0) + XCTAssertEqual(nexus.numEntities, 0) } func testFamilyLateMember() { - let eEarly = nexus.create(entity: "eary").assign(Position(x: 1, y: 2)) - XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 0) + let eEarly = nexus.create(entity: "early").assign(Position(x: 1, y: 2)) + XCTAssertEqual(nexus.numFamilies, 0) + XCTAssertEqual(nexus.numComponents, 1) + XCTAssertEqual(nexus.numEntities, 1) let family = nexus.family(requires: Position.self) - XCTAssertEqual(nexus.familyMembersByTraits.keys.count, 1) + XCTAssertEqual(nexus.numFamilies, 1) + XCTAssertEqual(nexus.numComponents, 1) + XCTAssertEqual(nexus.numEntities, 1) let eLate = nexus.create(entity: "late").assign(Position(x: 1, y: 2)) + XCTAssertEqual(nexus.numFamilies, 1) + XCTAssertEqual(nexus.numComponents, 2) + XCTAssertEqual(nexus.numEntities, 2) XCTAssertTrue(family.isMember(eEarly)) XCTAssertTrue(family.isMember(eLate)) - } func testFamilyExchange() { diff --git a/Tests/FirebladeECSTests/NexusTests.swift b/Tests/FirebladeECSTests/NexusTests.swift index f074b32..e42e0c5 100644 --- a/Tests/FirebladeECSTests/NexusTests.swift +++ b/Tests/FirebladeECSTests/NexusTests.swift @@ -127,6 +127,21 @@ class NexusTests: XCTestCase { XCTAssert(e0.numComponents == 0) } + + func testComponentRetrieval() { + let pos = Position(x: 1, y: 2) + let name = Name(name: "myName") + let vel = Velocity(a: 3) + let entity = nexus.create(entity: "TrippleComponents", with: pos, name, vel) + + let (rPos, rName, rVel) = entity.get(components: Position.self, Name.self, Velocity.self) + + + XCTAssertTrue(rPos === pos) + XCTAssertTrue(rName === name) + XCTAssertTrue(rVel === vel) + + } func testComponentUniqueness() { let a = nexus.create()