1 //! A basic `Variable` implementation. 2 //! 3 //! Frontends can use any indexing scheme they see fit and 4 //! generate the appropriate `Variable` instances. 5 //! 6 //! Note: The `Variable` is used by Cranelift to index into densely allocated 7 //! arrays containing information about your mutable variables 8 //! Thus, make sure that Variable's indexes are allocated contiguously and 9 //! starting at `0`. 10 11 use core::u32; 12 use cranelift_codegen::entity::EntityRef; 13 14 /// An opaque reference to a variable. 15 #[derive(Copy, Clone, PartialEq, Eq, Debug)] 16 pub struct Variable(u32); 17 18 impl Variable { 19 /// Create a new Variable with the given index. 20 pub fn with_u32(index: u32) -> Self { 21 debug_assert!(index < u32::MAX); 22 Self(index) 23 } 24 } 25 26 impl EntityRef for Variable { 27 fn new(index: usize) -> Self { 28 debug_assert!(index < (u32::MAX as usize)); 29 Self(index as u32) 30 } 31 32 fn index(self) -> usize { 33 self.0 as usize 34 } 35 } 36