snafu/
boxed_impls.rs

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