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}