1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
// See the COPYRIGHT file at the top-level directory of this distribution.
// Licensed under MIT license <LICENSE-MIT or http://opensource.org/licenses/MIT>

//! This project provides ad-hoc enum types, and traits for user-defined enum exchange.
//!
//! See [enumx README](https://github.com/oooutlk/enumx/blob/master/enumx/README.md) for more.

/// Constructs an enum from one of its variant type.
pub trait FromVariant<Variant,Index> {
    fn from_variant( variant: Variant ) -> Self;
}

/// Converts into an enum as its variant.
pub trait IntoEnum<Enum,Index> {
    fn into_enum( self ) -> Enum;
}

impl<Enum,Variant,Index> IntoEnum<Enum,Index> for Variant
    where Enum: FromVariant<Variant,Index>
{
    fn into_enum( self ) -> Enum { FromVariant::<Variant,Index>::from_variant( self )}
}

/// Converts an ad-hoc enum into another one.
pub trait IntoEnumX<Dest,Indices> {
    fn into_enumx( self ) -> Dest;
}

/// Constructs an ad-hoc enum from another one.
pub trait FromEnumX<Src,Indices> {
    fn from_enumx( src: Src ) -> Self;
}

impl<Src,Dest,Indices> FromEnumX<Src,Indices> for Dest
    where Src: IntoEnumX<Dest,Indices>
{
    fn from_enumx( src: Src ) -> Self { src.into_enumx() }
}

/// Indicates the prototype for an enum that participates in enum exchange.
pub trait Exchange {
    type EnumX;
}

/// Constructs a user-defined enum from another user-defined enum.
pub trait ExchangeFrom<SrcNamed,SrcUnnamed,DestNamed,DestUnnamed,Indices> {
    fn exchange_from( src: SrcNamed ) -> Self;
}

impl<SrcNamed,SrcUnnamed,DestNamed,DestUnnamed,Indices> ExchangeFrom<SrcNamed,SrcUnnamed,DestNamed,DestUnnamed,Indices> for DestNamed
    where DestNamed   : Exchange<EnumX=DestUnnamed> + From<DestUnnamed>
        , SrcNamed    : Exchange<EnumX=SrcUnnamed>  + Into<SrcUnnamed>
        , DestUnnamed : FromEnumX<SrcUnnamed,Indices>
{
    fn exchange_from( src: SrcNamed ) -> Self {
        DestNamed::from( FromEnumX::<SrcUnnamed,Indices>::from_enumx( src.into() ))
    }
}

/// Converts a user-defined enum into another user-defined enum.
pub trait ExchangeInto<SrcNamed,SrcUnnamed,DestNamed,DestUnnamed,Indices> {
    fn exchange_into( self ) -> DestNamed;
}

impl<SrcNamed,SrcUnnamed,DestNamed,DestUnnamed,Indices> ExchangeInto<SrcNamed,SrcUnnamed,DestNamed,DestUnnamed,Indices> for SrcNamed
    where DestNamed: ExchangeFrom<SrcNamed,SrcUnnamed,DestNamed,DestUnnamed,Indices>
{
    fn exchange_into( self ) -> DestNamed {
        DestNamed::exchange_from( self )
    }
}

/// Recursive descent indices for `IntoEnumX`
pub struct LR<L,R> {
    pub l : L,
    pub r : R,
}

/// Indicates an impossible index for `Enum0`, internal use only.
pub struct Nil;

/// Never type, placeholder in the last `R` variant of nested `LR`s.
pub enum Enum0 {}

macro_rules! variant_index_types {
    ($($index:ident)+) => {$(
        pub struct $index;
    )+}
}

variant_index_types! { V0 V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18 V19 V20 V21 V22 V23 V24 V25 V26 V27 V28 V29 V30 V31 V32 }

macro_rules! enum_types {
    ($( $enum:ident<$($generic:ident),+>{ $($variant_name:ident)+ } )+) => {$(
        #[derive( Debug,PartialEq,Eq,PartialOrd,Ord )]
        pub enum $enum<$($generic),+> {
            $( $variant_name( $generic )),+
        }

        impl<$($generic),+> $enum<$($generic),+> {$(
            pub fn $variant_name( e: $generic ) -> Self {
                $enum::$variant_name( e )
            }
        )+}
    )+}
}

enum_types! {
     Enum1<T0>{ _0 }
     Enum2<T0,T1>{ _0 _1 }
     Enum3<T0,T1,T2>{ _0 _1 _2 }
     Enum4<T0,T1,T2,T3>{ _0 _1 _2 _3 }
     Enum5<T0,T1,T2,T3,T4>{ _0 _1 _2 _3 _4 }
     Enum6<T0,T1,T2,T3,T4,T5>{ _0 _1 _2 _3 _4 _5 }
     Enum7<T0,T1,T2,T3,T4,T5,T6>{ _0 _1 _2 _3 _4 _5 _6 }
     Enum8<T0,T1,T2,T3,T4,T5,T6,T7>{ _0 _1 _2 _3 _4 _5 _6 _7 }
     Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 }
     Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 }
     Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 }
     Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 }
     Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 }
     Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 }
     Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 }
     Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>{ _0 _1 _2 _3 _4 _5 _6 _7 _8 _9 _10 _11 _12 _13 _14 _15 }
}

macro_rules! from_variant {
    ( $enum:ident<$($generics:ident),+>, $variant_name:ident, $variant_ty:ident, $variant_idx:ident ) => {
        impl<$($generics),+> FromVariant<$variant_ty,$variant_idx> for $enum<$($generics),+> {
            fn from_variant( variant: $variant_ty ) -> Self {
                $enum::$variant_name( variant )
            }
        }
    }
}

from_variant!{ Enum1<T0>, _0, T0, V0 }

from_variant!{ Enum2<T0,T1>, _0, T0, V0 }
from_variant!{ Enum2<T0,T1>, _1, T1, V1 }

from_variant!{ Enum3<T0,T1,T2>, _0, T0, V0 }
from_variant!{ Enum3<T0,T1,T2>, _1, T1, V1 }
from_variant!{ Enum3<T0,T1,T2>, _2, T2, V2 }

from_variant!{ Enum4<T0,T1,T2,T3>, _0, T0, V0 }
from_variant!{ Enum4<T0,T1,T2,T3>, _1, T1, V1 }
from_variant!{ Enum4<T0,T1,T2,T3>, _2, T2, V2 }
from_variant!{ Enum4<T0,T1,T2,T3>, _3, T3, V3 }

from_variant!{ Enum5<T0,T1,T2,T3,T4>, _0, T0, V0 }
from_variant!{ Enum5<T0,T1,T2,T3,T4>, _1, T1, V1 }
from_variant!{ Enum5<T0,T1,T2,T3,T4>, _2, T2, V2 }
from_variant!{ Enum5<T0,T1,T2,T3,T4>, _3, T3, V3 }
from_variant!{ Enum5<T0,T1,T2,T3,T4>, _4, T4, V4 }

from_variant!{ Enum6<T0,T1,T2,T3,T4,T5>, _0, T0, V0 }
from_variant!{ Enum6<T0,T1,T2,T3,T4,T5>, _1, T1, V1 }
from_variant!{ Enum6<T0,T1,T2,T3,T4,T5>, _2, T2, V2 }
from_variant!{ Enum6<T0,T1,T2,T3,T4,T5>, _3, T3, V3 }
from_variant!{ Enum6<T0,T1,T2,T3,T4,T5>, _4, T4, V4 }
from_variant!{ Enum6<T0,T1,T2,T3,T4,T5>, _5, T5, V5 }

from_variant!{ Enum7<T0,T1,T2,T3,T4,T5,T6>, _0, T0, V0 }
from_variant!{ Enum7<T0,T1,T2,T3,T4,T5,T6>, _1, T1, V1 }
from_variant!{ Enum7<T0,T1,T2,T3,T4,T5,T6>, _2, T2, V2 }
from_variant!{ Enum7<T0,T1,T2,T3,T4,T5,T6>, _3, T3, V3 }
from_variant!{ Enum7<T0,T1,T2,T3,T4,T5,T6>, _4, T4, V4 }
from_variant!{ Enum7<T0,T1,T2,T3,T4,T5,T6>, _5, T5, V5 }
from_variant!{ Enum7<T0,T1,T2,T3,T4,T5,T6>, _6, T6, V6 }

from_variant!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>, _0, T0, V0 }
from_variant!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>, _1, T1, V1 }
from_variant!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>, _2, T2, V2 }
from_variant!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>, _3, T3, V3 }
from_variant!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>, _4, T4, V4 }
from_variant!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>, _5, T5, V5 }
from_variant!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>, _6, T6, V6 }
from_variant!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>, _7, T7, V7 }

from_variant!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>, _0, T0, V0 }
from_variant!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>, _1, T1, V1 }
from_variant!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>, _2, T2, V2 }
from_variant!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>, _3, T3, V3 }
from_variant!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>, _4, T4, V4 }
from_variant!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>, _5, T5, V5 }
from_variant!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>, _6, T6, V6 }
from_variant!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>, _7, T7, V7 }
from_variant!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>, _8, T8, V8 }

from_variant!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, _0, T0, V0 }
from_variant!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, _1, T1, V1 }
from_variant!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, _2, T2, V2 }
from_variant!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, _3, T3, V3 }
from_variant!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, _4, T4, V4 }
from_variant!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, _5, T5, V5 }
from_variant!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, _6, T6, V6 }
from_variant!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, _7, T7, V7 }
from_variant!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, _8, T8, V8 }
from_variant!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, _9, T9, V9 }

from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _0, T0, V0 }
from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _1, T1, V1 }
from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _2, T2, V2 }
from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _3, T3, V3 }
from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _4, T4, V4 }
from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _5, T5, V5 }
from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _6, T6, V6 }
from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _7, T7, V7 }
from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _8, T8, V8 }
from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _9, T9, V9 }
from_variant!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, _10, T10, V10 }

from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _0, T0, V0 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _1, T1, V1 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _2, T2, V2 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _3, T3, V3 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _4, T4, V4 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _5, T5, V5 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _6, T6, V6 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _7, T7, V7 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _8, T8, V8 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _9, T9, V9 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _10, T10, V10 }
from_variant!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, _11, T11, V11 }

from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _0, T0, V0 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _1, T1, V1 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _2, T2, V2 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _3, T3, V3 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _4, T4, V4 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _5, T5, V5 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _6, T6, V6 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _7, T7, V7 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _8, T8, V8 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _9, T9, V9 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _10, T10, V10 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _11, T11, V11 }
from_variant!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, _12, T12, V12 }

from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _0, T0, V0 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _1, T1, V1 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _2, T2, V2 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _3, T3, V3 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _4, T4, V4 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _5, T5, V5 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _6, T6, V6 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _7, T7, V7 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _8, T8, V8 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _9, T9, V9 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _10, T10, V10 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _11, T11, V11 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _12, T12, V12 }
from_variant!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, _13, T13, V13 }

from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _0, T0, V0 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _1, T1, V1 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _2, T2, V2 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _3, T3, V3 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _4, T4, V4 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _5, T5, V5 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _6, T6, V6 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _7, T7, V7 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _8, T8, V8 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _9, T9, V9 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _10, T10, V10 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _11, T11, V11 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _12, T12, V12 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _13, T13, V13 }
from_variant!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, _14, T14, V14 }
 
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _0, T0, V0 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _1, T1, V1 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _2, T2, V2 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _3, T3, V3 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _4, T4, V4 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _5, T5, V5 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _6, T6, V6 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _7, T7, V7 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _8, T8, V8 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _9, T9, V9 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _10, T10, V10 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _11, T11, V11 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _12, T12, V12 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _13, T13, V13 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _14, T14, V14 }
from_variant!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, _15, T15, V15 }

impl<U0> IntoEnumX<Enum1<U0>,Nil> for Enum0 {
    fn into_enumx( self ) -> Enum1<U0> { match self {} }
}

impl<L,T0,U0> IntoEnumX<Enum1<U0>,LR<L,Enum0>> for Enum1<T0>
    where Enum1<U0> : FromVariant<T0,L>
{
    fn into_enumx( self ) -> Enum1<U0> {
        match self {
            Enum1::_0(v) => Enum1::<U0>::from_variant( v ),
        }
    }
}

macro_rules! into_enum0 {
    ( $enum:ident<U0,$($generics:ident),+>, $descent_enum:ident ) => {
        impl<U0,$($generics),+> IntoEnumX<$enum<U0,$($generics),+>,Nil> for Enum0
            where Enum0 : IntoEnumX<$descent_enum<$($generics),+>,Nil>
        {
            fn into_enumx( self ) -> $enum<U0,$($generics),+> { match self {} }
        }
    }
}

macro_rules! into_enum1 {
    ( $enum:ident<$($generics:ident),+> ) => {
        impl<L,T0,$($generics),+> IntoEnumX<$enum<$($generics),+>,LR<L,Enum0>> for Enum1<T0>
            where $enum<$($generics),+> : FromVariant<T0,L>
        {
            fn into_enumx( self ) -> $enum<$($generics),+> {
                match self {
                    Enum1::_0(v) => $enum::<$($generics),+>::from_variant(v),
                }
            }
        }
    }
}

macro_rules! into_enumx {
    ( $src_enum:ident<T0,$($descent_generics:ident),+>, $dest_enum:ident<$($dest_generics:ident),+>, $descent_enum:ident{ $($dest_descent_variant_name:ident $src_descent_variant_name:ident)+ } ) => {
        impl<L,R,T0,$($descent_generics),+,$($dest_generics),+> IntoEnumX<$dest_enum<$($dest_generics),+>,LR<L,R>> for $src_enum<T0,$($descent_generics),+>
            where $dest_enum<$($dest_generics),+>       : FromVariant<T0,L>
                , $descent_enum<$($descent_generics),+> : IntoEnumX<$dest_enum<$($dest_generics),+>,R>
        {
            fn into_enumx( self ) -> $dest_enum<$($dest_generics),+> {
                match self {
                    $src_enum::_0(v) => $dest_enum::<$($dest_generics),+>::from_variant(v),
                    $( $src_enum::$src_descent_variant_name(v) => $descent_enum::$dest_descent_variant_name(v).into_enumx() ),+
                }
            }
        }
    }
}

into_enum0!{               Enum2<U0,U1>, Enum1 }
into_enum1!{               Enum2<U0,U1> }
into_enumx!{ Enum2<T0,T1>, Enum2<U0,U1>, Enum1{_0 _1} }

into_enum0!{                  Enum3<U0,U1,U2>, Enum2 }
into_enum1!{                  Enum3<U0,U1,U2> }
into_enumx!{ Enum2<T0,T1>,    Enum3<U0,U1,U2>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>, Enum3<U0,U1,U2>, Enum2{_0 _1 _1 _2} }

into_enum0!{                     Enum4<U0,U1,U2,U3>, Enum3 }
into_enum1!{                     Enum4<U0,U1,U2,U3> }
into_enumx!{ Enum2<T0,T1>,       Enum4<U0,U1,U2,U3>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,    Enum4<U0,U1,U2,U3>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>, Enum4<U0,U1,U2,U3>, Enum3{_0 _1 _1 _2 _2 _3} }

into_enum0!{                        Enum5<U0,U1,U2,U3,U4>, Enum4 }
into_enum1!{                        Enum5<U0,U1,U2,U3,U4> }
into_enumx!{ Enum2<T0,T1>,          Enum5<U0,U1,U2,U3,U4>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,       Enum5<U0,U1,U2,U3,U4>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,    Enum5<U0,U1,U2,U3,U4>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>, Enum5<U0,U1,U2,U3,U4>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }

into_enum0!{                           Enum6<U0,U1,U2,U3,U4,U5>, Enum5 }
into_enum1!{                           Enum6<U0,U1,U2,U3,U4,U5> }
into_enumx!{ Enum2<T0,T1>,             Enum6<U0,U1,U2,U3,U4,U5>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,          Enum6<U0,U1,U2,U3,U4,U5>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,       Enum6<U0,U1,U2,U3,U4,U5>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,    Enum6<U0,U1,U2,U3,U4,U5>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>, Enum6<U0,U1,U2,U3,U4,U5>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }

into_enum0!{                              Enum7<U0,U1,U2,U3,U4,U5,U6>, Enum6 }
into_enum1!{                              Enum7<U0,U1,U2,U3,U4,U5,U6> }
into_enumx!{ Enum2<T0,T1>,                Enum7<U0,U1,U2,U3,U4,U5,U6>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,             Enum7<U0,U1,U2,U3,U4,U5,U6>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,          Enum7<U0,U1,U2,U3,U4,U5,U6>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,       Enum7<U0,U1,U2,U3,U4,U5,U6>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>,    Enum7<U0,U1,U2,U3,U4,U5,U6>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }
into_enumx!{ Enum7<T0,T1,T2,T3,T4,T5,T6>, Enum7<U0,U1,U2,U3,U4,U5,U6>, Enum6{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6} }

into_enum0!{                                 Enum8<U0,U1,U2,U3,U4,U5,U6,U7>, Enum7 }
into_enum1!{                                 Enum8<U0,U1,U2,U3,U4,U5,U6,U7> }
into_enumx!{ Enum2<T0,T1>,                   Enum8<U0,U1,U2,U3,U4,U5,U6,U7>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,                Enum8<U0,U1,U2,U3,U4,U5,U6,U7>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,             Enum8<U0,U1,U2,U3,U4,U5,U6,U7>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,          Enum8<U0,U1,U2,U3,U4,U5,U6,U7>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>,       Enum8<U0,U1,U2,U3,U4,U5,U6,U7>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }
into_enumx!{ Enum7<T0,T1,T2,T3,T4,T5,T6>,    Enum8<U0,U1,U2,U3,U4,U5,U6,U7>, Enum6{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6} }
into_enumx!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>, Enum8<U0,U1,U2,U3,U4,U5,U6,U7>, Enum7{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7} }

into_enum0!{                                    Enum9<U0,U1,U2,U3,U4,U5,U6,U7,U8>, Enum8 }
into_enum1!{                                    Enum9<U0,U1,U2,U3,U4,U5,U6,U7,U8> }
into_enumx!{ Enum2<T0,T1>,                      Enum9<U0,U1,U2,U3,U4,U5,U6,U7,U8>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,                   Enum9<U0,U1,U2,U3,U4,U5,U6,U7,U8>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,                Enum9<U0,U1,U2,U3,U4,U5,U6,U7,U8>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,             Enum9<U0,U1,U2,U3,U4,U5,U6,U7,U8>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>,          Enum9<U0,U1,U2,U3,U4,U5,U6,U7,U8>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }
into_enumx!{ Enum7<T0,T1,T2,T3,T4,T5,T6>,       Enum9<U0,U1,U2,U3,U4,U5,U6,U7,U8>, Enum6{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6} }
into_enumx!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>,    Enum9<U0,U1,U2,U3,U4,U5,U6,U7,U8>, Enum7{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7} }
into_enumx!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>, Enum9<U0,U1,U2,U3,U4,U5,U6,U7,U8>, Enum8{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8} }

into_enum0!{                                        Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9>, Enum9 }
into_enum1!{                                        Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9> }
into_enumx!{ Enum2<T0,T1>,                          Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,                       Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,                    Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,                 Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>,              Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }
into_enumx!{ Enum7<T0,T1,T2,T3,T4,T5,T6>,           Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9>, Enum6{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6} }
into_enumx!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>,        Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9>, Enum7{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7} }
into_enumx!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>,     Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9>, Enum8{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8} }
into_enumx!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>, Enum10<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9>, Enum9{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9} }

into_enum0!{                                            Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum10 }
into_enum1!{                                            Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10> }
into_enumx!{ Enum2<T0,T1>,                              Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,                           Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,                        Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,                     Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>,                  Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }
into_enumx!{ Enum7<T0,T1,T2,T3,T4,T5,T6>,               Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum6{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6} }
into_enumx!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>,            Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum7{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7} }
into_enumx!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>,         Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum8{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8} }
into_enumx!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>,     Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum9{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9} }
into_enumx!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>, Enum11<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10>, Enum10{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10} }

into_enum0!{                                                Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum11 }
into_enum1!{                                                Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11> }
into_enumx!{ Enum2<T0,T1>,                                  Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,                               Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,                            Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,                         Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>,                      Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }
into_enumx!{ Enum7<T0,T1,T2,T3,T4,T5,T6>,                   Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum6{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6} }
into_enumx!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>,                Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum7{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7} }
into_enumx!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>,             Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum8{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8} }
into_enumx!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>,         Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum9{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9} }
into_enumx!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>,     Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum10{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10} }
into_enumx!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>, Enum12<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11>, Enum11{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11} }

into_enum0!{                                                    Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum12 }
into_enum1!{                                                    Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12> }
into_enumx!{ Enum2<T0,T1>,                                      Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,                                   Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,                                Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,                             Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>,                          Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }
into_enumx!{ Enum7<T0,T1,T2,T3,T4,T5,T6>,                       Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum6{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6} }
into_enumx!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>,                    Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum7{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7} }
into_enumx!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>,                 Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum8{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8} }
into_enumx!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>,             Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum9{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9} }
into_enumx!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>,         Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum10{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10} }
into_enumx!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>,     Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum11{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11} }
into_enumx!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>, Enum13<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12>, Enum12{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11 _11 _12} }

into_enum0!{                                                        Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum13 }
into_enum1!{                                                        Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13> }
into_enumx!{ Enum2<T0,T1>,                                          Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,                                       Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,                                    Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,                                 Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>,                              Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }
into_enumx!{ Enum7<T0,T1,T2,T3,T4,T5,T6>,                           Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum6{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6} }
into_enumx!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>,                        Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum7{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7} }
into_enumx!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>,                     Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum8{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8} }
into_enumx!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>,                 Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum9{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9} }
into_enumx!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>,             Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum10{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10} }
into_enumx!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>,         Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum11{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11} }
into_enumx!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>,     Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum12{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11 _11 _12} }
into_enumx!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>, Enum14<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13>, Enum13{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11 _11 _12 _12 _13} }

into_enum0!{                                                            Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum14 }
into_enum1!{                                                            Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14> }
into_enumx!{ Enum2<T0,T1>,                                              Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,                                           Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,                                        Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,                                     Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>,                                  Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }
into_enumx!{ Enum7<T0,T1,T2,T3,T4,T5,T6>,                               Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum6{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6} }
into_enumx!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>,                            Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum7{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7} }
into_enumx!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>,                         Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum8{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8} }
into_enumx!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>,                     Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum9{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9} }
into_enumx!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>,                 Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum10{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10} }
into_enumx!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>,             Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum11{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11} }
into_enumx!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>,         Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum12{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11 _11 _12} }
into_enumx!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>,     Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum13{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11 _11 _12 _12 _13} }
into_enumx!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>, Enum15<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14>, Enum14{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11 _11 _12 _12 _13 _13 _14} }

into_enum0!{                                                                Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum15 }
into_enum1!{                                                                Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15> }
into_enumx!{ Enum2<T0,T1>,                                                  Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum1{_0 _1} }
into_enumx!{ Enum3<T0,T1,T2>,                                               Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum2{_0 _1 _1 _2} }
into_enumx!{ Enum4<T0,T1,T2,T3>,                                            Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum3{_0 _1 _1 _2 _2 _3} }
into_enumx!{ Enum5<T0,T1,T2,T3,T4>,                                         Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum4{_0 _1 _1 _2 _2 _3 _3 _4} }
into_enumx!{ Enum6<T0,T1,T2,T3,T4,T5>,                                      Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum5{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5} }
into_enumx!{ Enum7<T0,T1,T2,T3,T4,T5,T6>,                                   Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum6{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6} }
into_enumx!{ Enum8<T0,T1,T2,T3,T4,T5,T6,T7>,                                Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum7{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7} }
into_enumx!{ Enum9<T0,T1,T2,T3,T4,T5,T6,T7,T8>,                             Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum8{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8} }
into_enumx!{ Enum10<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9>,                         Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum9{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9} }
into_enumx!{ Enum11<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10>,                     Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum10{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10} }
into_enumx!{ Enum12<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11>,                 Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum11{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11} }
into_enumx!{ Enum13<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12>,             Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum12{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11 _11 _12} }
into_enumx!{ Enum14<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13>,         Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum13{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11 _11 _12 _12 _13} }
into_enumx!{ Enum15<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14>,     Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum14{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11 _11 _12 _12 _13 _13 _14} }
into_enumx!{ Enum16<T0,T1,T2,T3,T4,T5,T6,T7,T8,T9,T10,T11,T12,T13,T14,T15>, Enum16<U0,U1,U2,U3,U4,U5,U6,U7,U8,U9,U10,U11,U12,U13,U14,U15>, Enum15{_0 _1 _1 _2 _2 _3 _3 _4 _4 _5 _5 _6 _6 _7 _7 _8 _8 _9 _9 _10 _10 _11 _11 _12 _12 _13 _13 _14 _14 _15} }

#[cfg(feature="enum17_enum32")]
include!("enum17_enum32.rs");

#[cfg( test )]
mod test {
    use super::*;

    mod test_unamed {
        use super::*;

        #[test]
        fn test_from_variant() {
            let enum1 = Enum1::<i32>::from_variant( 2018 );
            assert_eq!( enum1, Enum1::_0( 2018 ));
            let enum2 = Enum2::<i32,String>::from_variant( "rust".to_string() );
            assert_eq!( enum2, Enum2::_1( "rust".to_string() ));
            let enum3 = Enum3::<i32,String,bool>::from_variant( true );
            assert_eq!( enum3, Enum3::_2( true ));
        }

        #[test]
        fn test_into_enum() {
            let enum1: Enum1<i32> = 2018.into_enum();
            assert_eq!( enum1, Enum1::_0( 2018 ));

            let enum2: Enum2<i32,String> = "rust".to_string().into_enum();
            assert_eq!( enum2, Enum2::_1( "rust".to_string() ));

            let enum3: Enum3<i32,String,bool> = true.into_enum();
            assert_eq!( enum3, Enum3::_2( true ));
        }

        #[test]
        fn test_exchange_into() {
            let enum1 = Enum1::<i32>::from_variant( 2018 );

            let enum1: Enum1<i32> = enum1.into_enumx();
            assert_eq!( enum1, Enum1::_0( 2018 ));

            let enum2: Enum2<String,i32> = enum1.into_enumx();
            assert_eq!( enum2, Enum2::_1( 2018 ));

            let enum2: Enum2<i32,String> = enum2.into_enumx();
            assert_eq!( enum2, Enum2::_0( 2018 ));

            let enum3: Enum3<bool,String,i32> = enum2.into_enumx();
            assert_eq!( enum3, Enum3::_2( 2018 ));

            let enum3: Enum3<i32,String,bool> = enum3.into_enumx();
            assert_eq!( enum3, Enum3::_0( 2018 ));
        }

        #[test]
        fn test_exchange_from() {
            let enum1 = Enum1::<String>::from_variant( "rust".to_string() );

            let enum1 = Enum1::<String>::from_enumx( enum1 );
            assert_eq!( enum1, Enum1::_0( "rust".to_string() ));

            let enum2 = Enum2::<i32,String>::from_enumx( enum1 );
            assert_eq!( enum2, Enum2::_1( "rust".to_string() ));

            let enum2 = Enum2::<String,i32>::from_enumx( enum2 );
            assert_eq!( enum2, Enum2::_0( "rust".to_string() ));

            let enum3 = Enum3::<bool,i32,String>::from_enumx( enum2 );
            assert_eq!( enum3, Enum3::_2( "rust".to_string() ));

            let enum3 = Enum3::<String,i32,bool>::from_enumx( enum3 );
            assert_eq!( enum3, Enum3::_0( "rust".to_string() ));
        }
    }

    mod test_named {
        use super::*;
        use enumx_derive::Exchange;

        #[derive(Exchange,Debug,PartialEq,Eq)]
        enum One<T0> {
            The(T0),
        }

        #[derive(Exchange,Debug,PartialEq,Eq)]
        enum Two<T0,T1> {
            Formmer(T0),
            Latter(T1),
        }

        #[derive(Exchange,Debug,PartialEq,Eq)]
        enum Three<T0,T1,T2> {
            First(T0),
            Second(T1),
            Third(T2),
        }

        #[test]
        fn test_from_variant() {
            let one = One::<i32>::from_variant( 2018 );
            assert_eq!( one, One::The( 2018 ));
            let two = Two::<i32,String>::from_variant( "rust".to_string() );
            assert_eq!( two, Two::Latter( "rust".to_string() ));
            let three = Three::<i32,String,bool>::from_variant( true );
            assert_eq!( three, Three::Third( true ));
        }

        #[test]
        fn test_into_enum() {
            let one: One<i32> = 2018.into_enum();
            assert_eq!( one, One::The( 2018 ));

            let two: Two<i32,String> = "rust".to_string().into_enum();
            assert_eq!( two, Two::Latter( "rust".to_string() ));

            let three: Three<i32,String,bool> = true.into_enum();
            assert_eq!( three, Three::Third( true ));
        }

        #[test]
        fn test_exchange_into() {
            let one = One::<String>::from_variant( "rust".to_string() );

            let one: One<String> = one.exchange_into();
            assert_eq!( one, One::The( "rust".to_string() ));

            let two: Two<i32,String> = one.exchange_into();
            assert_eq!( two, Two::Latter( "rust".to_string() ));

            let two: Two<String,i32> = two.exchange_into();
            assert_eq!( two, Two::Formmer( "rust".to_string() ));

            let three: Three<bool,i32,String> = two.exchange_into();
            assert_eq!( three, Three::Third( "rust".to_string() ));

            let three: Three<String,i32,bool> = three.exchange_into();
            assert_eq!( three, Three::First( "rust".to_string() ));
        }

        #[test]
        fn test_exchange_from() {
            let one = One::<i32>::from_variant( 2018 );

            let one = One::<i32>::exchange_from( one );
            assert_eq!( one, One::The( 2018 ));

            let two = Two::<String,i32>::exchange_from( one );
            assert_eq!( two, Two::Latter( 2018 ));

            let two = Two::<i32,String>::exchange_from( two );
            assert_eq!( two, Two::Formmer( 2018 ));

            let three = Three::<bool,String,i32>::exchange_from( two );
            assert_eq!( three, Three::Third( 2018 ));

            let three = Three::<i32,String,bool>::exchange_from( three );
            assert_eq!( three, Three::First( 2018 ));
        }
    }
}