Move common macros to a shared location
PiperOrigin-RevId: 559855079
diff --git a/rust/BUILD b/rust/BUILD
index 4feba32..53c824b 100644
--- a/rust/BUILD
+++ b/rust/BUILD
@@ -52,6 +52,7 @@
name = "protobuf_upb",
srcs = [
"internal.rs",
+ "macros.rs",
"optional.rs",
"proxied.rs",
"shared.rs",
@@ -89,6 +90,7 @@
srcs = [
"cpp.rs",
"internal.rs",
+ "macros.rs",
"optional.rs",
"proxied.rs",
"shared.rs",
diff --git a/rust/internal.rs b/rust/internal.rs
index c1d8dca..e919746 100644
--- a/rust/internal.rs
+++ b/rust/internal.rs
@@ -32,6 +32,7 @@
//! exposed to through the `protobuf` path but must be public for use by
//! generated code.
+use crate::macros::define_opaque_nonnulls;
pub use crate::vtable::{
new_vtable_field_entry, BytesMutVTable, BytesOptionalMutVTable, RawVTableMutator,
};
@@ -40,46 +41,6 @@
/// Used to protect internal-only items from being used accidentally.
pub struct Private;
-/// Defines a set of opaque pointers and a unique non-accessible pointees.
-///
-/// This provides a type safety benefit over using `NonNull<u8>` everywhere.
-/// The [Rustonomicon][nomicon] currently recommends a zero-sized struct,
-/// though this should use [`extern type`] when that is stabilized.
-///
-/// Because this defines a new private module, it can only be called once per
-/// module.
-///
-/// [nomicon]: https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs
-/// [`extern type`]: https://github.com/rust-lang/rust/issues/43467
-macro_rules! define_opaque_nonnulls {
- ($($(#[$meta:meta])* $vis:vis type $name:ident = NonNull<$raw_name:ident>;)*) => {
- mod _opaque_pointees {
- $(
- #[doc = concat!("Opaque pointee for [`", stringify!($name), "`][pointer]")]
- ///
- /// This type is not meant to be dereferenced in Rust code.
- /// It is only meant to provide type safety for raw pointers
- /// which are manipulated behind FFI.
- #[doc = concat!("[pointer]: super::", stringify!($name))]
- #[repr(C)]
- pub struct $raw_name {
- _data: [u8; 0],
- _marker: ::std::marker::PhantomData<(*mut u8, ::std::marker::PhantomPinned)>,
- }
- )*
- }
- $(
- $(#[$meta])*
- ///
- /// This is an opaque pointer used for FFI:
- /// do not dereference this type in Rust code.
- $vis type $name = ::std::ptr::NonNull<_opaque_pointees::$raw_name>;
- )*
- };
-}
-
-pub(crate) use define_opaque_nonnulls;
-
define_opaque_nonnulls!(
/// A raw pointer to the underlying arena for this runtime.
pub type RawArena = NonNull<RawArenaData>;
diff --git a/rust/macros.rs b/rust/macros.rs
new file mode 100644
index 0000000..c25ddfc
--- /dev/null
+++ b/rust/macros.rs
@@ -0,0 +1,109 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2023 Google LLC. All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google LLC. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+//! Runtime-internal macros
+
+/// Defines a set of opaque pointers and a unique non-accessible pointees.
+///
+/// This provides a type safety benefit over using `NonNull<u8>` everywhere.
+/// The [Rustonomicon][nomicon] currently recommends a zero-sized struct,
+/// though this should use [`extern type`] when that is stabilized.
+///
+/// Because this defines a new private module, it can only be called once per
+/// module.
+///
+/// [nomicon]: https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs
+/// [`extern type`]: https://github.com/rust-lang/rust/issues/43467
+macro_rules! define_opaque_nonnulls {
+ ($($(#[$meta:meta])* $vis:vis type $name:ident = NonNull<$raw_name:ident>;)*) => {
+ mod _opaque_pointees {
+ $(
+ #[doc = concat!("Opaque pointee for [`", stringify!($name), "`][pointer]")]
+ ///
+ /// This type is not meant to be dereferenced in Rust code.
+ /// It is only meant to provide type safety for raw pointers
+ /// which are manipulated behind FFI.
+ #[doc = concat!("[pointer]: super::", stringify!($name))]
+ #[repr(C)]
+ pub struct $raw_name {
+ _data: [u8; 0],
+ _marker: ::std::marker::PhantomData<(*mut u8, ::std::marker::PhantomPinned)>,
+ }
+ )*
+ }
+ $(
+ $(#[$meta])*
+ ///
+ /// This is an opaque pointer used for FFI:
+ /// do not dereference this type in Rust code.
+ $vis type $name = ::std::ptr::NonNull<_opaque_pointees::$raw_name>;
+ )*
+ };
+}
+pub(crate) use define_opaque_nonnulls;
+
+/// Defines a `impl SettableValue<$proxied> for SomeType` body that forwards to
+/// another implementation.
+///
+/// # Example
+/// ```ignore
+/// impl<'a, const N: usize> SettableValue<[u8]> for &'a [u8; N] {
+/// // Use the `SettableValue<[u8]>` implementation for `&[u8]`:
+/// impl_forwarding_settable_value!([u8], self => &self[..]);
+/// }
+/// ```
+macro_rules! impl_forwarding_settable_value {
+ ($proxied:ty, $self:ident => $self_forwarding_expr:expr) => {
+ fn set_on(
+ $self,
+ _private: $crate::__internal::Private,
+ mutator: $crate::Mut<'_, $proxied>,
+ ) {
+ ($self_forwarding_expr).set_on(Private, mutator)
+ }
+
+ fn set_on_absent(
+ $self,
+ _private: $crate::__internal::Private,
+ absent_mutator: <$proxied as $crate::ProxiedWithPresence>::AbsentMutData<'_>,
+ ) -> <$proxied as $crate::ProxiedWithPresence>::PresentMutData<'_> {
+ ($self_forwarding_expr).set_on_absent($crate::__internal::Private, absent_mutator)
+ }
+
+ fn set_on_present(
+ $self,
+ _private: $crate::__internal::Private,
+ present_mutator: <$proxied as $crate::ProxiedWithPresence>::PresentMutData<'_>,
+ ) {
+ ($self_forwarding_expr).set_on_present($crate::__internal::Private, present_mutator)
+ }
+ };
+}
+pub(crate) use impl_forwarding_settable_value;
diff --git a/rust/shared.rs b/rust/shared.rs
index 5abd8be..b6f8805 100644
--- a/rust/shared.rs
+++ b/rust/shared.rs
@@ -64,6 +64,7 @@
#[path = "upb.rs"]
pub mod __runtime;
+mod macros;
mod optional;
mod proxied;
mod string;
diff --git a/rust/string.rs b/rust/string.rs
index fe78871..523a508 100644
--- a/rust/string.rs
+++ b/rust/string.rs
@@ -34,6 +34,7 @@
use crate::__internal::{Private, PtrAndLen, RawMessage};
use crate::__runtime::{BytesAbsentMutData, BytesPresentMutData, InnerBytesMut};
+use crate::macros::impl_forwarding_settable_value;
use crate::{Mut, MutProxy, Proxied, ProxiedWithPresence, SettableValue, View, ViewProxy};
use std::borrow::Cow;
use std::cmp::{Eq, Ord, Ordering, PartialEq, PartialOrd};
@@ -230,30 +231,6 @@
}
}
-macro_rules! impl_forwarding_settable_value {
- ($proxied:ty, $self:ident => $self_forwarding_expr:expr) => {
- fn set_on($self, _private: Private, mutator: BytesMut<'_>) {
- ($self_forwarding_expr).set_on(Private, mutator)
- }
-
- fn set_on_absent(
- $self,
- _private: Private,
- absent_mutator: <$proxied as ProxiedWithPresence>::AbsentMutData<'_>,
- ) -> <$proxied as ProxiedWithPresence>::PresentMutData<'_> {
- ($self_forwarding_expr).set_on_absent(Private, absent_mutator)
- }
-
- fn set_on_present(
- $self,
- _private: Private,
- present_mutator: <$proxied as ProxiedWithPresence>::PresentMutData<'_>,
- ) {
- ($self_forwarding_expr).set_on_present(Private, present_mutator)
- }
- };
-}
-
impl<'a, const N: usize> SettableValue<[u8]> for &'a [u8; N] {
// forward to `self[..]`
impl_forwarding_settable_value!([u8], self => &self[..]);