56
56
extern crate num_traits;
57
57
58
58
pub use std:: option:: Option ;
59
- pub use num_traits:: FromPrimitive ;
59
+ pub use num_traits:: { FromPrimitive , ToPrimitive } ;
60
60
61
61
/// Helper macro for internal use by `enum_from_primitive!`.
62
62
#[ macro_export]
@@ -73,9 +73,31 @@ macro_rules! enum_from_primitive_impl_ty {
73
73
} ;
74
74
}
75
75
76
+ /// Helper macro for internal use by `enum_to_primitive!`.
77
+ #[ macro_export]
78
+ macro_rules! enum_to_primitive_impl_ty {
79
+ ( $meth: ident, $ty: ty, $name: ident) => {
80
+ #[ allow( non_upper_case_globals, unused) ]
81
+ fn $meth( & self ) -> $crate:: Option <$ty> {
82
+ let copy: $name = unsafe { :: std:: mem:: transmute_copy( self ) } ;
83
+ Some ( copy as $ty)
84
+ }
85
+ } ;
86
+ }
87
+
88
+ /// Helper macro for internal use by `enum_to_primitive!`.
89
+ #[ macro_export]
90
+ macro_rules! enum_to_primitive_impl {
91
+ ( $name: ident) => {
92
+ impl $crate:: ToPrimitive for $name {
93
+ enum_to_primitive_impl_ty! { to_i64, i64 , $name }
94
+ enum_to_primitive_impl_ty! { to_u64, u64 , $name }
95
+ }
96
+ } ;
97
+ }
98
+
76
99
/// Helper macro for internal use by `enum_from_primitive!`.
77
100
#[ macro_export]
78
- #[ macro_use( enum_from_primitive_impl_ty) ]
79
101
macro_rules! enum_from_primitive_impl {
80
102
( $name: ident, $( $variant: ident ) * ) => {
81
103
impl $crate:: FromPrimitive for $name {
@@ -88,7 +110,6 @@ macro_rules! enum_from_primitive_impl {
88
110
/// Wrap this macro around an `enum` declaration to get an
89
111
/// automatically generated implementation of `num::FromPrimitive`.
90
112
#[ macro_export]
91
- #[ macro_use( enum_from_primitive_impl) ]
92
113
macro_rules! enum_from_primitive {
93
114
(
94
115
$( #[ $enum_attr: meta] ) *
@@ -194,3 +215,121 @@ macro_rules! enum_from_primitive {
194
215
enum_from_primitive_impl! { $name, $( $( $variant ) + ) + }
195
216
} ;
196
217
}
218
+
219
+
220
+ /// Wrap this macro around an `enum` declaration to get an
221
+ /// automatically generated implementation of `num::FromPrimitive`.
222
+ #[ macro_export]
223
+ macro_rules! enum_primitive {
224
+ (
225
+ $( #[ $enum_attr: meta] ) *
226
+ enum $name: ident {
227
+ $( $( #[ $variant_attr: meta] ) * $variant: ident ) ,+ $( = $discriminator: expr, $( $( #[ $variant_two_attr: meta] ) * $variant_two: ident ) ,+ ) *
228
+ }
229
+ ) => {
230
+ $( #[ $enum_attr] ) *
231
+ enum $name {
232
+ $( $( #[ $variant_attr] ) * $variant ) ,+ $( = $discriminator, $( $( #[ $variant_two_attr] ) * $variant_two ) ,+ ) *
233
+ }
234
+ enum_from_primitive_impl! { $name, $( $variant ) + $( $( $variant_two ) + ) * }
235
+ enum_to_primitive_impl! { $name }
236
+ } ;
237
+
238
+ (
239
+ $( #[ $enum_attr: meta] ) *
240
+ enum $name: ident {
241
+ $( $( $( #[ $variant_attr: meta] ) * $variant: ident ) ,+ = $discriminator: expr ) ,*
242
+ }
243
+ ) => {
244
+ $( #[ $enum_attr] ) *
245
+ enum $name {
246
+ $( $( $( #[ $variant_attr] ) * $variant ) ,+ = $discriminator ) ,*
247
+ }
248
+ enum_from_primitive_impl! { $name, $( $( $variant ) + ) * }
249
+ enum_to_primitive_impl! { $name }
250
+ } ;
251
+
252
+ (
253
+ $( #[ $enum_attr: meta] ) *
254
+ enum $name: ident {
255
+ $( $( #[ $variant_attr: meta] ) * $variant: ident ) ,+ $( = $discriminator: expr, $( $( #[ $variant_two_attr: meta] ) * $variant_two: ident ) ,+ ) * ,
256
+ }
257
+ ) => {
258
+ $( #[ $enum_attr] ) *
259
+ enum $name {
260
+ $( $( #[ $variant_attr] ) * $variant ) ,+ $( = $discriminator, $( $( #[ $variant_two_attr] ) * $variant_two ) ,+ ) * ,
261
+ }
262
+ enum_from_primitive_impl! { $name, $( $variant ) + $( $( $variant_two ) + ) * }
263
+ enum_to_primitive_impl! { $name }
264
+ } ;
265
+
266
+ (
267
+ $( #[ $enum_attr: meta] ) *
268
+ enum $name: ident {
269
+ $( $( $( #[ $variant_attr: meta] ) * $variant: ident ) ,+ = $discriminator: expr ) ,+,
270
+ }
271
+ ) => {
272
+ $( #[ $enum_attr] ) *
273
+ enum $name {
274
+ $( $( $( #[ $variant_attr] ) * $variant ) ,+ = $discriminator ) ,+,
275
+ }
276
+ enum_from_primitive_impl! { $name, $( $( $variant ) + ) + }
277
+ enum_to_primitive_impl! { $name }
278
+ } ;
279
+
280
+ (
281
+ $( #[ $enum_attr: meta] ) *
282
+ pub enum $name: ident {
283
+ $( $( #[ $variant_attr: meta] ) * $variant: ident ) ,+ $( = $discriminator: expr, $( $( #[ $variant_two_attr: meta] ) * $variant_two: ident ) ,+ ) *
284
+ }
285
+ ) => {
286
+ $( #[ $enum_attr] ) *
287
+ pub enum $name {
288
+ $( $( #[ $variant_attr] ) * $variant ) ,+ $( = $discriminator, $( $( #[ $variant_two_attr] ) * $variant_two ) ,+ ) *
289
+ }
290
+ enum_from_primitive_impl! { $name, $( $variant ) + $( $( $variant_two ) + ) * }
291
+ enum_to_primitive_impl! { $name }
292
+ } ;
293
+
294
+ (
295
+ $( #[ $enum_attr: meta] ) *
296
+ pub enum $name: ident {
297
+ $( $( $( #[ $variant_attr: meta] ) * $variant: ident ) ,+ = $discriminator: expr ) ,*
298
+ }
299
+ ) => {
300
+ $( #[ $enum_attr] ) *
301
+ pub enum $name {
302
+ $( $( $( #[ $variant_attr] ) * $variant ) ,+ = $discriminator ) ,*
303
+ }
304
+ enum_from_primitive_impl! { $name, $( $( $variant ) + ) * }
305
+ enum_to_primitive_impl! { $name }
306
+ } ;
307
+
308
+ (
309
+ $( #[ $enum_attr: meta] ) *
310
+ pub enum $name: ident {
311
+ $( $( #[ $variant_attr: meta] ) * $variant: ident ) ,+ $( = $discriminator: expr, $( $( #[ $variant_two_attr: meta] ) * $variant_two: ident ) ,+ ) * ,
312
+ }
313
+ ) => {
314
+ $( #[ $enum_attr] ) *
315
+ pub enum $name {
316
+ $( $( #[ $variant_attr] ) * $variant ) ,+ $( = $discriminator, $( $( #[ $variant_two_attr] ) * $variant_two ) ,+ ) * ,
317
+ }
318
+ enum_from_primitive_impl! { $name, $( $variant ) + $( $( $variant_two ) + ) * }
319
+ enum_to_primitive_impl! { $name }
320
+ } ;
321
+
322
+ (
323
+ $( #[ $enum_attr: meta] ) *
324
+ pub enum $name: ident {
325
+ $( $( $( #[ $variant_attr: meta] ) * $variant: ident ) ,+ = $discriminator: expr ) ,+,
326
+ }
327
+ ) => {
328
+ $( #[ $enum_attr] ) *
329
+ pub enum $name {
330
+ $( $( $( #[ $variant_attr] ) * $variant ) ,+ = $discriminator ) ,+,
331
+ }
332
+ enum_from_primitive_impl! { $name, $( $( $variant ) + ) + }
333
+ enum_to_primitive_impl! { $name }
334
+ } ;
335
+ }
0 commit comments