Mark TableRow and TableId as repr(transparent) (#7166)
# Objective Following #6681, both `TableRow` and `TableId` are now part of `EntityLocation`. However, the safety invariant on `EntityLocation` requires that all of the constituent fields are `repr(transprent)` or `repr(C)` and the bit pattern of all 1s must be valid. This is not true for `TableRow` and `TableId` currently. ## Solution Mark `TableRow` and `TableId` to satisfy the safety requirement. Add safety comments on `ArchetypeId`, `ArchetypeRow`, `TableId` and `TableRow`.
This commit is contained in:
parent
dfc4f05c87
commit
f4920bbd6d
@ -40,6 +40,7 @@ use std::{
|
|||||||
/// [`World`]: crate::world::World
|
/// [`World`]: crate::world::World
|
||||||
/// [`Entities::get`]: crate::entity::Entities
|
/// [`Entities::get`]: crate::entity::Entities
|
||||||
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
|
||||||
|
// SAFETY: Must be repr(transparent) due to the safety requirements on EntityLocation
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
pub struct ArchetypeRow(u32);
|
pub struct ArchetypeRow(u32);
|
||||||
|
|
||||||
@ -68,6 +69,7 @@ impl ArchetypeRow {
|
|||||||
/// [`World`]: crate::world::World
|
/// [`World`]: crate::world::World
|
||||||
/// [`EMPTY`]: crate::archetype::ArchetypeId::EMPTY
|
/// [`EMPTY`]: crate::archetype::ArchetypeId::EMPTY
|
||||||
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
|
#[derive(Debug, Copy, Clone, Eq, PartialEq, Hash)]
|
||||||
|
// SAFETY: Must be repr(transparent) due to the safety requirements on EntityLocation
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
pub struct ArchetypeId(u32);
|
pub struct ArchetypeId(u32);
|
||||||
|
|
||||||
|
@ -26,6 +26,8 @@ use std::{
|
|||||||
/// [`Archetype`]: crate::archetype::Archetype
|
/// [`Archetype`]: crate::archetype::Archetype
|
||||||
/// [`Archetype::table_id`]: crate::archetype::Archetype::table_id
|
/// [`Archetype::table_id`]: crate::archetype::Archetype::table_id
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
// SAFETY: Must be repr(transparent) due to the safety requirements on EntityLocation
|
||||||
|
#[repr(transparent)]
|
||||||
pub struct TableId(u32);
|
pub struct TableId(u32);
|
||||||
|
|
||||||
impl TableId {
|
impl TableId {
|
||||||
@ -64,6 +66,8 @@ impl TableId {
|
|||||||
/// [`Archetype::table_id`]: crate::archetype::Archetype::table_id
|
/// [`Archetype::table_id`]: crate::archetype::Archetype::table_id
|
||||||
/// [`Entity`]: crate::entity::Entity
|
/// [`Entity`]: crate::entity::Entity
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
|
// SAFETY: Must be repr(transparent) due to the safety requirements on EntityLocation
|
||||||
|
#[repr(transparent)]
|
||||||
pub struct TableRow(u32);
|
pub struct TableRow(u32);
|
||||||
|
|
||||||
impl TableRow {
|
impl TableRow {
|
||||||
|
Loading…
Reference in New Issue
Block a user