@@ -45,77 +45,153 @@ macro_rules! newtype_index {
45
45
// Use default constants
46
46
( $name: ident) => (
47
47
newtype_index!(
48
- @type [ $name]
49
- @max[ :: std:: u32 :: MAX ]
50
- @debug_format[ "{}" ] ) ;
48
+ // Leave out derives marker so we can use its absence to ensure it comes first
49
+ @type [ $name]
50
+ @pub [ pub ]
51
+ @max [ :: std:: u32 :: MAX ]
52
+ @debug_name [ unsafe { :: std:: intrinsics:: type_name:: <$name>( ) } ] ) ;
53
+ ) ;
54
+
55
+ ( $name: ident nopub) => (
56
+ newtype_index!(
57
+ // Leave out derives marker so we can use its absence to ensure it comes first
58
+ @type [ $name]
59
+ @pub [ ]
60
+ @max [ :: std:: u32 :: MAX ]
61
+ @debug_name [ unsafe { :: std:: intrinsics:: type_name:: <$name>( ) } ] ) ;
51
62
) ;
52
63
53
64
// Define any constants
54
65
( $name: ident { $( $tokens: tt) + } ) => (
55
66
newtype_index!(
56
- @type [ $name]
57
- @max[ :: std:: u32 :: MAX ]
58
- @debug_format[ "{}" ]
59
- $( $tokens) +) ;
67
+ // Leave out derives marker so we can use its absence to ensure it comes first
68
+ @type [ $name]
69
+ @pub [ pub ]
70
+ @max [ :: std:: u32 :: MAX ]
71
+ @debug_name [ unsafe { :: std:: intrinsics:: type_name:: <$name>( ) } ]
72
+ $( $tokens) +) ;
73
+ ) ;
74
+
75
+ // Define any constants
76
+ ( $name: ident nopub { $( $tokens: tt) + } ) => (
77
+ newtype_index!(
78
+ // Leave out derives marker so we can use its absence to ensure it comes first
79
+ @type [ $name]
80
+ @pub [ ]
81
+ @max [ :: std:: u32 :: MAX ]
82
+ @debug_name [ unsafe { :: std:: intrinsics:: type_name:: <$name>( ) } ]
83
+ $( $tokens) +) ;
60
84
) ;
61
85
62
86
// ---- private rules ----
63
87
64
88
// Base case, user-defined constants (if any) have already been defined
65
- ( @type [ $type: ident] @max[ $max: expr] @debug_format[ $debug_format: expr] ) => (
66
- #[ derive( Copy , Clone , PartialEq , Eq , Hash , PartialOrd , Ord ,
67
- RustcEncodable , RustcDecodable ) ]
68
- pub struct $type( pub u32 ) ;
89
+ ( @derives[ $( $derives: ident) ,* ] @type [ $type: ident] @pub [ $( $pub: tt) * ] @max[ $max: expr] @debug_name[ $debug_name: expr] ) => (
90
+ #[ derive( Copy , Clone , PartialEq , Eq , Hash , PartialOrd , Ord , $( $derives) ,* ) ]
91
+ pub struct $type( $( $pub) * u32 ) ;
69
92
70
93
impl Idx for $type {
71
94
fn new( value: usize ) -> Self {
72
95
assert!( value < ( $max) as usize ) ;
73
96
$type( value as u32 )
74
97
}
98
+
75
99
fn index( self ) -> usize {
76
100
self . 0 as usize
77
101
}
78
102
}
79
103
80
104
impl :: std:: fmt:: Debug for $type {
81
105
fn fmt( & self , fmt: & mut :: std:: fmt:: Formatter ) -> :: std:: fmt:: Result {
82
- write!( fmt, $debug_format , self . 0 )
106
+ write!( fmt, "{}{}" , $debug_name , self . 0 )
83
107
}
84
108
}
85
109
) ;
86
110
111
+ // By not including the @derives marker in this list nor in the default args, we can force it
112
+ // to come first if it exists
113
+ ( @type [ $type: ident] @pub [ $( $pub: tt) * ] @max[ $max: expr] @debug_name[ $debug_name: expr]
114
+ derive [ $( $derives: ident) ,+] $( $tokens: tt) * ) => (
115
+ newtype_index!(
116
+ @derives [ $( $derives) ,+]
117
+ @type [ $type]
118
+ @pub [ $( $pub) * ]
119
+ @max [ $max]
120
+ @debug_name [ $debug_name]
121
+ $( $tokens) * ) ;
122
+ ) ;
123
+
124
+ // The case where no derives are added
125
+ ( @type [ $type: ident] @pub [ $( $pub: tt) * ] @max[ $max: expr] @debug_name[ $debug_name: expr] $( $tokens: tt) * ) => (
126
+ newtype_index!(
127
+ @derives [ ]
128
+ @type [ $type]
129
+ @pub [ $( $pub) * ]
130
+ @max [ $max]
131
+ @debug_name [ $debug_name]
132
+ $( $tokens) * ) ;
133
+ ) ;
134
+
87
135
// Rewrite final without comma to one that includes comma
88
- ( @type [ $type: ident] @max[ $max: expr] @debug_format [ $debug_format : expr]
136
+ ( @derives [ $ ( $derives : ident ) , * ] @ type [ $type: ident] @pub [ $ ( $pub : tt ) * ] @ max[ $max: expr] @debug_name [ $debug_name : expr]
89
137
$name: ident = $constant: expr) => (
90
- newtype_index!( @type [ $type] @max[ $max] @debug_format[ $debug_format] $name = $constant, ) ;
138
+ newtype_index!(
139
+ @derives [ $( $derives) ,* ]
140
+ @type [ $type]
141
+ @pub [ $( $pub) * ]
142
+ @max [ $max]
143
+ @debug_name [ $debug_name]
144
+ $name = $constant, ) ;
91
145
) ;
92
146
93
147
// Rewrite final const without comma to one that includes comma
94
- ( @type [ $type: ident] @max[ $_max: expr] @debug_format[ $debug_format: expr]
95
- const $name: ident = $constant: expr) => (
96
- newtype_index!( @type [ $type]
97
- @max[ $max]
98
- @debug_format[ $debug_format]
99
- const $name = $constant, ) ;
148
+ ( @derives[ $( $derives: ident) ,* ] @type [ $type: ident] @pub [ $( $pub: tt) * ] @max[ $_max: expr] @debug_name[ $debug_name: expr]
149
+ $( #[ doc = $doc: expr] ) * const $name: ident = $constant: expr) => (
150
+ newtype_index!(
151
+ @derives [ $( $derives) ,* ]
152
+ @type [ $type]
153
+ @pub [ $( $pub) * ]
154
+ @max [ $max]
155
+ @debug_name [ $debug_name]
156
+ $( #[ doc = $doc] ) * const $name = $constant, ) ;
100
157
) ;
101
158
102
159
// Replace existing default for max
103
- ( @type [ $type: ident] @max[ $_max: expr] @debug_format [ $debug_format : expr]
160
+ ( @derives [ $ ( $derives : ident ) , * ] @ type [ $type: ident] @pub [ $ ( $pub : tt ) * ] @ max[ $_max: expr] @debug_name [ $debug_name : expr]
104
161
MAX = $max: expr, $( $tokens: tt) * ) => (
105
- newtype_index!( @type [ $type] @max[ $max] @debug_format[ $debug_format] $( $tokens) * ) ;
162
+ newtype_index!(
163
+ @derives [ $( $derives) ,* ]
164
+ @type [ $type]
165
+ @pub [ $( $pub) * ]
166
+ @max [ $max]
167
+ @debug_name [ $debug_name]
168
+ $( $tokens) * ) ;
106
169
) ;
107
170
108
- // Replace existing default for debug_format
109
- ( @type [ $type: ident] @max[ $max: expr] @debug_format[ $_debug_format: expr]
110
- DEBUG_FORMAT = $debug_format: expr, $( $tokens: tt) * ) => (
111
- newtype_index!( @type [ $type] @max[ $max] @debug_format[ $debug_format] $( $tokens) * ) ;
171
+ // Replace existing default for debug_name
172
+ ( @derives[ $( $derives: ident) ,* ] @type [ $type: ident] @pub [ $( $pub: tt) * ] @max[ $max: expr] @debug_name[ $_debug_name: expr]
173
+ DEBUG_NAME = $debug_name: expr, $( $tokens: tt) * ) => (
174
+ newtype_index!(
175
+ @derives [ $( $derives) ,* ]
176
+ @type [ $type]
177
+ @pub [ $( $pub) * ]
178
+ @max [ $max]
179
+ @debug_name [ $debug_name]
180
+ $( $tokens) * ) ;
112
181
) ;
113
182
114
- // Assign a user-defined constant (as final param)
115
- ( @type [ $type: ident] @max[ $max: expr] @debug_format[ $debug_format: expr]
116
- const $name: ident = $constant: expr, $( $tokens: tt) * ) => (
183
+ // Assign a user-defined constant
184
+ ( @derives[ $( $derives: ident) ,* ] @type [ $type: ident] @pub [ $( $pub: tt) * ] @max[ $max: expr] @debug_name[ $debug_name: expr]
185
+ $( #[ doc = $doc: expr] ) * const $name: ident = $constant: expr, $( $tokens: tt) * ) => (
186
+ $( #[ doc = $doc] ) *
117
187
pub const $name: $type = $type( $constant) ;
118
- newtype_index!( @type [ $type] @max[ $max] @debug_format[ $debug_format] $( $tokens) * ) ;
188
+ newtype_index!(
189
+ @derives [ $( $derives) ,* ]
190
+ @type [ $type]
191
+ @pub [ $( $pub) * ]
192
+ @max [ $max]
193
+ @debug_name [ $debug_name]
194
+ $( $tokens) * ) ;
119
195
) ;
120
196
}
121
197
0 commit comments