mirror of
https://github.com/hinto-janai/cuprate.git
synced 2024-12-23 03:59:37 +00:00
59 lines
2 KiB
Rust
59 lines
2 KiB
Rust
|
//! Mapping of data types.
|
||
|
//!
|
||
|
//! This module provides functions solely for mapping data types into others, mostly similar ones.
|
||
|
//!
|
||
|
//! `#[no_std]` compatible.
|
||
|
|
||
|
//---------------------------------------------------------------------------------------------------- Use
|
||
|
|
||
|
//---------------------------------------------------------------------------------------------------- `(u64, u64) <-> u128`
|
||
|
/// Split a [`u128`] value into 2 64-bit values.
|
||
|
///
|
||
|
/// The tuple returned is `(low, high)` where `low` is the least significant
|
||
|
/// 64-bits of `number`, and `high` is the most significant.
|
||
|
///
|
||
|
/// Note that the output of this function are `u64` representations of _bits_, not numerical values.
|
||
|
///
|
||
|
/// See [`combine_low_high_bits_to_u128`] for the inverse function.
|
||
|
///
|
||
|
/// ```rust
|
||
|
/// # use cuprate_helper::map::*;
|
||
|
/// let value = u128::MAX - 1;
|
||
|
/// let low = u64::MAX - 1;
|
||
|
/// let high = u64::MAX;
|
||
|
///
|
||
|
/// assert_eq!(split_u128_into_low_high_bits(value), (low, high));
|
||
|
/// ```
|
||
|
#[inline]
|
||
|
pub const fn split_u128_into_low_high_bits(value: u128) -> (u64, u64) {
|
||
|
(value as u64, (value >> 64) as u64)
|
||
|
}
|
||
|
|
||
|
/// Combine 2 64-bit values into a single [`u128`] value.
|
||
|
///
|
||
|
/// The inputs:
|
||
|
/// - `low_bits` are the _least_ significant 64-bits of `cumulative_difficulty`
|
||
|
/// - `high_bits` are the _most_ significant 64-bits of `cumulative_difficulty`
|
||
|
///
|
||
|
/// Note that `low_bits` & `high_bits` should be `u64` representation of _bits_, not numerical values.
|
||
|
///
|
||
|
/// See [`split_u128_into_low_high_bits`] for the inverse function.
|
||
|
///
|
||
|
/// ```rust
|
||
|
/// # use cuprate_helper::map::*;
|
||
|
/// let value = u128::MAX - 1;
|
||
|
/// let low = u64::MAX - 1;
|
||
|
/// let high = u64::MAX;
|
||
|
///
|
||
|
/// assert_eq!(combine_low_high_bits_to_u128(low, high), value);
|
||
|
/// ```
|
||
|
#[inline]
|
||
|
pub const fn combine_low_high_bits_to_u128(low_bits: u64, high_bits: u64) -> u128 {
|
||
|
let res = (high_bits as u128) << 64;
|
||
|
res | (low_bits as u128)
|
||
|
}
|
||
|
|
||
|
//---------------------------------------------------------------------------------------------------- Tests
|
||
|
#[cfg(test)]
|
||
|
mod test {}
|