kernel/debugfs/
callback_adapters.rs1use super::{
8 Reader,
9 Writer, };
11
12use crate::{
13 fmt,
14 prelude::*,
15 uaccess::UserSliceReader, };
17
18use core::{
19 marker::PhantomData,
20 ops::Deref, };
22
23pub(crate) unsafe trait Adapter {
28 type Inner;
29}
30
31#[repr(transparent)]
40pub(crate) struct WritableAdapter<D, W> {
41 inner: D,
42 _writer: PhantomData<W>,
43}
44
45unsafe impl<D, W> Adapter for WritableAdapter<D, W> {
47 type Inner = D;
48}
49
50impl<D: Writer, W> Writer for WritableAdapter<D, W> {
51 fn write(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
52 self.inner.write(fmt)
53 }
54}
55
56impl<D: Deref, W> Reader for WritableAdapter<D, W>
57where
58 W: Fn(&D::Target, &mut UserSliceReader) -> Result + Send + Sync + 'static,
59{
60 fn read_from_slice(&self, reader: &mut UserSliceReader) -> Result {
61 let w: &W = unsafe { materialize_zst() };
63 w(self.inner.deref(), reader)
64 }
65}
66
67#[repr(transparent)]
73pub(crate) struct FormatAdapter<D, F> {
74 inner: D,
75 _formatter: PhantomData<F>,
76}
77
78impl<D, F> Deref for FormatAdapter<D, F> {
79 type Target = D;
80 fn deref(&self) -> &D {
81 &self.inner
82 }
83}
84
85impl<D, F> Writer for FormatAdapter<D, F>
86where
87 F: Fn(&D, &mut fmt::Formatter<'_>) -> fmt::Result + 'static,
88{
89 fn write(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
90 let f: &F = unsafe { materialize_zst() };
92 f(&self.inner, fmt)
93 }
94}
95
96unsafe impl<D, F> Adapter for FormatAdapter<D, F> {
98 type Inner = D;
99}
100
101#[repr(transparent)]
102pub(crate) struct NoWriter<D> {
103 inner: D,
104}
105
106unsafe impl<D> Adapter for NoWriter<D> {
108 type Inner = D;
109}
110
111impl<D> Deref for NoWriter<D> {
112 type Target = D;
113 fn deref(&self) -> &D {
114 &self.inner
115 }
116}
117
118unsafe fn materialize_zst<F>() -> &'static F {
124 const { assert!(core::mem::size_of::<F>() == 0) };
125 let zst_dangle: core::ptr::NonNull<F> = core::ptr::NonNull::dangling();
126 unsafe { zst_dangle.as_ref() }
130}