// 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 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>::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 _ } }