Line data Source code
1 : //! `u64`` and `usize`` aren't guaranteed to be identical in Rust, but life is much simpler if that's the case.
2 :
3 : pub(crate) const _ASSERT_U64_EQ_USIZE: () = {
4 : if std::mem::size_of::<usize>() != std::mem::size_of::<u64>() {
5 : panic!("the traits defined in this module assume that usize and u64 can be converted to each other without loss of information");
6 : }
7 : };
8 :
9 : pub(crate) trait U64IsUsize {
10 : fn into_usize(self) -> usize;
11 : }
12 :
13 : impl U64IsUsize for u64 {
14 : #[inline(always)]
15 8166569 : fn into_usize(self) -> usize {
16 8166569 : #[allow(clippy::let_unit_value)]
17 8166569 : let _ = _ASSERT_U64_EQ_USIZE;
18 8166569 : self as usize
19 8166569 : }
20 : }
21 :
22 : pub(crate) trait UsizeIsU64 {
23 : fn into_u64(self) -> u64;
24 : }
25 :
26 : impl UsizeIsU64 for usize {
27 : #[inline(always)]
28 18758091 : fn into_u64(self) -> u64 {
29 18758091 : #[allow(clippy::let_unit_value)]
30 18758091 : let _ = _ASSERT_U64_EQ_USIZE;
31 18758091 : self as u64
32 18758091 : }
33 : }
34 :
35 210 : pub const fn u64_to_usize(x: u64) -> usize {
36 210 : #[allow(clippy::let_unit_value)]
37 210 : let _ = _ASSERT_U64_EQ_USIZE;
38 210 : x as usize
39 210 : }
|