Skip to main content

snafu/
boxed_impls.rs

1use alloc::{boxed::Box, rc::Rc};
2
3#[cfg(target_has_atomic = "ptr")]
4use alloc::sync::Arc;
5
6use super::{AsBacktrace, Backtrace, ErrorCompat, GenerateImplicitData};
7
8impl<E> ErrorCompat for Box<E>
9where
10    E: ErrorCompat,
11{
12    fn backtrace(&self) -> Option<&Backtrace> {
13        (**self).backtrace()
14    }
15}
16
17impl<T> GenerateImplicitData for Box<T>
18where
19    T: GenerateImplicitData,
20{
21    #[track_caller]
22    fn generate() -> Self {
23        Box::new(T::generate())
24    }
25
26    #[track_caller]
27    fn generate_with_source(source: &dyn crate::Error) -> Self
28    where
29        Self: Sized,
30    {
31        Box::new(T::generate_with_source(source))
32    }
33}
34
35impl<T> GenerateImplicitData for Rc<T>
36where
37    T: GenerateImplicitData,
38{
39    #[track_caller]
40    fn generate() -> Self {
41        Rc::new(T::generate())
42    }
43
44    #[track_caller]
45    fn generate_with_source(source: &dyn crate::Error) -> Self
46    where
47        Self: Sized,
48    {
49        Rc::new(T::generate_with_source(source))
50    }
51}
52
53#[cfg(target_has_atomic = "ptr")]
54impl<T> GenerateImplicitData for Arc<T>
55where
56    T: GenerateImplicitData,
57{
58    #[track_caller]
59    fn generate() -> Self {
60        Arc::new(T::generate())
61    }
62
63    #[track_caller]
64    fn generate_with_source(source: &dyn crate::Error) -> Self
65    where
66        Self: Sized,
67    {
68        Arc::new(T::generate_with_source(source))
69    }
70}
71
72impl<T> AsBacktrace for Box<T>
73where
74    T: AsBacktrace,
75{
76    fn as_backtrace(&self) -> Option<&Backtrace> {
77        T::as_backtrace(self)
78    }
79}
80
81impl<T> AsBacktrace for Rc<T>
82where
83    T: AsBacktrace,
84{
85    fn as_backtrace(&self) -> Option<&Backtrace> {
86        T::as_backtrace(self)
87    }
88}
89
90#[cfg(target_has_atomic = "ptr")]
91impl<T> AsBacktrace for Arc<T>
92where
93    T: AsBacktrace,
94{
95    fn as_backtrace(&self) -> Option<&Backtrace> {
96        T::as_backtrace(self)
97    }
98}