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