Skip to content

Ptr invariant conversions could be smarter #1122

Closed

Description

See also: #1359

Consider Ptr::transparent_wrapper_into_inner:

zerocopy/src/pointer/ptr.rs

Lines 609 to 627 in be56a3a

/// `Ptr<'a, T = Wrapper<U>>` → `Ptr<'a, U>`
impl<'a, T, I> Ptr<'a, T, I>
where
T: 'a + TransparentWrapper<I, UnsafeCellVariance = Covariant> + ?Sized,
I: Invariants,
{
/// Converts the `Ptr` to a transparent wrapper type into a `Ptr` to the
/// wrapped inner type.
pub(crate) fn transparent_wrapper_into_inner(
self,
) -> Ptr<
'a,
T::Inner,
(
I::Aliasing,
<T::AlignmentVariance as AlignmentVariance<I::Alignment>>::Applied,
<T::ValidityVariance as ValidityVariance<I::Validity>>::Applied,
),
> {

Currently, if the validity invariant is Initialized and the validity variance is Invariant, the returned pointer will have the validity invariant Any. However, this throws away information: regardless of the specific validity requirements of a type, if all of the outer type's bytes are initialized, then the same is true of the inner type's bytes. In other words, the Initialized validity invariant should be preserved regardless of the validity variance.

In the general case, what we really need is the ability to express a generic mapping (Invariant, Variance) -> Invariant, which would allow us to express this behavior.

In other conversion functions, each invariant can be mapped as either:

  • Preserve the invariant
  • Map to a fixed invariant

These conversion functions could similarly benefit from a generic mapping Invariant -> Invariant.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions