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