cuprate_helper/
cast.rs

1//! Casting.
2//!
3//! This modules provides utilities for casting between types.
4//!
5//! `#[no_std]` compatible.
6
7#![allow(clippy::cast_possible_truncation)]
8
9#[rustfmt::skip]
10//============================ SAFETY: DO NOT REMOVE ===========================//
11//                                                                              //
12//                                                                              //
13//                     Only allow building 64-bit targets.                      //
14//            This allows us to assume 64-bit invariants in this file.          //
15                       #[cfg(not(target_pointer_width = "64"))]
16           compile_error!("Cuprate is only compatible with 64-bit CPUs");
17//                                                                              //
18//                                                                              //
19//============================ SAFETY: DO NOT REMOVE ===========================//
20
21/// Cast [`u64`] to [`usize`].
22#[inline(always)]
23pub const fn u64_to_usize(u: u64) -> usize {
24    u as usize
25}
26
27/// Cast [`u32`] to [`usize`].
28#[inline(always)]
29pub const fn u32_to_usize(u: u32) -> usize {
30    u as usize
31}
32
33/// Cast [`usize`] to [`u64`].
34#[inline(always)]
35pub const fn usize_to_u64(u: usize) -> u64 {
36    u as u64
37}
38
39/// Cast [`i64`] to [`isize`].
40#[inline(always)]
41pub const fn i64_to_isize(i: i64) -> isize {
42    i as isize
43}
44
45/// Cast [`i32`] to [`isize`].
46#[inline(always)]
47pub const fn i32_to_isize(i: i32) -> isize {
48    i as isize
49}
50
51/// Cast [`isize`] to [`i64`].
52#[inline(always)]
53pub const fn isize_to_i64(i: isize) -> i64 {
54    i as i64
55}
56
57//---------------------------------------------------------------------------------------------------- Tests
58#[cfg(test)]
59mod test {
60    use super::*;
61
62    #[test]
63    fn max_unsigned() {
64        assert_eq!(u32_to_usize(u32::MAX), usize::try_from(u32::MAX).unwrap());
65        assert_eq!(usize_to_u64(u32_to_usize(u32::MAX)), u64::from(u32::MAX));
66
67        assert_eq!(u64_to_usize(u64::MAX), usize::MAX);
68        assert_eq!(usize_to_u64(u64_to_usize(u64::MAX)), u64::MAX);
69
70        assert_eq!(usize_to_u64(usize::MAX), u64::MAX);
71        assert_eq!(u64_to_usize(usize_to_u64(usize::MAX)), usize::MAX);
72    }
73
74    #[test]
75    fn max_signed() {
76        assert_eq!(i32_to_isize(i32::MAX), isize::try_from(i32::MAX).unwrap());
77        assert_eq!(isize_to_i64(i32_to_isize(i32::MAX)), i64::from(i32::MAX));
78
79        assert_eq!(i64_to_isize(i64::MAX), isize::MAX);
80        assert_eq!(isize_to_i64(i64_to_isize(i64::MAX)), i64::MAX);
81
82        assert_eq!(isize_to_i64(isize::MAX), i64::MAX);
83        assert_eq!(i64_to_isize(isize_to_i64(isize::MAX)), isize::MAX);
84    }
85}