summaryrefslogtreecommitdiffstats
path: root/third_party/rust/fallible_collections/src/arc.rs
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 00:47:55 +0000
commit26a029d407be480d791972afb5975cf62c9360a6 (patch)
treef435a8308119effd964b339f76abb83a57c29483 /third_party/rust/fallible_collections/src/arc.rs
parentInitial commit. (diff)
downloadfirefox-26a029d407be480d791972afb5975cf62c9360a6.tar.xz
firefox-26a029d407be480d791972afb5975cf62c9360a6.zip
Adding upstream version 124.0.1.upstream/124.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/rust/fallible_collections/src/arc.rs')
-rw-r--r--third_party/rust/fallible_collections/src/arc.rs52
1 files changed, 52 insertions, 0 deletions
diff --git a/third_party/rust/fallible_collections/src/arc.rs b/third_party/rust/fallible_collections/src/arc.rs
new file mode 100644
index 0000000000..282b8e5555
--- /dev/null
+++ b/third_party/rust/fallible_collections/src/arc.rs
@@ -0,0 +1,52 @@
+//! Implement a Fallible Arc
+use super::FallibleBox;
+use super::TryClone;
+
+use crate::TryReserveError;
+use alloc::boxed::Box;
+use alloc::sync::Arc;
+
+/// trait to implement Fallible Arc
+#[deprecated(
+ since = "0.3.1",
+ note = "⚠️️️this function is not completely fallible, it can panic !, see [issue](https://github.com/vcombey/fallible_collections/issues/13). help wanted"
+)]
+pub trait FallibleArc<T> {
+ /// try creating a new Arc, returning a Result<Box<T>,
+ /// TryReserveError> if allocation failed
+ fn try_new(t: T) -> Result<Self, TryReserveError>
+ where
+ Self: Sized;
+}
+
+#[allow(deprecated)]
+impl<T> FallibleArc<T> for Arc<T> {
+ fn try_new(t: T) -> Result<Self, TryReserveError> {
+ // doesn't work as the inner variable of arc are also stocked in the box
+
+ let b = <Box<T> as FallibleBox<T>>::try_new(t)?;
+ Ok(Arc::from(b))
+ }
+}
+
+/// Just a TryClone boilerplate for Arc
+impl<T: ?Sized> TryClone for Arc<T> {
+ fn try_clone(&self) -> Result<Self, TryReserveError> {
+ Ok(self.clone())
+ }
+}
+
+#[cfg(test)]
+mod test {
+ #[test]
+ fn fallible_rc() {
+ use std::sync::Arc;
+
+ let mut x = Arc::new(3);
+ *Arc::get_mut(&mut x).unwrap() = 4;
+ assert_eq!(*x, 4);
+
+ let _y = Arc::clone(&x);
+ assert!(Arc::get_mut(&mut x).is_none());
+ }
+}