Overall improvements to consistency
This commit is contained in:
parent
ea632606d6
commit
9486e633df
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 "<FamilyTraitSet [requiresAll:\(requiresAll.description) excludesAll:\(excludesAll.description)]>"
|
||||
}
|
||||
|
||||
@inlinable public var debugDescription: String {
|
||||
return "<FamilyTraitSet [requiresAll:\(requiresAll.debugDescription) excludesAll: \(excludesAll.debugDescription)]>"
|
||||
}
|
||||
}
|
||||
|
||||
// MARK: - Equatable
|
||||
|
|
@ -68,3 +60,13 @@ extension FamilyTraitSet: Hashable {
|
|||
hasher.combine(setHash)
|
||||
}
|
||||
}
|
||||
|
||||
extension FamilyTraitSet: CustomStringConvertible, CustomDebugStringConvertible {
|
||||
@inlinable public var description: String {
|
||||
return "<FamilyTraitSet [requiresAll:\(requiresAll.description) excludesAll:\(excludesAll.description)]>"
|
||||
}
|
||||
|
||||
@inlinable public var debugDescription: String {
|
||||
return "<FamilyTraitSet [requiresAll:\(requiresAll.debugDescription) excludesAll: \(excludesAll.debugDescription)]>"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
Loading…
Reference in New Issue