From bb1cc93797b8e8ef509b91d5af691c934b20fd59 Mon Sep 17 00:00:00 2001 From: Joseph Perez Date: Sun, 29 Oct 2023 08:28:39 +0100 Subject: [PATCH 1/3] feat: add `take` and `into_inner` methods to `GILOnceCell` --- src/sync.rs | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/sync.rs b/src/sync.rs index 50bb80da2a3..7f7e11c9ae7 100644 --- a/src/sync.rs +++ b/src/sync.rs @@ -167,6 +167,20 @@ impl GILOnceCell { *inner = Some(value); Ok(()) } + + /// Takes the value out of the cell, moving it back to an uninitialized state. + /// + /// Has no effect and returns None if the cell has not yet been written. + pub fn take(&mut self) -> Option { + self.0.get_mut().take() + } + + /// Consumes the cell, returning the wrapped value. + /// + /// Returns None if the cell has not yet been written. + pub fn into_inner(self) -> Option { + self.0.into_inner() + } } impl GILOnceCell> { @@ -278,7 +292,7 @@ mod tests { #[test] fn test_once_cell() { Python::with_gil(|py| { - let cell = GILOnceCell::new(); + let mut cell = GILOnceCell::new(); assert!(cell.get(py).is_none()); @@ -289,6 +303,9 @@ mod tests { assert_eq!(cell.get(py), Some(&2)); assert_eq!(cell.get_or_try_init(py, || Err(5)), Ok(&2)); + + assert_eq!(cell.take(), Some(2)); + assert_eq!(cell.into_inner(), None) }) } } From 1fd4090bd4c3bc0b5f37544be994cbdd10f31737 Mon Sep 17 00:00:00 2001 From: Joseph Perez Date: Sun, 29 Oct 2023 13:50:36 +0100 Subject: [PATCH 2/3] refactor: remove useless `unsafe` in `get_mut` --- src/sync.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/sync.rs b/src/sync.rs index 7f7e11c9ae7..8500413ef97 100644 --- a/src/sync.rs +++ b/src/sync.rs @@ -149,8 +149,7 @@ impl GILOnceCell { /// Get the contents of the cell mutably. This is only possible if the reference to the cell is /// unique. pub fn get_mut(&mut self) -> Option<&mut T> { - // Safe because we have &mut self - unsafe { &mut *self.0.get() }.as_mut() + self.0.get_mut().as_mut() } /// Set the value in the cell. From f9107191f55da9392b6de9dba4d4c1d841e1d7fa Mon Sep 17 00:00:00 2001 From: Joseph Perez Date: Sun, 29 Oct 2023 13:54:10 +0100 Subject: [PATCH 3/3] docs: add newsfragment --- newsfragments/3556.added.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 newsfragments/3556.added.md diff --git a/newsfragments/3556.added.md b/newsfragments/3556.added.md new file mode 100644 index 00000000000..014908a1bf5 --- /dev/null +++ b/newsfragments/3556.added.md @@ -0,0 +1 @@ +Add `take` and `into_inner` methods to `GILOnceCell` \ No newline at end of file