| 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() |
| )); |
| } |
| } |