#[non_exhaustive]pub enum PointerRepr {
Box,
Inline,
Custom(String),
}Expand description
The owned smart pointer a singular message field’s buffa::MessageField
wraps in generated owned structs.
The default is Box. Custom
substitutes any pointer that satisfies the buffa::ProtoBox<T> bound — for
example a smallbox-style pointer that stores small messages inline.
Because the pointer wraps the message type, its path is a template
containing a * placeholder for the message type (e.g.
"::smallbox::SmallBox<*, ::smallbox::space::S4>" or
"::my_crate::SmallBox<*>").
Because buffa::ProtoBox is buffa-owned, a foreign pointer cannot
implement it directly (orphan rule) — the template must name a crate-local
newtype, mirroring the ProtoString newtype expectation.
Select a representation through buffa_build’s box_type_custom builder
method. The wire format is identical regardless of the pointer; view types
are unaffected. Applies to singular message fields and boxed oneof
message/group variants (a variant opted into inline storage via
unboxed_oneof_fields takes precedence and gets no pointer). Repeated
message fields use a collection, not a pointer.
Variants (Non-exhaustive)§
This enum is marked as non-exhaustive
Box
::buffa::alloc::boxed::Box<T> (inside MessageField<T>). The opt-out
from the Inline default for large or rarely-set submessages, via
box_type_in(PointerRepr::Box, paths) (or box_type(PointerRepr::Box)
to restore the pre-0.9 global default).
Inline
::buffa::Inline<T> — store the message directly in the parent struct,
no heap allocation. MessageField<T, Inline<T>> is laid out as
Option<T>. The default.
Recursion-aware: a singular field that would form an infinite-size cycle
(directly, mutually, or via an
unbox_oneof-inlined oneof
variant) is silently kept on Box, so the default is always sized. An
exact-path Inline rule that names a recursive field is rejected at
codegen time.
Custom(String)
A custom pointer named by a Rust type-path template with a *
placeholder for the message type. Must satisfy buffa::ProtoBox<T> and
be a crate-local newtype.
§Limitations
- The template must contain at least one
*; a template that omits it surfaces asCodeGenError::MissingWildcard, and one whose substitution does not parse asCodeGenError::InvalidTypePath, at generation (.compile()) time. Rc/Arcand other shared/COW pointers are unusable: the decoder merges in place (needsDerefMut), so only an exclusively-owned pointer (heapBox, inlineSmallBox) can implementProtoBox.- An inline pointer inflates the parent struct per field, so select it per field/prefix, never as a blanket default.
- On a boxed oneof variant under the
arbitraryfeature, the custom pointer must implementarbitrary::Arbitrary(the oneof enum derives it and stores the pointer directly in the variant). The singular-field path needs no such impl —MessageFieldconstructs the pointer itself.
Trait Implementations§
Source§impl Clone for PointerRepr
impl Clone for PointerRepr
Source§fn clone(&self) -> PointerRepr
fn clone(&self) -> PointerRepr
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read more