| // Protocol Buffers - Google's data interchange format |
| // Copyright 2023 Google LLC. All rights reserved. |
| // |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file or at |
| // https://developers.google.com/open-source/licenses/bsd |
| |
| //! Traits related to interop with the underlying upb types. |
| //! |
| //! These traits are deliberately not available on the prelude, as they should |
| //! be used rarely and with great care. |
| |
| use super::*; |
| |
| /// Provides functionality for conversion to and from a raw `upb_Message*`. |
| /// |
| /// This trait is empty for the `upb` kernel because interop for owned messages |
| /// is not yet supported. It requires more work to handle arena allocation. |
| pub trait OwnedMessageInterop: SealedInternal {} |
| impl<T: Message> OwnedMessageInterop for T {} |
| |
| pub trait MessageViewInterop<'msg>: SealedInternal { |
| fn __unstable_as_raw_message(&self) -> *const std::ffi::c_void; |
| unsafe fn __unstable_wrap_raw_message(raw: &'msg *const std::ffi::c_void) -> Self; |
| unsafe fn __unstable_wrap_raw_message_unchecked_lifetime(raw: *const std::ffi::c_void) -> Self; |
| } |
| |
| /// Provides functionality for conversion to and from a raw `upb_Message*`. |
| /// |
| /// This trait is empty for the `upb` kernel because interop for mutable |
| /// messages is not yet supported. It requires more work to handle arena |
| /// allocation. |
| pub trait MessageMutInterop<'msg>: SealedInternal {} |
| impl<'a, T: MessageMut<'a>> MessageMutInterop<'a> for T {} |
| |
| impl<'a, T> MessageViewInterop<'a> for T |
| where |
| Self: MessageView<'a> + From<MessageViewInner<'a, <Self as MessageView<'a>>::Message>>, |
| { |
| unsafe fn __unstable_wrap_raw_message(msg: &'a *const std::ffi::c_void) -> Self { |
| let raw = RawMessage::new(*msg as *mut _).unwrap(); |
| let inner = unsafe { MessageViewInner::wrap_raw(raw) }; |
| inner.into() |
| } |
| unsafe fn __unstable_wrap_raw_message_unchecked_lifetime(msg: *const std::ffi::c_void) -> Self { |
| let raw = RawMessage::new(msg as *mut _).unwrap(); |
| let inner = unsafe { MessageViewInner::wrap_raw(raw) }; |
| inner.into() |
| } |
| fn __unstable_as_raw_message(&self) -> *const std::ffi::c_void { |
| self.get_ptr(Private).raw().as_ptr() as *const _ |
| } |
| } |