Add CxxVector::pop in Rust
diff --git a/src/cxx_vector.rs b/src/cxx_vector.rs
index 23f7621..cc7a777 100644
--- a/src/cxx_vector.rs
+++ b/src/cxx_vector.rs
@@ -8,7 +8,7 @@
use core::fmt::{self, Debug};
use core::iter::FusedIterator;
use core::marker::{PhantomData, PhantomPinned};
-use core::mem::{self, ManuallyDrop};
+use core::mem::{self, ManuallyDrop, MaybeUninit};
use core::pin::Pin;
use core::ptr;
use core::slice;
@@ -162,6 +162,21 @@
T::__push_back(self, &mut value);
}
}
+
+ pub fn pop(self: Pin<&mut Self>) -> Option<T>
+ where
+ T: ExternType<Kind = Trivial>,
+ {
+ if self.is_empty() {
+ None
+ } else {
+ let mut value = MaybeUninit::uninit();
+ Some(unsafe {
+ T::__pop_back(self, &mut value);
+ value.assume_init()
+ })
+ }
+ }
}
/// Iterator over elements of a `CxxVector` by shared reference.
@@ -320,6 +335,14 @@
unreachable!()
}
#[doc(hidden)]
+ unsafe fn __pop_back(v: Pin<&mut CxxVector<Self>>, out: &mut MaybeUninit<Self>) {
+ // Opaque C type vector elements do not get this method because they can
+ // never exist by value on the Rust side of the bridge.
+ let _ = v;
+ let _ = out;
+ unreachable!()
+ }
+ #[doc(hidden)]
fn __unique_ptr_null() -> *mut c_void;
#[doc(hidden)]
unsafe fn __unique_ptr_raw(raw: *mut CxxVector<Self>) -> *mut c_void;
@@ -331,7 +354,7 @@
unsafe fn __unique_ptr_drop(repr: *mut c_void);
}
-macro_rules! vector_element_push_back {
+macro_rules! vector_element_by_value_methods {
(opaque, $segment:expr, $ty:ty) => {};
(trivial, $segment:expr, $ty:ty) => {
#[doc(hidden)]
@@ -344,6 +367,16 @@
}
__push_back(v, value);
}
+ #[doc(hidden)]
+ unsafe fn __pop_back(v: Pin<&mut CxxVector<$ty>>, out: &mut MaybeUninit<$ty>) {
+ extern "C" {
+ attr! {
+ #[link_name = concat!("cxxbridge1$std$vector$", $segment, "$pop_back")]
+ fn __pop_back(_: Pin<&mut CxxVector<$ty>>, _: &mut MaybeUninit<$ty>);
+ }
+ }
+ __pop_back(v, out);
+ }
};
}
@@ -376,7 +409,7 @@
}
__get_unchecked(v, pos)
}
- vector_element_push_back!($kind, $segment, $ty);
+ vector_element_by_value_methods!($kind, $segment, $ty);
#[doc(hidden)]
fn __unique_ptr_null() -> *mut c_void {
extern "C" {