|
300 | 300 | //! represent the tagged pointer as an actual pointer and not a `usize`*. For instance: |
301 | 301 | //! |
302 | 302 | //! ``` |
303 | | -//! unsafe { |
304 | | -//! // A flag we want to pack into our pointer |
305 | | -//! static HAS_DATA: usize = 0x1; |
306 | | -//! static FLAG_MASK: usize = !HAS_DATA; |
307 | | -//! |
308 | | -//! // Our value, which must have enough alignment to have spare least-significant-bits. |
309 | | -//! let my_precious_data: u32 = 17; |
310 | | -//! assert!(align_of::<u32>() > 1); |
311 | | -//! |
312 | | -//! // Create a tagged pointer |
313 | | -//! let ptr = &my_precious_data as *const u32; |
314 | | -//! let tagged = ptr.map_addr(|addr| addr | HAS_DATA); |
315 | | -//! |
316 | | -//! // Check the flag: |
317 | | -//! if tagged.addr() & HAS_DATA != 0 { |
318 | | -//! // Untag and read the pointer |
319 | | -//! let data = *tagged.map_addr(|addr| addr & FLAG_MASK); |
320 | | -//! assert_eq!(data, 17); |
321 | | -//! } else { |
322 | | -//! unreachable!() |
323 | | -//! } |
| 303 | +//! // A flag we want to pack into our pointer |
| 304 | +//! static HAS_DATA: usize = 0x1; |
| 305 | +//! static FLAG_MASK: usize = !HAS_DATA; |
| 306 | +//! |
| 307 | +//! // Our value, which must have enough alignment to have spare least-significant-bits. |
| 308 | +//! let my_precious_data: u32 = 17; |
| 309 | +//! assert!(align_of::<u32>() > 1); |
| 310 | +//! |
| 311 | +//! // Create a tagged pointer |
| 312 | +//! let ptr = &my_precious_data as *const u32; |
| 313 | +//! let tagged = ptr.map_addr(|addr| addr | HAS_DATA); |
| 314 | +//! |
| 315 | +//! // Check the flag: |
| 316 | +//! if tagged.addr() & HAS_DATA != 0 { |
| 317 | +//! // Untag and read the pointer |
| 318 | +//! let data = unsafe { *tagged.map_addr(|addr| addr & FLAG_MASK) }; |
| 319 | +//! assert_eq!(data, 17); |
| 320 | +//! } else { |
| 321 | +//! unreachable!() |
324 | 322 | //! } |
325 | 323 | //! ``` |
326 | 324 | //! |
|
0 commit comments