#[cfg(any(not(target_endian = "big"), test))]
#[must_use]
fn parse_digits8_le(digits: [u8; 8]) -> u32 {
let chunk1 = u64::from_le_bytes(digits);
const LOWER_MASK_1: u64 = 0x0f_00_0f_00_0f_00_0f_00;
const UPPER_MASK_1: u64 = 0x00_0f_00_0f_00_0f_00_0f;
let chunk1_lower = (chunk1 & LOWER_MASK_1) >> 8;
let chunk1_upper = (chunk1 & UPPER_MASK_1) * 10;
let chunk2: u64 = chunk1_lower + chunk1_upper;
const LOWER_MASK_2: u64 = 0x00ff_0000_00ff_0000;
const UPPER_MASK_2: u64 = 0x0000_00ff_0000_00ff;
let chunk2_lower = (chunk2 & LOWER_MASK_2) >> 16;
let chunk2_upper = (chunk2 & UPPER_MASK_2) * 100;
let chunk3 = chunk2_lower + chunk2_upper;
(chunk3 >> 32) as u32 + (chunk3 as u32) * 10000
}
#[cfg(any(target_endian = "big", test))]
#[must_use]
fn parse_digits8_be(digits: [u8; 8]) -> u32 {
let chunk1 = u64::from_be_bytes(digits);
const LOWER_MASK_1: u64 = 0x00_0f_00_0f_00_0f_00_0f;
const UPPER_MASK_1: u64 = 0x0f_00_0f_00_0f_00_0f_00;
let chunk1_lower = chunk1 & LOWER_MASK_1;
let chunk1_upper = ((chunk1 & UPPER_MASK_1) >> 8) * 10;
let chunk2: u64 = chunk1_lower + chunk1_upper;
const LOWER_MASK_2: u64 = 0x0000_00ff_0000_00ff;
const UPPER_MASK_2: u64 = 0x00ff_0000_00ff_0000;
let chunk2_lower = chunk2 & LOWER_MASK_2;
let chunk2_upper = ((chunk2 & UPPER_MASK_2) >> 16) * 100;
let chunk3 = chunk2_lower + chunk2_upper;
(chunk3 >> 32) as u32 * 10000 + chunk3 as u32
}
#[inline]
#[must_use]
pub(crate) fn parse_digits8(digits: [u8; 8]) -> u32 {
#[cfg(not(target_endian = "big"))]
{
parse_digits8_le(digits)
}
#[cfg(target_endian = "big")]
{
parse_digits8_be(digits)
}
}
#[cfg(test)]
mod tests {
use super::*;
use core::convert::TryFrom;
fn as_digit8(s: &str) -> [u8; 8] {
TryFrom::try_from(s.as_bytes()).unwrap()
}
#[test]
fn digits8_le() {
assert_eq!(parse_digits8_le(as_digit8("00000000")), 00000000);
assert_eq!(parse_digits8_le(as_digit8("12345678")), 12345678);
assert_eq!(parse_digits8_le(as_digit8("87654321")), 87654321);
assert_eq!(parse_digits8_le(as_digit8("99999999")), 99999999);
}
#[test]
fn digits8_be() {
assert_eq!(parse_digits8_be(as_digit8("00000000")), 00000000);
assert_eq!(parse_digits8_be(as_digit8("12345678")), 12345678);
assert_eq!(parse_digits8_be(as_digit8("87654321")), 87654321);
assert_eq!(parse_digits8_be(as_digit8("99999999")), 99999999);
}
#[test]
fn digits8() {
assert_eq!(parse_digits8(as_digit8("00000000")), 00000000);
assert_eq!(parse_digits8(as_digit8("12345678")), 12345678);
assert_eq!(parse_digits8(as_digit8("87654321")), 87654321);
assert_eq!(parse_digits8(as_digit8("99999999")), 99999999);
}
}