-
Notifications
You must be signed in to change notification settings - Fork 13.9k
Description
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 {..}
}