mirror of
https://github.com/rust-lang/rust-analyzer.git
synced 2025-11-18 03:13:31 +00:00
Make niches into nices
This commit is contained in:
parent
2cd26fd9f5
commit
57bd824b5a
2 changed files with 96 additions and 2 deletions
|
|
@ -1082,9 +1082,21 @@ fn render_memory_layout(
|
|||
|
||||
if config.niches {
|
||||
if let Some(niches) = layout.niches() {
|
||||
if niches > 1024 {
|
||||
if is_pwr2(niches) {
|
||||
format_to!(label, "niches = 2{}, ", pwr2_to_exponent(niches));
|
||||
} else if is_pwr2plus1(niches) {
|
||||
format_to!(label, "niches = 2{} + 1, ", pwr2_to_exponent(niches - 1));
|
||||
} else if is_pwr2minus1(niches) {
|
||||
format_to!(label, "niches = 2{} - 1, ", pwr2_to_exponent(niches + 1));
|
||||
} else {
|
||||
format_to!(label, "niches = really rather quite large, ");
|
||||
}
|
||||
} else {
|
||||
format_to!(label, "niches = {niches}, ");
|
||||
}
|
||||
}
|
||||
}
|
||||
label.pop(); // ' '
|
||||
label.pop(); // ','
|
||||
Some(label)
|
||||
|
|
@ -1210,3 +1222,85 @@ fn render_dyn_compatibility(
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn is_pwr2(val: u128) -> bool {
|
||||
val.count_ones() == 1
|
||||
}
|
||||
|
||||
fn is_pwr2minus1(val: u128) -> bool {
|
||||
val == u128::MAX || (val + 1).count_ones() == 1
|
||||
}
|
||||
|
||||
fn is_pwr2plus1(val: u128) -> bool {
|
||||
val != 0 && (val - 1).count_ones() == 1
|
||||
}
|
||||
|
||||
fn pwr2_to_exponent(num: u128) -> String {
|
||||
const DIGITS: [char; 10] = ['⁰', '¹', '²', '³', '⁴', '⁵', '⁶', '⁷', '⁸', '⁹'];
|
||||
(127 - num.leading_zeros())
|
||||
.to_string()
|
||||
.chars()
|
||||
.map(|c| c.to_digit(10).unwrap() as usize)
|
||||
.map(|idx| DIGITS[idx])
|
||||
.collect::<String>()
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
const TESTERS: [u128; 10] = [0, 1, 2, 3, 4, 255, 256, 257, u128::MAX - 1, u128::MAX];
|
||||
|
||||
#[test]
|
||||
fn test_is_pwr2() {
|
||||
const OUTCOMES: [bool; 10] =
|
||||
[false, true, true, false, true, false, true, false, false, false];
|
||||
for (test, expected) in TESTERS.iter().zip(OUTCOMES) {
|
||||
let actual = is_pwr2(*test);
|
||||
assert_eq!(actual, expected, "is_pwr2({test}) gave {actual}, expected {expected}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_pwr2minus1() {
|
||||
const OUTCOMES: [bool; 10] =
|
||||
[true, true, false, true, false, true, false, false, false, true];
|
||||
for (test, expected) in TESTERS.iter().zip(OUTCOMES) {
|
||||
let actual = is_pwr2minus1(*test);
|
||||
assert_eq!(actual, expected, "is_pwr2minu1({test}) gave {actual}, expected {expected}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_is_pwr2plus1() {
|
||||
const OUTCOMES: [bool; 10] =
|
||||
[false, false, true, true, false, false, false, true, false, false];
|
||||
for (test, expected) in TESTERS.iter().zip(OUTCOMES) {
|
||||
let actual = is_pwr2plus1(*test);
|
||||
assert_eq!(actual, expected, "is_pwr2plus1({test}) gave {actual}, expected {expected}");
|
||||
}
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_pwr2_to_exponent() {
|
||||
const TESTERS: [u128; 9] = [
|
||||
1,
|
||||
2,
|
||||
4,
|
||||
8,
|
||||
16,
|
||||
9223372036854775808,
|
||||
18446744073709551616,
|
||||
36893488147419103232,
|
||||
170141183460469231731687303715884105728,
|
||||
];
|
||||
const OUTCOMES: [&str; 9] = ["⁰", "¹", "²", "³", "⁴", "⁶³", "⁶⁴", "⁶⁵", "¹²⁷"];
|
||||
for (test, expected) in TESTERS.iter().zip(OUTCOMES) {
|
||||
let actual = pwr2_to_exponent(*test);
|
||||
assert_eq!(
|
||||
actual, expected,
|
||||
"pwr2_to_exponent({test}) returned {actual}, expected {expected}",
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1357,7 +1357,7 @@ fn hover_enum_limit() {
|
|||
|
||||
---
|
||||
|
||||
size = 12 (0xC), align = 4, niches = 4294967288
|
||||
size = 12 (0xC), align = 4, niches = really rather quite large
|
||||
"#]],
|
||||
);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue