1use alloc::{boxed::Box, rc::Rc};
2
3#[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}