kernel/debugfs/
callback_adapters.rs1use super::{Reader, Writer};
8use crate::prelude::*;
9use crate::uaccess::UserSliceReader;
10use core::fmt;
11use core::fmt::Formatter;
12use core::marker::PhantomData;
13use core::ops::Deref;
14
15pub(crate) unsafe trait Adapter {
20 type Inner;
21}
22
23#[repr(transparent)]
32pub(crate) struct WritableAdapter<D, W> {
33 inner: D,
34 _writer: PhantomData<W>,
35}
36
37unsafe impl<D, W> Adapter for WritableAdapter<D, W> {
39 type Inner = D;
40}
41
42impl<D: Writer, W> Writer for WritableAdapter<D, W> {
43 fn write(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
44 self.inner.write(fmt)
45 }
46}
47
48impl<D: Deref, W> Reader for WritableAdapter<D, W>
49where
50 W: Fn(&D::Target, &mut UserSliceReader) -> Result + Send + Sync + 'static,
51{
52 fn read_from_slice(&self, reader: &mut UserSliceReader) -> Result {
53 let w: &W = unsafe { materialize_zst() };
55 w(self.inner.deref(), reader)
56 }
57}
58
59#[repr(transparent)]
65pub(crate) struct FormatAdapter<D, F> {
66 inner: D,
67 _formatter: PhantomData<F>,
68}
69
70impl<D, F> Deref for FormatAdapter<D, F> {
71 type Target = D;
72 fn deref(&self) -> &D {
73 &self.inner
74 }
75}
76
77impl<D, F> Writer for FormatAdapter<D, F>
78where
79 F: Fn(&D, &mut Formatter<'_>) -> fmt::Result + 'static,
80{
81 fn write(&self, fmt: &mut Formatter<'_>) -> fmt::Result {
82 let f: &F = unsafe { materialize_zst() };
84 f(&self.inner, fmt)
85 }
86}
87
88unsafe impl<D, F> Adapter for FormatAdapter<D, F> {
90 type Inner = D;
91}
92
93#[repr(transparent)]
94pub(crate) struct NoWriter<D> {
95 inner: D,
96}
97
98unsafe impl<D> Adapter for NoWriter<D> {
100 type Inner = D;
101}
102
103impl<D> Deref for NoWriter<D> {
104 type Target = D;
105 fn deref(&self) -> &D {
106 &self.inner
107 }
108}
109
110unsafe fn materialize_zst<F>() -> &'static F {
116 const { assert!(core::mem::size_of::<F>() == 0) };
117 let zst_dangle: core::ptr::NonNull<F> = core::ptr::NonNull::dangling();
118 unsafe { zst_dangle.as_ref() }
122}