introduce Bound::as_borrowed

This commit is contained in:
David Hewitt 2023-12-24 13:48:13 +00:00
parent 1b61cb015a
commit d36ad8f61f
4 changed files with 18 additions and 13 deletions

View file

@ -197,6 +197,15 @@ impl<'py, T> Bound<'py, T> {
self.into_non_null().as_ptr() self.into_non_null().as_ptr()
} }
/// Casts this `Bound<T>` to a `Borrowed<T>` smart pointer.
pub fn as_borrowed<'a>(&'a self) -> Borrowed<'a, 'py, T> {
Borrowed(
unsafe { NonNull::new_unchecked(self.as_ptr()) },
PhantomData,
self.py(),
)
}
/// Casts this `Bound<T>` as the corresponding "GIL Ref" type. /// Casts this `Bound<T>` as the corresponding "GIL Ref" type.
/// ///
/// This is a helper to be used for migration from the deprecated "GIL Refs" API. /// This is a helper to be used for migration from the deprecated "GIL Refs" API.
@ -300,11 +309,7 @@ impl<'a, 'py> Borrowed<'a, 'py, PyAny> {
impl<'a, 'py, T> From<&'a Bound<'py, T>> for Borrowed<'a, 'py, T> { impl<'a, 'py, T> From<&'a Bound<'py, T>> for Borrowed<'a, 'py, T> {
/// Create borrow on a Bound /// Create borrow on a Bound
fn from(instance: &'a Bound<'py, T>) -> Self { fn from(instance: &'a Bound<'py, T>) -> Self {
Self( instance.as_borrowed()
unsafe { NonNull::new_unchecked(instance.as_ptr()) },
PhantomData,
instance.py(),
)
} }
} }

View file

@ -400,16 +400,16 @@ impl<'py> PyByteArrayMethods<'py> for Bound<'py, PyByteArray> {
} }
fn data(&self) -> *mut u8 { fn data(&self) -> *mut u8 {
Borrowed::from(self).data() self.as_borrowed().data()
} }
unsafe fn as_bytes(&self) -> &[u8] { unsafe fn as_bytes(&self) -> &[u8] {
Borrowed::from(self).as_bytes() self.as_borrowed().as_bytes()
} }
#[allow(clippy::mut_from_ref)] #[allow(clippy::mut_from_ref)]
unsafe fn as_bytes_mut(&self) -> &mut [u8] { unsafe fn as_bytes_mut(&self) -> &mut [u8] {
Borrowed::from(self).as_bytes_mut() self.as_borrowed().as_bytes_mut()
} }
fn to_vec(&self) -> Vec<u8> { fn to_vec(&self) -> Vec<u8> {

View file

@ -107,7 +107,7 @@ pub trait PyBytesMethods<'py> {
impl<'py> PyBytesMethods<'py> for Bound<'py, PyBytes> { impl<'py> PyBytesMethods<'py> for Bound<'py, PyBytes> {
#[inline] #[inline]
fn as_bytes(&self) -> &[u8] { fn as_bytes(&self) -> &[u8] {
Borrowed::from(self).as_bytes() self.as_borrowed().as_bytes()
} }
} }

View file

@ -280,20 +280,20 @@ pub trait PyStringMethods<'py> {
impl<'py> PyStringMethods<'py> for Bound<'py, PyString> { impl<'py> PyStringMethods<'py> for Bound<'py, PyString> {
#[cfg(any(Py_3_10, not(Py_LIMITED_API)))] #[cfg(any(Py_3_10, not(Py_LIMITED_API)))]
fn to_str(&self) -> PyResult<&str> { fn to_str(&self) -> PyResult<&str> {
Borrowed::from(self).to_str() self.as_borrowed().to_str()
} }
fn to_cow(&self) -> PyResult<Cow<'_, str>> { fn to_cow(&self) -> PyResult<Cow<'_, str>> {
Borrowed::from(self).to_cow() self.as_borrowed().to_cow()
} }
fn to_string_lossy(&self) -> Cow<'_, str> { fn to_string_lossy(&self) -> Cow<'_, str> {
Borrowed::from(self).to_string_lossy() self.as_borrowed().to_string_lossy()
} }
#[cfg(not(Py_LIMITED_API))] #[cfg(not(Py_LIMITED_API))]
unsafe fn data(&self) -> PyResult<PyStringData<'_>> { unsafe fn data(&self) -> PyResult<PyStringData<'_>> {
Borrowed::from(self).data() self.as_borrowed().data()
} }
} }