mirror of https://github.com/torvalds/linux.git
93 lines
2.6 KiB
Rust
93 lines
2.6 KiB
Rust
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
//! Formatting utilities.
|
|
//!
|
|
//! This module is intended to be used in place of `core::fmt` in kernel code.
|
|
|
|
pub use core::fmt::{Arguments, Debug, Error, Formatter, Result, Write};
|
|
|
|
/// Internal adapter used to route allow implementations of formatting traits for foreign types.
|
|
///
|
|
/// It is inserted automatically by the [`fmt!`] macro and is not meant to be used directly.
|
|
///
|
|
/// [`fmt!`]: crate::prelude::fmt!
|
|
#[doc(hidden)]
|
|
pub struct Adapter<T>(pub T);
|
|
|
|
macro_rules! impl_fmt_adapter_forward {
|
|
($($trait:ident),* $(,)?) => {
|
|
$(
|
|
impl<T: $trait> $trait for Adapter<T> {
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
|
|
let Self(t) = self;
|
|
$trait::fmt(t, f)
|
|
}
|
|
}
|
|
)*
|
|
};
|
|
}
|
|
|
|
use core::fmt::{Binary, LowerExp, LowerHex, Octal, Pointer, UpperExp, UpperHex};
|
|
impl_fmt_adapter_forward!(Debug, LowerHex, UpperHex, Octal, Binary, Pointer, LowerExp, UpperExp);
|
|
|
|
/// A copy of [`core::fmt::Display`] that allows us to implement it for foreign types.
|
|
///
|
|
/// Types should implement this trait rather than [`core::fmt::Display`]. Together with the
|
|
/// [`Adapter`] type and [`fmt!`] macro, it allows for formatting foreign types (e.g. types from
|
|
/// core) which do not implement [`core::fmt::Display`] directly.
|
|
///
|
|
/// [`fmt!`]: crate::prelude::fmt!
|
|
pub trait Display {
|
|
/// Same as [`core::fmt::Display::fmt`].
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> Result;
|
|
}
|
|
|
|
impl<T: ?Sized + Display> Display for &T {
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
|
|
Display::fmt(*self, f)
|
|
}
|
|
}
|
|
|
|
impl<T: ?Sized + Display> core::fmt::Display for Adapter<&T> {
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
|
|
let Self(t) = self;
|
|
Display::fmt(t, f)
|
|
}
|
|
}
|
|
|
|
macro_rules! impl_display_forward {
|
|
($(
|
|
$( { $($generics:tt)* } )? $ty:ty $( { where $($where:tt)* } )?
|
|
),* $(,)?) => {
|
|
$(
|
|
impl$($($generics)*)? Display for $ty $(where $($where)*)? {
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
|
|
core::fmt::Display::fmt(self, f)
|
|
}
|
|
}
|
|
)*
|
|
};
|
|
}
|
|
|
|
impl_display_forward!(
|
|
bool,
|
|
char,
|
|
core::panic::PanicInfo<'_>,
|
|
Arguments<'_>,
|
|
i128,
|
|
i16,
|
|
i32,
|
|
i64,
|
|
i8,
|
|
isize,
|
|
str,
|
|
u128,
|
|
u16,
|
|
u32,
|
|
u64,
|
|
u8,
|
|
usize,
|
|
{<T: ?Sized>} crate::sync::Arc<T> {where crate::sync::Arc<T>: core::fmt::Display},
|
|
{<T: ?Sized>} crate::sync::UniqueArc<T> {where crate::sync::UniqueArc<T>: core::fmt::Display},
|
|
);
|