1use crate::error::Error;
46
47#[doc(inline)]
48pub use rune_alloc_macros::TryClone;
49
50pub trait TryClone: Sized {
52 fn try_clone(&self) -> Result<Self, Error>;
54
55 #[inline]
61 fn try_clone_from(&mut self, source: &Self) -> Result<(), Error> {
62 *self = source.try_clone()?;
63 Ok(())
64 }
65}
66
67#[cfg_attr(rune_nightly, rustc_specialization_trait)]
69pub trait TryCopy: TryClone {}
70
71impl<T: ?Sized> TryClone for &T {
72 fn try_clone(&self) -> Result<Self, Error> {
73 Ok(*self)
74 }
75}
76
77macro_rules! impl_tuple {
78 ($count:expr $(, $ty:ident $var:ident $num:expr)*) => {
79 impl<$($ty,)*> TryClone for ($($ty,)*) where $($ty: TryClone,)* {
80 #[inline]
81 fn try_clone(&self) -> Result<Self, Error> {
82 let ($($var,)*) = self;
83 Ok(($($var.try_clone()?,)*))
84 }
85 }
86 }
87}
88
89repeat_macro!(impl_tuple);
90
91macro_rules! impl_copy {
92 ($ty:ty) => {
93 impl TryClone for $ty {
94 #[inline]
95 fn try_clone(&self) -> Result<Self, Error> {
96 Ok(*self)
97 }
98 }
99
100 impl TryCopy for $ty {}
101 };
102}
103
104impl_copy!(char);
105impl_copy!(bool);
106impl_copy!(usize);
107impl_copy!(isize);
108impl_copy!(u8);
109impl_copy!(u16);
110impl_copy!(u32);
111impl_copy!(u64);
112impl_copy!(u128);
113impl_copy!(i8);
114impl_copy!(i16);
115impl_copy!(i32);
116impl_copy!(i64);
117impl_copy!(i128);
118impl_copy!(f32);
119impl_copy!(f64);
120
121impl_copy!(::core::num::NonZeroUsize);
122impl_copy!(::core::num::NonZeroIsize);
123impl_copy!(::core::num::NonZeroU8);
124impl_copy!(::core::num::NonZeroU16);
125impl_copy!(::core::num::NonZeroU32);
126impl_copy!(::core::num::NonZeroU64);
127impl_copy!(::core::num::NonZeroU128);
128impl_copy!(::core::num::NonZeroI8);
129impl_copy!(::core::num::NonZeroI16);
130impl_copy!(::core::num::NonZeroI32);
131impl_copy!(::core::num::NonZeroI64);
132impl_copy!(::core::num::NonZeroI128);
133
134impl<T, E> TryClone for ::core::result::Result<T, E>
135where
136 T: TryClone,
137 E: TryClone,
138{
139 #[inline]
140 fn try_clone(&self) -> Result<Self, Error> {
141 Ok(match self {
142 Ok(value) => Ok(value.try_clone()?),
143 Err(value) => Err(value.try_clone()?),
144 })
145 }
146}
147
148impl<T> TryClone for ::core::option::Option<T>
149where
150 T: TryClone,
151{
152 #[inline]
153 fn try_clone(&self) -> Result<Self, Error> {
154 Ok(match self {
155 Some(value) => Some(value.try_clone()?),
156 None => None,
157 })
158 }
159}
160
161#[cfg(feature = "alloc")]
162impl<T: ?Sized> TryClone for ::rust_alloc::sync::Arc<T> {
163 fn try_clone(&self) -> Result<Self, Error> {
164 Ok(self.clone())
165 }
166}
167
168#[cfg(feature = "alloc")]
169impl<T: ?Sized> TryClone for ::rust_alloc::rc::Rc<T> {
170 fn try_clone(&self) -> Result<Self, Error> {
171 Ok(self.clone())
172 }
173}
174
175#[cfg(feature = "alloc")]
176impl<T> TryClone for ::rust_alloc::boxed::Box<T>
177where
178 T: TryClone,
179{
180 fn try_clone(&self) -> Result<Self, Error> {
181 Ok(::rust_alloc::boxed::Box::new(self.as_ref().try_clone()?))
182 }
183}
184
185#[cfg(feature = "alloc")]
186impl<T> TryClone for ::rust_alloc::boxed::Box<[T]>
187where
188 T: TryClone,
189{
190 fn try_clone(&self) -> Result<Self, Error> {
191 let mut out = ::rust_alloc::vec::Vec::with_capacity(self.len());
193
194 for value in self.iter() {
195 out.push(value.try_clone()?);
196 }
197
198 Ok(out.into())
199 }
200}
201
202#[cfg(feature = "alloc")]
203impl TryClone for ::rust_alloc::string::String {
204 #[inline]
205 fn try_clone(&self) -> Result<Self, Error> {
206 Ok(self.clone())
208 }
209}
210
211#[cfg(all(test, feature = "alloc"))]
212impl<T> TryClone for ::rust_alloc::vec::Vec<T>
213where
214 T: TryClone,
215{
216 #[inline]
217 fn try_clone(&self) -> Result<Self, Error> {
218 let mut out = ::rust_alloc::vec::Vec::with_capacity(self.len());
219
220 for value in self {
221 out.push(value.try_clone()?);
222 }
223
224 Ok(out)
225 }
226}
227
228impl TryClone for crate::path::PathBuf {
229 fn try_clone(&self) -> Result<Self, Error> {
230 Ok(self.clone())
231 }
232}