Add CxxVector::as_slice -> &[T]
diff --git a/src/cxx_vector.rs b/src/cxx_vector.rs
index 78b8f20..3ab3193 100644
--- a/src/cxx_vector.rs
+++ b/src/cxx_vector.rs
@@ -4,6 +4,7 @@
use core::marker::PhantomData;
use core::mem;
use core::ptr;
+use core::slice;
/// Binding to C++ `std::vector<T, std::allocator<T>>`.
///
@@ -44,7 +45,7 @@
/// out of bounds.
pub fn get(&self, pos: usize) -> Option<&T> {
if pos < self.len() {
- Some(unsafe { T::__get_unchecked(self, pos) })
+ Some(unsafe { self.get_unchecked(pos) })
} else {
None
}
@@ -61,7 +62,18 @@
///
/// [operator_at]: https://en.cppreference.com/w/cpp/container/vector/operator_at
pub unsafe fn get_unchecked(&self, pos: usize) -> &T {
- T::__get_unchecked(self, pos)
+ &*T::__get_unchecked(self, pos)
+ }
+
+ /// Returns a slice to the underlying contiguous array of elements.
+ pub fn as_slice(&self) -> &[T] {
+ let len = self.len();
+ if len == 0 {
+ <&[T]>::default()
+ } else {
+ let ptr = unsafe { T::__get_unchecked(self, 0) };
+ unsafe { slice::from_raw_parts(ptr, len) }
+ }
}
}
@@ -122,7 +134,7 @@
pub unsafe trait VectorElement: Sized {
const __NAME: &'static dyn Display;
fn __vector_size(v: &CxxVector<Self>) -> usize;
- unsafe fn __get_unchecked(v: &CxxVector<Self>, pos: usize) -> &Self;
+ unsafe fn __get_unchecked(v: &CxxVector<Self>, pos: usize) -> *const Self;
fn __unique_ptr_null() -> *mut c_void;
unsafe fn __unique_ptr_raw(raw: *mut CxxVector<Self>) -> *mut c_void;
unsafe fn __unique_ptr_get(repr: *mut c_void) -> *const CxxVector<Self>;
@@ -145,14 +157,14 @@
}
unsafe { __vector_size(v) }
}
- unsafe fn __get_unchecked(v: &CxxVector<$ty>, pos: usize) -> &$ty {
+ unsafe fn __get_unchecked(v: &CxxVector<$ty>, pos: usize) -> *const $ty {
extern "C" {
attr! {
#[link_name = concat!("cxxbridge04$std$vector$", $segment, "$get_unchecked")]
fn __get_unchecked(_: &CxxVector<$ty>, _: usize) -> *const $ty;
}
}
- &*__get_unchecked(v, pos)
+ __get_unchecked(v, pos)
}
fn __unique_ptr_null() -> *mut c_void {
extern "C" {