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 55044188 : fn into_usize(self) -> usize {
16 55044188 : #[allow(clippy::let_unit_value)]
17 55044188 : let _ = _ASSERT_U64_EQ_USIZE;
18 55044188 : self as usize
19 55044188 : }
20 : }
21 :
22 : pub(crate) trait UsizeIsU64 {
23 : fn into_u64(self) -> u64;
24 : }
25 :
26 : impl UsizeIsU64 for usize {
27 : #[inline(always)]
28 71552577 : fn into_u64(self) -> u64 {
29 71552577 : #[allow(clippy::let_unit_value)]
30 71552577 : let _ = _ASSERT_U64_EQ_USIZE;
31 71552577 : self as u64
32 71552577 : }
33 : }
34 :
35 618 : pub const fn u64_to_usize(x: u64) -> usize {
36 618 : #[allow(clippy::let_unit_value)]
37 618 : let _ = _ASSERT_U64_EQ_USIZE;
38 618 : x as usize
39 618 : }
|