Merge branch 'feature/destroy-members' into develop

This commit is contained in:
Christian Treffs 2020-08-07 11:11:28 +02:00
commit 4c15fcf823
No known key found for this signature in database
GPG Key ID: 49A4B4B460BE3ED4
3 changed files with 39 additions and 2 deletions

View File

@ -17,14 +17,16 @@ public struct Family<R> where R: FamilyRequirementsManaging {
nexus.onFamilyInit(traits: traits) nexus.onFamilyInit(traits: traits)
} }
@inlinable public var memberIds: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx> { @inlinable var memberIds: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx> {
nexus.members(withFamilyTraits: traits) nexus.members(withFamilyTraits: traits)
} }
/// Returns the number of family member entities.
@inlinable public var count: Int { @inlinable public var count: Int {
memberIds.count memberIds.count
} }
/// True if this family has no members; false otherwise.
@inlinable public var isEmpty: Bool { @inlinable public var isEmpty: Bool {
memberIds.isEmpty memberIds.isEmpty
} }
@ -38,6 +40,13 @@ public struct Family<R> where R: FamilyRequirementsManaging {
public func isMember(_ entity: Entity) -> Bool { public func isMember(_ entity: Entity) -> Bool {
nexus.isMember(entity, in: traits) nexus.isMember(entity, in: traits)
} }
/// Destroy all member entities of this family.
/// - Returns: True if entities where destroyed successfully, false otherwise.
@discardableResult
public func destroyMembers() -> Bool {
entities.reduce(!isEmpty) { $0 && nexus.destroy(entity: $1) }
}
} }
extension Family: Equatable { extension Family: Equatable {
@ -48,7 +57,7 @@ extension Family: Equatable {
} }
extension Family: Sequence { extension Family: Sequence {
__consuming public func makeIterator() -> ComponentsIterator { public func makeIterator() -> ComponentsIterator {
ComponentsIterator(family: self) ComponentsIterator(family: self)
} }
} }

View File

@ -185,6 +185,33 @@ class FamilyTests: XCTestCase {
XCTAssertEqual(family.memberIds.count, count + (count / 2)) XCTAssertEqual(family.memberIds.count, count + (count / 2))
} }
func testFamilyDestroyMembers() {
let family = nexus.family(requiresAll: Position.self, Color.self)
family.createMember(with: (Position(x: 1, y: 2), Color(r: 1, g: 2, b: 3)))
family.createMember(with: (Position(x: 3, y: 4), Color(r: 4, g: 5, b: 6)))
nexus.createEntity(with: Name(name: "anotherEntity"))
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 5)
XCTAssertEqual(nexus.numEntities, 3)
XCTAssertEqual(family.count, 2)
XCTAssertTrue(family.destroyMembers())
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 1)
XCTAssertEqual(nexus.numEntities, 1)
XCTAssertEqual(family.count, 0)
XCTAssertFalse(family.destroyMembers())
XCTAssertEqual(nexus.numFamilies, 1)
XCTAssertEqual(nexus.numComponents, 1)
XCTAssertEqual(nexus.numEntities, 1)
XCTAssertEqual(family.count, 0)
}
func testFamilyCreateMembers() { func testFamilyCreateMembers() {
let position = Position(x: 0, y: 1) let position = Position(x: 0, y: 1)
let name = Name(name: "SomeName") let name = Name(name: "SomeName")

View File

@ -194,6 +194,7 @@ extension FamilyTests {
("testFamilyBulkDestroy", testFamilyBulkDestroy), ("testFamilyBulkDestroy", testFamilyBulkDestroy),
("testFamilyCreateMembers", testFamilyCreateMembers), ("testFamilyCreateMembers", testFamilyCreateMembers),
("testFamilyCreation", testFamilyCreation), ("testFamilyCreation", testFamilyCreation),
("testFamilyDestroyMembers", testFamilyDestroyMembers),
("testFamilyExchange", testFamilyExchange), ("testFamilyExchange", testFamilyExchange),
("testFamilyLateMember", testFamilyLateMember), ("testFamilyLateMember", testFamilyLateMember),
("testFamilyMemberBasicIteration", testFamilyMemberBasicIteration), ("testFamilyMemberBasicIteration", testFamilyMemberBasicIteration),