Skip to content

improve newtype_index! macro #50337

Closed
Closed
@nikomatsakis

Description

@nikomatsakis
Contributor

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

Activity

added
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.
on Apr 30, 2018
spastorino

spastorino commented on Apr 30, 2018

@spastorino
Member

I can tackle this!

self-assigned this
on Apr 30, 2018
sgrif

sgrif commented on Apr 30, 2018

@sgrif
Contributor

FWIW I'd prefer we do pub(crate) struct instead of crate struct, so we continue to map to the corresponding Rust syntax. We should be able to just the vis matcher

petrochenkov

petrochenkov commented on Apr 30, 2018

@petrochenkov
Contributor

newtype_index! macro

Oh, that thing stopping "Go To Definition" from working 😄

nikomatsakis

nikomatsakis commented on Apr 30, 2018

@nikomatsakis
ContributorAuthor

@sgrif

FWIW I'd prefer we do pub(crate) struct instead of crate struct, so we continue to map to the corresponding Rust syntax. We should be able to just the vis matcher

crate is Rust syntax =) -- the vis matcher would be fine

sgrif

sgrif commented on Apr 30, 2018

@sgrif
Contributor

Oh neat, I was not aware of #45388

added a commit that references this issue on Sep 8, 2018

Rollup merge of rust-lang#53315 - nikomatsakis:newtype-index, r=Mark-…

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

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

      Participants

      @spastorino@nikomatsakis@sgrif@petrochenkov

      Issue actions

        improve `newtype_index!` macro · Issue #50337 · rust-lang/rust