projects/linux·blob v7.2 · refs

107 lines · 2.6 KiB

1// SPDX-License-Identifier: GPL-2.0
2
3//! Formatting utilities.
4//!
5//! This module is intended to be used in place of `core::fmt` in kernel code.
6
7pub use core::fmt::{
8 Arguments,
9 Debug,
10 Error,
11 Formatter,
12 Result,
13 Write, //
14};
15
16/// Internal adapter used to route and allow implementations of formatting traits for foreign types.
17///
18/// It is inserted automatically by the [`fmt!`] macro and is not meant to be used directly.
19///
20/// [`fmt!`]: crate::prelude::fmt!
21#[doc(hidden)]
22pub struct Adapter<T>(pub T);
23
24macro_rules! impl_fmt_adapter_forward {
25 ($($trait:ident),* $(,)?) => {
26 $(
27 impl<T: $trait> $trait for Adapter<T> {
28 fn fmt(&self, f: &mut Formatter<'_>) -> Result {
29 let Self(t) = self;
30 $trait::fmt(t, f)
31 }
32 }
33 )*
34 };
35}
36
37use core::fmt::{
38 Binary,
39 LowerExp,
40 LowerHex,
41 Octal,
42 Pointer,
43 UpperExp,
44 UpperHex, //
45};
46impl_fmt_adapter_forward!(Debug, LowerHex, UpperHex, Octal, Binary, Pointer, LowerExp, UpperExp);
47
48/// A copy of [`core::fmt::Display`] that allows us to implement it for foreign types.
49///
50/// Types should implement this trait rather than [`core::fmt::Display`]. Together with the
51/// [`Adapter`] type and [`fmt!`] macro, it allows for formatting foreign types (e.g. types from
52/// core) which do not implement [`core::fmt::Display`] directly.
53///
54/// [`fmt!`]: crate::prelude::fmt!
55pub trait Display {
56 /// Same as [`core::fmt::Display::fmt`].
57 fn fmt(&self, f: &mut Formatter<'_>) -> Result;
58}
59
60impl<T: ?Sized + Display> Display for &T {
61 fn fmt(&self, f: &mut Formatter<'_>) -> Result {
62 Display::fmt(*self, f)
63 }
64}
65
66impl<T: ?Sized + Display> core::fmt::Display for Adapter<&T> {
67 fn fmt(&self, f: &mut Formatter<'_>) -> Result {
68 let Self(t) = self;
69 Display::fmt(t, f)
70 }
71}
72
73macro_rules! impl_display_forward {
74 ($(
75 $( { $($generics:tt)* } )? $ty:ty $( { where $($where:tt)* } )?
76 ),* $(,)?) => {
77 $(
78 impl$($($generics)*)? Display for $ty $(where $($where)*)? {
79 fn fmt(&self, f: &mut Formatter<'_>) -> Result {
80 core::fmt::Display::fmt(self, f)
81 }
82 }
83 )*
84 };
85}
86
87impl_display_forward!(
88 bool,
89 char,
90 core::panic::PanicInfo<'_>,
91 Arguments<'_>,
92 i128,
93 i16,
94 i32,
95 i64,
96 i8,
97 isize,
98 str,
99 u128,
100 u16,
101 u32,
102 u64,
103 u8,
104 usize,
105 {<T: ?Sized>} crate::sync::Arc<T> {where crate::sync::Arc<T>: core::fmt::Display},
106 {<T: ?Sized>} crate::sync::UniqueArc<T> {where crate::sync::UniqueArc<T>: core::fmt::Display},
107);