Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 76b8c3a

Browse files
fmt::DisplayInt abstraction obsolete with better macro
1 parent cc992d0 commit 76b8c3a

File tree

1 file changed

+58
-93
lines changed

1 file changed

+58
-93
lines changed

‎library/core/src/fmt/num.rs‎

Lines changed: 58 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -3,35 +3,8 @@
33
use crate::fmt::NumBuffer;
44
use crate::mem::MaybeUninit;
55
use crate::num::fmt as numfmt;
6-
use crate::ops::{Div, Rem, Sub};
76
use crate::{fmt, ptr, slice, str};
87

9-
#[doc(hidden)]
10-
trait DisplayInt:
11-
PartialEq + PartialOrd + Div<Output = Self> + Rem<Output = Self> + Sub<Output = Self> + Copy
12-
{
13-
#[cfg(not(any(target_pointer_width = "64", target_arch = "wasm32")))]
14-
fn to_u32(&self) -> u32;
15-
fn to_u64(&self) -> u64;
16-
fn to_u128(&self) -> u128;
17-
}
18-
19-
macro_rules! impl_int {
20-
($($t:ident)*) => (
21-
$(impl DisplayInt for $t {
22-
#[cfg(not(any(target_pointer_width = "64", target_arch = "wasm32")))]
23-
fn to_u32(&self) -> u32 { *self as u32 }
24-
fn to_u64(&self) -> u64 { *self as u64 }
25-
fn to_u128(&self) -> u128 { *self as u128 }
26-
})*
27-
)
28-
}
29-
30-
impl_int! {
31-
i8 i16 i32 i64 i128 isize
32-
u8 u16 u32 u64 u128 usize
33-
}
34-
358
// Formatting of integers with a non-decimal radix.
369
macro_rules! radix_integer {
3710
(fmt::$Trait:ident for $Signed:ident and $Unsigned:ident, $prefix:expr, $dig_tab:expr) => {
@@ -150,49 +123,49 @@ unsafe fn slice_buffer_to_str(buf: &[MaybeUninit<u8>], offset: usize) -> &str {
150123
}
151124

152125
macro_rules! impl_Display {
153-
($($signed:ident, $unsigned:ident,)* ; as $u:ident via $conv_fn:ident named $gen_name:ident) => {
126+
($($Signed:ident, $Unsigned:ident),* ; as $T:ident into $fmt_fn:ident) => {
154127

155128
$(
156129
#[stable(feature = "rust1", since = "1.0.0")]
157-
impl fmt::Display for $unsigned {
130+
impl fmt::Display for $Unsigned {
158131
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
159132
#[cfg(not(feature = "optimize_for_size"))]
160133
{
161-
const MAX_DEC_N: usize = $unsigned::MAX.ilog10() as usize + 1;
162-
// Buffer decimals for $unsigned with right alignment.
134+
const MAX_DEC_N: usize = $Unsigned::MAX.ilog10() as usize + 1;
135+
// Buffer decimals for self with right alignment.
163136
let mut buf = [MaybeUninit::<u8>::uninit(); MAX_DEC_N];
164137

165138
// SAFETY: `buf` is always big enough to contain all the digits.
166139
unsafe { f.pad_integral(true, "", self._fmt(&mut buf)) }
167140
}
168141
#[cfg(feature = "optimize_for_size")]
169142
{
170-
$gen_name(self.$conv_fn(), true, f)
143+
$fmt_fn(selfas $T, true, f)
171144
}
172145
}
173146
}
174147

175148
#[stable(feature = "rust1", since = "1.0.0")]
176-
impl fmt::Display for $signed {
149+
impl fmt::Display for $Signed {
177150
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
178151
#[cfg(not(feature = "optimize_for_size"))]
179152
{
180-
const MAX_DEC_N: usize = $unsigned::MAX.ilog10() as usize + 1;
181-
// Buffer decimals for $unsigned with right alignment.
153+
const MAX_DEC_N: usize = $Unsigned::MAX.ilog10() as usize + 1;
154+
// Buffer decimals for self with right alignment.
182155
let mut buf = [MaybeUninit::<u8>::uninit(); MAX_DEC_N];
183156

184157
// SAFETY: `buf` is always big enough to contain all the digits.
185158
unsafe { f.pad_integral(*self >= 0, "", self.unsigned_abs()._fmt(&mut buf)) }
186159
}
187160
#[cfg(feature = "optimize_for_size")]
188161
{
189-
return $gen_name(self.unsigned_abs().$conv_fn(), *self >= 0, f);
162+
return $fmt_fn(self.unsigned_abs()as $T, *self >= 0, f);
190163
}
191164
}
192165
}
193166

194167
#[cfg(not(feature = "optimize_for_size"))]
195-
impl $unsigned {
168+
impl $Unsigned {
196169
#[doc(hidden)]
197170
#[unstable(
198171
feature = "fmt_internals",
@@ -213,7 +186,7 @@ macro_rules! impl_Display {
213186
let mut remain = self;
214187

215188
// Format per four digits from the lookup table.
216-
// Four digits need a 16-bit $unsigned or wider.
189+
// Four digits need a 16-bit $Unsigned or wider.
217190
while size_of::<Self>() > 1 && remain > 999.try_into().expect("branch is not hit for types that cannot fit 999 (u8)") {
218191
// SAFETY: All of the decimals fit in buf due to MAX_DEC_N
219192
// and the while condition ensures at least 4 more decimals.
@@ -272,7 +245,7 @@ macro_rules! impl_Display {
272245
}
273246
}
274247

275-
impl $signed {
248+
impl $Signed {
276249
/// Allows users to write an integer (in signed decimal format) into a variable `buf` of
277250
/// type [`NumBuffer`] that is passed by the caller by mutable reference.
278251
///
@@ -282,15 +255,15 @@ macro_rules! impl_Display {
282255
/// #![feature(int_format_into)]
283256
/// use core::fmt::NumBuffer;
284257
///
285-
#[doc = concat!("let n = 0", stringify!($signed), ";")]
258+
#[doc = concat!("let n = 0", stringify!($Signed), ";")]
286259
/// let mut buf = NumBuffer::new();
287260
/// assert_eq!(n.format_into(&mut buf), "0");
288261
///
289-
#[doc = concat!("let n1 = 32", stringify!($signed), ";")]
262+
#[doc = concat!("let n1 = 32", stringify!($Signed), ";")]
290263
/// assert_eq!(n1.format_into(&mut buf), "32");
291264
///
292-
#[doc = concat!("let n2 = ", stringify!($signed::MAX), ";")]
293-
#[doc = concat!("assert_eq!(n2.format_into(&mut buf), ", stringify!($signed::MAX), ".to_string());")]
265+
#[doc = concat!("let n2 = ", stringify!($Signed::MAX), ";")]
266+
#[doc = concat!("assert_eq!(n2.format_into(&mut buf), ", stringify!($Signed::MAX), ".to_string());")]
294267
/// ```
295268
#[unstable(feature = "int_format_into", issue = "138215")]
296269
pub fn format_into(self, buf: &mut NumBuffer<Self>) -> &str {
@@ -303,7 +276,7 @@ macro_rules! impl_Display {
303276
}
304277
#[cfg(feature = "optimize_for_size")]
305278
{
306-
offset = _inner_slow_integer_to_str(self.unsigned_abs().$conv_fn(), &mut buf.buf);
279+
offset = _inner_slow_integer_to_str(self.unsigned_abs()as $T, &mut buf.buf);
307280
}
308281
// Only difference between signed and unsigned are these 4 lines.
309282
if self < 0 {
@@ -315,7 +288,7 @@ macro_rules! impl_Display {
315288
}
316289
}
317290

318-
impl $unsigned {
291+
impl $Unsigned {
319292
/// Allows users to write an integer (in signed decimal format) into a variable `buf` of
320293
/// type [`NumBuffer`] that is passed by the caller by mutable reference.
321294
///
@@ -325,15 +298,15 @@ macro_rules! impl_Display {
325298
/// #![feature(int_format_into)]
326299
/// use core::fmt::NumBuffer;
327300
///
328-
#[doc = concat!("let n = 0", stringify!($unsigned), ";")]
301+
#[doc = concat!("let n = 0", stringify!($Unsigned), ";")]
329302
/// let mut buf = NumBuffer::new();
330303
/// assert_eq!(n.format_into(&mut buf), "0");
331304
///
332-
#[doc = concat!("let n1 = 32", stringify!($unsigned), ";")]
305+
#[doc = concat!("let n1 = 32", stringify!($Unsigned), ";")]
333306
/// assert_eq!(n1.format_into(&mut buf), "32");
334307
///
335-
#[doc = concat!("let n2 = ", stringify!($unsigned::MAX), ";")]
336-
#[doc = concat!("assert_eq!(n2.format_into(&mut buf), ", stringify!($unsigned::MAX), ".to_string());")]
308+
#[doc = concat!("let n2 = ", stringify!($Unsigned::MAX), ";")]
309+
#[doc = concat!("assert_eq!(n2.format_into(&mut buf), ", stringify!($Unsigned::MAX), ".to_string());")]
337310
/// ```
338311
#[unstable(feature = "int_format_into", issue = "138215")]
339312
pub fn format_into(self, buf: &mut NumBuffer<Self>) -> &str {
@@ -346,7 +319,7 @@ macro_rules! impl_Display {
346319
}
347320
#[cfg(feature = "optimize_for_size")]
348321
{
349-
offset = _inner_slow_integer_to_str(self.$conv_fn(), &mut buf.buf);
322+
offset = _inner_slow_integer_to_str(*selfas $T, &mut buf.buf);
350323
}
351324
// SAFETY: Starting from `offset`, all elements of the slice have been set.
352325
unsafe { slice_buffer_to_str(&buf.buf, offset) }
@@ -357,7 +330,7 @@ macro_rules! impl_Display {
357330
)*
358331

359332
#[cfg(feature = "optimize_for_size")]
360-
fn _inner_slow_integer_to_str(mut n: $u, buf: &mut [MaybeUninit::<u8>]) -> usize {
333+
fn _inner_slow_integer_to_str(mut n: $T, buf: &mut [MaybeUninit::<u8>]) -> usize {
361334
let mut curr = buf.len();
362335

363336
// SAFETY: To show that it's OK to copy into `buf_ptr`, notice that at the beginning
@@ -378,8 +351,8 @@ macro_rules! impl_Display {
378351
}
379352

380353
#[cfg(feature = "optimize_for_size")]
381-
fn $gen_name(n: $u, is_nonnegative: bool, f: &mut fmt::Formatter<'_>) -> fmt::Result {
382-
const MAX_DEC_N: usize = $u::MAX.ilog(10) as usize + 1;
354+
fn $fmt_fn(n: $T, is_nonnegative: bool, f: &mut fmt::Formatter<'_>) -> fmt::Result {
355+
const MAX_DEC_N: usize = $T::MAX.ilog(10) as usize + 1;
383356
let mut buf = [MaybeUninit::<u8>::uninit(); MAX_DEC_N];
384357

385358
let offset = _inner_slow_integer_to_str(n, &mut buf);
@@ -391,9 +364,9 @@ macro_rules! impl_Display {
391364
}
392365

393366
macro_rules! impl_Exp {
394-
($($t:ident),*as $u:ident via $conv_fn:ident named $name:ident) => {
395-
fn $name(
396-
mut n: $u,
367+
($($Signed:ident, $Unsigned:ident),*;as $T:ident into $fmt_fn:ident) => {
368+
fn $fmt_fn(
369+
mut n: $T,
397370
is_nonnegative: bool,
398371
upper: bool,
399372
f: &mut fmt::Formatter<'_>
@@ -527,32 +500,41 @@ macro_rules! impl_Exp {
527500

528501
$(
529502
#[stable(feature = "integer_exp_format", since = "1.42.0")]
530-
impl fmt::LowerExp for $t {
531-
#[allow(unused_comparisons)]
503+
impl fmt::LowerExp for $Signed {
532504
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
533505
let is_nonnegative = *self >= 0;
534506
let n = if is_nonnegative {
535-
self.$conv_fn()
507+
*selfas $T
536508
} else {
537-
// convert the negative num to positive by summing 1 to its 2s complement
538-
(!self.$conv_fn()).wrapping_add(1)
509+
self.unsigned_abs() as $T
539510
};
540-
$name(n, is_nonnegative, false, f)
511+
$fmt_fn(n, is_nonnegative, false, f)
512+
}
513+
}
514+
#[stable(feature = "integer_exp_format", since = "1.42.0")]
515+
impl fmt::LowerExp for $Unsigned {
516+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
517+
$fmt_fn(*self as $T, true, false, f)
541518
}
542519
})*
520+
543521
$(
544522
#[stable(feature = "integer_exp_format", since = "1.42.0")]
545-
impl fmt::UpperExp for $t {
546-
#[allow(unused_comparisons)]
523+
impl fmt::UpperExp for $Signed {
547524
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
548525
let is_nonnegative = *self >= 0;
549526
let n = if is_nonnegative {
550-
self.$conv_fn()
527+
*selfas $T
551528
} else {
552-
// convert the negative num to positive by summing 1 to its 2s complement
553-
(!self.$conv_fn()).wrapping_add(1)
529+
self.unsigned_abs() as $T
554530
};
555-
$name(n, is_nonnegative, true, f)
531+
$fmt_fn(n, is_nonnegative, true, f)
532+
}
533+
}
534+
#[stable(feature = "integer_exp_format", since = "1.42.0")]
535+
impl fmt::UpperExp for $Unsigned {
536+
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
537+
$fmt_fn(*self as $T, true, true, f)
556538
}
557539
})*
558540
};
@@ -568,37 +550,20 @@ impl_Debug! {
568550
#[cfg(any(target_pointer_width = "64", target_arch = "wasm32"))]
569551
mod imp {
570552
use super::*;
571-
impl_Display!(
572-
i8, u8,
573-
i16, u16,
574-
i32, u32,
575-
i64, u64,
576-
isize, usize,
577-
; as u64 via to_u64 named fmt_u64
578-
);
579-
impl_Exp!(
580-
i8, u8, i16, u16, i32, u32, i64, u64, usize, isize
581-
as u64 via to_u64 named exp_u64
582-
);
553+
impl_Display!(i8, u8, i16, u16, i32, u32, i64, u64, isize, usize; as u64 into fmt_u64);
554+
impl_Exp!(i8, u8, i16, u16, i32, u32, i64, u64, isize, usize; as u64 into exp_u64);
583555
}
584556

585557
#[cfg(not(any(target_pointer_width = "64", target_arch = "wasm32")))]
586558
mod imp {
587559
use super::*;
588-
impl_Display!(
589-
i8, u8,
590-
i16, u16,
591-
i32, u32,
592-
isize, usize,
593-
; as u32 via to_u32 named fmt_u32);
594-
impl_Display!(
595-
i64, u64,
596-
; as u64 via to_u64 named fmt_u64);
597-
598-
impl_Exp!(i8, u8, i16, u16, i32, u32, isize, usize as u32 via to_u32 named exp_u32);
599-
impl_Exp!(i64, u64 as u64 via to_u64 named exp_u64);
560+
impl_Display!(i8, u8, i16, u16, i32, u32, isize, usize; as u32 into fmt_u32);
561+
impl_Display!(i64, u64; as u64 into fmt_u64);
562+
563+
impl_Exp!(i8, u8, i16, u16, i32, u32, isize, usize; as u32 into exp_u32);
564+
impl_Exp!(i64, u64; as u64 into exp_u64);
600565
}
601-
impl_Exp!(i128, u128 as u128 via to_u128 named exp_u128);
566+
impl_Exp!(i128, u128; as u128 into exp_u128);
602567

603568
const U128_MAX_DEC_N: usize = u128::MAX.ilog10() as usize + 1;
604569

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /