dep-protobuf/rust/singular.rs
Protobuf Team Bot cdbfaf118e Trait clarity effort: introduce Singular trait, for types which are allowed as simple fields
At this moment it is a simple rename of ProxiedInRepeated, but treated as a generalization since the same class of types are usable as singular fields, in Repeated<T> and in Map<*, T>

In a subsequent change, we may be able to merge the MapValue<K: MapKey> trait into Singular since it should be 1:1, its only complex to remove locally because of the generic value.

PiperOrigin-RevId: 861713109
2026-01-27 07:33:35 -08:00

93 lines
3.3 KiB
Rust

// Protocol Buffers - Google's data interchange format
// Copyright 2026 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
use crate::{
IntoProxied, Message, Mut, Proxied, Repeated, View,
__internal::{Private, SealedInternal},
};
/// Singular types are types which are allowed as a simple field, or in a repeated, or as a map
/// value.
///
/// In typical Protobuf terminology, 'singular' refers to a property of individual field (namely
/// that it is not a repeated or map field), but in this case this Singular trait is implemented
/// for any type which is usable in that position, which is also the same types usable as a repeated
/// or map value.
///
/// Note that a subset of Singular types are permitted as Map keys: messages, bytes and enums are
/// not allowed in that position.
///
/// # Safety
/// - It must be sound to call `*_unchecked*(x)` with an `index` less than
/// `repeated_len(x)`.
pub unsafe trait Singular: Proxied + SealedInternal {
/// Constructs a new owned `Repeated` field.
#[doc(hidden)]
fn repeated_new(_private: Private) -> Repeated<Self>;
/// Frees the repeated field in-place, for use in `Drop`.
///
/// # Safety
/// - After `repeated_free`, no other methods on the input are safe to call.
#[doc(hidden)]
unsafe fn repeated_free(_private: Private, _repeated: &mut Repeated<Self>);
/// Gets the length of the repeated field.
#[doc(hidden)]
fn repeated_len(_private: Private, repeated: View<Repeated<Self>>) -> usize;
/// Appends a new element to the end of the repeated field.
#[doc(hidden)]
fn repeated_push(_private: Private, repeated: Mut<Repeated<Self>>, val: impl IntoProxied<Self>);
/// Clears the repeated field of elements.
#[doc(hidden)]
fn repeated_clear(_private: Private, repeated: Mut<Repeated<Self>>);
/// # Safety
/// `index` must be less than `Self::repeated_len(repeated)`
#[doc(hidden)]
unsafe fn repeated_get_unchecked(
_private: Private,
repeated: View<Repeated<Self>>,
index: usize,
) -> View<Self>;
/// # Safety
/// `index` must be less than `Self::repeated_len(repeated)`
#[allow(unused_variables)]
#[doc(hidden)]
unsafe fn repeated_get_mut_unchecked(
_private: Private,
repeated: Mut<Repeated<Self>>,
index: usize,
) -> Mut<Self>
where
Self: Message,
{
panic!("repeated_get_mut_unchecked is only implemented for messages");
}
/// # Safety
/// `index` must be less than `Self::repeated_len(repeated)`
#[doc(hidden)]
unsafe fn repeated_set_unchecked(
_private: Private,
repeated: Mut<Repeated<Self>>,
index: usize,
val: impl IntoProxied<Self>,
);
/// Copies the values in the `src` repeated field into `dest`.
#[doc(hidden)]
fn repeated_copy_from(_private: Private, src: View<Repeated<Self>>, dest: Mut<Repeated<Self>>);
/// Ensures that the repeated field has enough space allocated to insert at
/// least `additional` values without an allocation.
#[doc(hidden)]
fn repeated_reserve(_private: Private, repeated: Mut<Repeated<Self>>, additional: usize);
}