Skip to content

improve newtype_index! macro #50337

Closed
Closed
@nikomatsakis

Description

@nikomatsakis

We have this handy macro newtype_index! that creates a, well, newtype'd index:

newtype_index!(RegionAtLocationIndex { DEBUG_FORMAT = "RegionAtLocationIndex({})" });

However, I think it could be improved in four ways:

First, the syntax should change to include the keyword struct and pub. This would help with people trying to find the definition of the type. I'd probably switch to {} form at the same time, but that's not necessary:

newtype_index! {
  pub struct RegionAtLocationIndex { DEBUG_FORMAT = "RegionAtLocationIndex({})" }
}

Second, doing this would also allow us to support arbitrary visibilities. For example, I'd like to make crate struct RegionAtLocationIndex:

newtype_index! {
  crate struct RegionAtLocationIndex { DEBUG_FORMAT = "RegionAtLocationIndex({})" }
}

Third, we should change to incorporate NonZero. That is, the original example would currently expands to something like:

pub struct RegionAtLocationIndex(u32);

but I want it to expand to:

pub struct RegionAtLocationIndex { non_zero: NonZero<u32> }

Of course, 0 is a valid index, so the various initialization and accessor routines would have to add or subtract one as appropriate.

Using NonZero would mean that Option<T> would be represented still as a single u32.

Finally, fourth, as a convenience, it would be nice to define inherent (non-trait) methods, so that using these types did not require importing the Idx trait:

        impl $type {
            #[inline]
            fn new(value: usize) -> Self {..}
            #[inline]
            fn index(self) -> usize {..}
        }

cc @Nashenas88 @spastorino @sgrif

Metadata

Metadata

Assignees

Labels

C-cleanupCategory: PRs that clean code up or issues documenting cleanup.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions