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