summaryrefslogtreecommitdiff
path: root/ecs/src/entity.rs
diff options
context:
space:
mode:
Diffstat (limited to 'ecs/src/entity.rs')
-rw-r--r--ecs/src/entity.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/ecs/src/entity.rs b/ecs/src/entity.rs
new file mode 100644
index 0000000..abc5991
--- /dev/null
+++ b/ecs/src/entity.rs
@@ -0,0 +1,30 @@
+use std::sync::atomic::{AtomicU64, Ordering};
+
+static NEXT_UID: AtomicU64 = AtomicU64::new(0);
+
+/// Unique entity ID.
+#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, PartialOrd, Ord)]
+pub struct Uid
+{
+ inner: u64,
+}
+
+impl Uid
+{
+ pub fn new(uid: u64) -> Self
+ {
+ debug_assert!(
+ uid < NEXT_UID.load(Ordering::Relaxed),
+ "Invalid entity UID {uid}"
+ );
+
+ Self { inner: uid }
+ }
+
+ pub fn new_unique() -> Self
+ {
+ Self {
+ inner: NEXT_UID.fetch_add(1, Ordering::Relaxed),
+ }
+ }
+}