Skip to content

Commit 7613cb2

Browse files
committed
Merge branch 'release/0.15.4' into master
2 parents f55cb64 + 3d98ce9 commit 7613cb2

File tree

10 files changed

+70
-32
lines changed

10 files changed

+70
-32
lines changed

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import PackageDescription
3636
let package = Package(
3737
name: "YourPackageName",
3838
dependencies: [
39-
.package(url: "https://github.com/fireblade-engine/ecs.git", from: "0.15.3")
39+
.package(url: "https://github.com/fireblade-engine/ecs.git", from: "0.15.4")
4040
],
4141
targets: [
4242
.target(
@@ -71,7 +71,7 @@ then create entities by letting the `Nexus` generate them.
7171
let newEntity = nexus.createEntity()
7272
```
7373

74-
To define components conform your class to the `Component` protocol
74+
To define components, conform your class to the `Component` protocol
7575

7676
```swift
7777
final class Position: Component {

Sources/FirebladeECS/EntityIdentifier.swift

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,57 @@
55
// Created by Christian Treffs on 08.10.17.
66
//
77

8+
/// **EntityIdentifier**
9+
///
10+
/// An entity identifier represents the unique identity of an entity.
811
public struct EntityIdentifier {
9-
public static let invalid = EntityIdentifier(.max)
10-
11-
public typealias Idx = Int
12+
/// Entity identifier type.
13+
///
14+
/// Provides 4294967295 unique identifiers.
15+
public typealias Identifier = UInt32
1216

13-
/// provides 4294967295 unique identifiers since it's constrained to UInt32 - invalid.
14-
@usableFromInline let id: Idx
17+
/// The entity identifier.
18+
public let id: Identifier
1519

1620
@inlinable
17-
public init(_ uint32: UInt32) {
18-
self.id = Idx(uint32)
21+
public init(_ id: Identifier) {
22+
self.init(rawValue: id)
1923
}
2024
}
2125

2226
extension EntityIdentifier: Equatable { }
2327
extension EntityIdentifier: Hashable { }
28+
29+
extension EntityIdentifier: RawRepresentable {
30+
/// The entity identifier represented as a raw value.
31+
@inline(__always)
32+
public var rawValue: Identifier { id }
33+
34+
@inlinable
35+
public init(rawValue: Identifier) {
36+
self.id = rawValue
37+
}
38+
}
39+
40+
extension EntityIdentifier: ExpressibleByIntegerLiteral {
41+
public init(integerLiteral value: Identifier) {
42+
self.init(value)
43+
}
44+
}
45+
46+
extension EntityIdentifier {
47+
/// Invalid entity identifier
48+
///
49+
/// Used to represent an invalid entity identifier.
50+
public static let invalid = EntityIdentifier(.max)
51+
}
52+
53+
extension EntityIdentifier {
54+
/// Provides the entity identifier as an index
55+
///
56+
/// This is a convenience property for collection indexing and does not represent the raw identifier.
57+
///
58+
/// Use `id` or `rawValue` instead.
59+
@inline(__always)
60+
public var index: Int { Int(id) }
61+
}

Sources/FirebladeECS/Family.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public struct Family<R> where R: FamilyRequirementsManaging {
1717
nexus.onFamilyInit(traits: traits)
1818
}
1919

20-
@inlinable var memberIds: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx> {
20+
@inlinable var memberIds: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier> {
2121
nexus.members(withFamilyTraits: traits)
2222
}
2323

@@ -75,7 +75,7 @@ extension Family: LazySequenceProtocol { }
7575
// MARK: - components iterator
7676
extension Family {
7777
public struct ComponentsIterator: IteratorProtocol {
78-
@usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>.ElementIterator
78+
@usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier>.ElementIterator
7979
@usableFromInline unowned let nexus: Nexus
8080

8181
public init(family: Family<R>) {
@@ -102,7 +102,7 @@ extension Family {
102102
}
103103

104104
public struct EntityIterator: IteratorProtocol {
105-
@usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>.ElementIterator
105+
@usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier>.ElementIterator
106106
@usableFromInline unowned let nexus: Nexus
107107

108108
public init(family: Family<R>) {
@@ -128,7 +128,7 @@ extension Family {
128128
}
129129

130130
public struct EntityComponentIterator: IteratorProtocol {
131-
@usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>.ElementIterator
131+
@usableFromInline var memberIdsIterator: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier>.ElementIterator
132132
@usableFromInline unowned let nexus: Nexus
133133

134134
public init(family: Family<R>) {

Sources/FirebladeECS/Generated/Family.generated.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Generated using Sourcery 0.18.0 — https://github.com/krzysztofzablocki/Sourcery
1+
// Generated using Sourcery 1.0.0 — https://github.com/krzysztofzablocki/Sourcery
22
// DO NOT EDIT
33

44
// swiftlint:disable file_length

Sources/FirebladeECS/Nexus+Component.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ extension Nexus {
1414
guard let uniforms = componentsByType[componentId] else {
1515
return false
1616
}
17-
return uniforms.contains(entityId.id)
17+
return uniforms.contains(entityId.index)
1818
}
1919

2020
public final func count(components entityId: EntityIdentifier) -> Int {
@@ -36,13 +36,13 @@ extension Nexus {
3636
guard let uniformComponents = componentsByType[componentId] else {
3737
return nil
3838
}
39-
return uniformComponents.get(at: entityId.id)
39+
return uniformComponents.get(at: entityId.index)
4040
}
4141

4242
@inlinable
4343
public final func get(unsafeComponent componentId: ComponentIdentifier, for entityId: EntityIdentifier) -> Component {
4444
let uniformComponents = componentsByType[componentId].unsafelyUnwrapped
45-
return uniformComponents.get(unsafeAt: entityId.id)
45+
return uniformComponents.get(unsafeAt: entityId.index)
4646
}
4747

4848
@inlinable
@@ -66,7 +66,7 @@ extension Nexus {
6666
@discardableResult
6767
public final func remove(component componentId: ComponentIdentifier, from entityId: EntityIdentifier) -> Bool {
6868
// delete component instance
69-
componentsByType[componentId]?.remove(at: entityId.id)
69+
componentsByType[componentId]?.remove(at: entityId.index)
7070
// un-assign component from entity
7171
componentIdsByEntity[entityId]?.remove(componentId)
7272

@@ -95,6 +95,6 @@ extension Nexus {
9595
guard let uniformComponents = componentsByType[componentId] else {
9696
return nil
9797
}
98-
return uniformComponents.get(at: entityId.id) as? C
98+
return uniformComponents.get(at: entityId.index) as? C
9999
}
100100
}

Sources/FirebladeECS/Nexus+Family.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ extension Nexus {
1818
return traits.isMatch(components: componentIds)
1919
}
2020

21-
public func members(withFamilyTraits traits: FamilyTraitSet) -> UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx> {
22-
familyMembersByTraits[traits] ?? UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>()
21+
public func members(withFamilyTraits traits: FamilyTraitSet) -> UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier> {
22+
familyMembersByTraits[traits] ?? UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier>()
2323
}
2424

2525
public func isMember(_ entity: Entity, in family: FamilyTraitSet) -> Bool {

Sources/FirebladeECS/Nexus+Internal.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ extension Nexus {
5252
if componentsByType[componentId] == nil {
5353
componentsByType[componentId] = ManagedContiguousArray<Component>()
5454
}
55-
componentsByType[componentId]?.insert(component, at: entityId.id)
55+
componentsByType[componentId]?.insert(component, at: entityId.index)
5656
}
5757

5858
func assign(_ componentId: ComponentIdentifier, _ entityId: EntityIdentifier) {
@@ -86,7 +86,7 @@ extension Nexus {
8686
return
8787
}
8888

89-
familyMembersByTraits[traits] = UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>()
89+
familyMembersByTraits[traits] = UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier>()
9090
update(familyMembership: traits)
9191
}
9292

Sources/FirebladeECS/Nexus.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
public final class Nexus {
99
/// Main entity storage.
1010
/// Entities are tightly packed by EntityIdentifier.
11-
@usableFromInline final var entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>
11+
@usableFromInline final var entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier>
1212

1313
/// - Key: ComponentIdentifier aka component type.
1414
/// - Value: Array of component instances of same type (uniform).
@@ -22,7 +22,7 @@ public final class Nexus {
2222

2323
/// - Key: FamilyTraitSet aka component types that make up one distinct family.
2424
/// - Value: Tightly packed EntityIdentifiers that represent the association of an entity to the family.
25-
@usableFromInline final var familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>]
25+
@usableFromInline final var familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier>]
2626

2727
/// The entity identifier generator responsible for providing unique ids for entities during runtime.
2828
///
@@ -39,19 +39,19 @@ public final class Nexus {
3939
public final weak var delegate: NexusEventDelegate?
4040

4141
public convenience init() {
42-
self.init(entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>(),
42+
self.init(entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier>(),
4343
componentsByType: [:],
4444
componentsByEntity: [:],
4545
entityIdGenerator: DefaultEntityIdGenerator(),
4646
familyMembersByTraits: [:],
4747
codingStrategy: DefaultCodingStrategy())
4848
}
4949

50-
internal init(entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>,
50+
internal init(entityStorage: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier>,
5151
componentsByType: [ComponentIdentifier: ManagedContiguousArray<Component>],
5252
componentsByEntity: [EntityIdentifier: Set<ComponentIdentifier>],
5353
entityIdGenerator: EntityIdentifierGenerator,
54-
familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Idx>],
54+
familyMembersByTraits: [FamilyTraitSet: UnorderedSparseSet<EntityIdentifier, EntityIdentifier.Identifier>],
5555
codingStrategy: CodingStrategy) {
5656
self.entityStorage = entityStorage
5757
self.componentsByType = componentsByType

Tests/FirebladeECSTests/EntityTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,15 +11,15 @@ import XCTest
1111
class EntityTests: XCTestCase {
1212
func testEntityIdentifierAndIndex() {
1313
let min = EntityIdentifier(.min)
14-
XCTAssertEqual(min.id, Int(UInt32.min))
14+
XCTAssertEqual(min.id, UInt32.min)
1515

1616
let uRand = UInt32.random(in: UInt32.min...UInt32.max)
1717
let rand = EntityIdentifier(uRand)
18-
XCTAssertEqual(rand.id, Int(uRand))
18+
XCTAssertEqual(rand.id, uRand)
1919

2020
let max = EntityIdentifier(.max)
2121
XCTAssertEqual(max, EntityIdentifier.invalid)
22-
XCTAssertEqual(max.id, Int(UInt32.max))
22+
XCTAssertEqual(max.id, UInt32.max)
2323
}
2424

2525
func testAllComponentsOfEntity() {

Tests/FirebladeECSTests/Generated/FamilyTests.generated.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Generated using Sourcery 0.18.0 — https://github.com/krzysztofzablocki/Sourcery
1+
// Generated using Sourcery 1.0.0 — https://github.com/krzysztofzablocki/Sourcery
22
// DO NOT EDIT
33

44
import FirebladeECS

0 commit comments

Comments
 (0)