| use super::*; | |
| // This struct represents a raw minitable pointer. We need it to be Send and Sync so that we can | |
| // store it in a static OnceLock for lazy initialization of minitables. It should not be used for | |
| // any other purpose. | |
| pub struct MiniTableInitPtr(pub MiniTablePtr); | |
| unsafe impl Send for MiniTableInitPtr {} | |
| unsafe impl Sync for MiniTableInitPtr {} | |
| // Same as above, but for enum minitables. | |
| pub struct MiniTableEnumInitPtr(pub MiniTableEnumPtr); | |
| unsafe impl Send for MiniTableEnumInitPtr {} | |
| unsafe impl Sync for MiniTableEnumInitPtr {} | |
| // Same as above, but for extension minitables. | |
| #[derive(Clone, Copy)] | |
| pub struct MiniTableExtensionInitPtr(pub MiniTableExtensionPtr); | |
| unsafe impl Send for MiniTableExtensionInitPtr {} | |
| unsafe impl Sync for MiniTableExtensionInitPtr {} | |
| // Same as above, but for an extension registry. | |
| #[derive(Clone, Copy)] | |
| pub struct ExtensionRegistryInitPtr(pub ExtensionRegistryPtr); | |
| unsafe impl Send for ExtensionRegistryInitPtr {} | |
| unsafe impl Sync for ExtensionRegistryInitPtr {} | |
| pub enum ExtensionSub { | |
| None, | |
| Message(MiniTablePtr), | |
| Enum(MiniTableEnumPtr), | |
| } | |
| /// # Safety | |
| /// - `mini_descriptor` must be a valid MiniDescriptor. | |
| pub unsafe fn build_mini_table(mini_descriptor: &'static str) -> MiniTablePtr { | |
| unsafe { | |
| MiniTablePtr::new(upb_MiniTable_Build( | |
| mini_descriptor.as_ptr(), | |
| mini_descriptor.len(), | |
| THREAD_LOCAL_ARENA.with(|a| a.raw()), | |
| std::ptr::null_mut(), | |
| )) | |
| } | |
| } | |
| /// # Safety | |
| /// - `mini_descriptor` must be a valid enum MiniDescriptor. | |
| pub unsafe fn build_enum_mini_table(mini_descriptor: &'static str) -> MiniTableEnumPtr { | |
| unsafe { | |
| MiniTableEnumPtr::new(upb_MiniTableEnum_Build( | |
| mini_descriptor.as_ptr(), | |
| mini_descriptor.len(), | |
| THREAD_LOCAL_ARENA.with(|a| a.raw()), | |
| std::ptr::null_mut(), | |
| )) | |
| } | |
| } | |
| /// # Safety | |
| /// - `mini_descriptor` must be a valid extension MiniDescriptor. | |
| pub unsafe fn build_extension_mini_table( | |
| mini_descriptor: &'static str, | |
| extendee: MiniTablePtr, | |
| sub: ExtensionSub, | |
| ) -> MiniTableExtensionPtr { | |
| unsafe { | |
| let ext = NonNull::new_unchecked(upb_MiniTableExtension_Build( | |
| mini_descriptor.as_ptr(), | |
| mini_descriptor.len(), | |
| extendee, | |
| THREAD_LOCAL_ARENA.with(|a| a.raw()), | |
| std::ptr::null_mut(), | |
| )); | |
| match sub { | |
| ExtensionSub::None => {} | |
| ExtensionSub::Message(m) => { | |
| assert!(upb_MiniTableExtension_SetSubMessage(ext, m)); | |
| } | |
| ExtensionSub::Enum(m) => { | |
| assert!(upb_MiniTableExtension_SetSubEnum(ext, m)); | |
| } | |
| } | |
| ext | |
| } | |
| } | |
| /// # Safety | |
| /// - All arguments must point to valid MiniTables. | |
| pub unsafe fn link_mini_table( | |
| mini_table: MiniTablePtr, | |
| submessages: &[MiniTablePtr], | |
| subenums: &[MiniTableEnumPtr], | |
| ) { | |
| unsafe { | |
| assert!(upb_MiniTable_Link( | |
| mini_table, | |
| submessages.as_ptr(), | |
| submessages.len(), | |
| subenums.as_ptr(), | |
| subenums.len() | |
| )); | |
| } | |
| } |