orx_meta/queue/
queue_of.rs

1/// Recall that there exist two statically-typed queue (`StQueue`) implementations:
2///
3/// * `QueueSingle` which includes exactly one element, and
4/// * `Queue` containing multiple (>=2) elements.
5///
6/// Queues of all lengths can be represented by these two types:
7/// * `QueueSingle<T1>` is a queue with one element,
8/// * `Queue<T1, QueueSingle<T2>>` with two elements,
9/// * `Queue<T1, Queue<T2, QueueSingle<T3>>>` with three elements,
10/// * `Queue<T1, Queue<T2, Queue<T3, QueueSingle<T4>>>>` with four elements,
11/// * and so on, so forth.
12///
13/// This is possible thanks to generic associated types and recursive type definition of the `Queue`.
14///
15/// On the other hand, it might make it difficult to hand-write queue types.
16///
17/// `queue_of` macro is a helper macro to make such type aliasing convenient whenever needed.
18///
19/// # Examples
20///
21/// ```
22/// use orx_meta::queue::*;
23/// use orx_meta::queue_of;
24///
25/// // written with recursive type definition
26/// type Q1 = Queue<i32, Queue<bool, Queue<char, QueueSingle<String>>>>;
27///
28/// let instance: Q1 = Queue::new(42).push(true).push('x').push("foo".to_string());
29/// assert_eq!(instance.as_tuple(), (&42, &true, &'x', &"foo".to_string()));
30///
31/// // alternatively, using with queue_of macro as a flat list
32/// type Q2 = queue_of!(i32, bool, char, String);
33///
34/// // notice that Q1 and Q2 are aliases for the same type
35/// let instance2: Q2 = instance;
36/// ```
37#[macro_export]
38macro_rules! queue_of {
39    ($t1:ty) => {
40        QueueSingle<$t1>
41    };
42
43    ($t1:ty, $t2:ty) => {
44        Queue<$t1, QueueSingle<$t2>>
45    };
46
47    ($t1:ty, $t2:ty, $t3:ty) => {
48        Queue<$t1, Queue<$t2, QueueSingle<$t3>>>
49    };
50
51    ($t1:ty, $t2:ty, $t3:ty, $t4:ty) => {
52        Queue<$t1, Queue<$t2, Queue<$t3, QueueSingle<$t4>>>>
53    };
54
55    ($t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty) => {
56        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, QueueSingle<$t5>>>>>
57    };
58
59    ($t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty) => {
60        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, QueueSingle<$t6>>>>>>
61    };
62
63    ($t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty, $t7:ty) => {
64        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, Queue<$t6, QueueSingle<$t7>>>>>>>
65    };
66
67    ($t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty, $t7:ty, $t8:ty) => {
68        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, Queue<$t6, Queue<$t7, QueueSingle<$t8>>>>>>>>
69    };
70
71    (
72        $t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty, $t7:ty, $t8:ty,
73        $t9:ty
74    ) => {
75        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, Queue<$t6, Queue<$t7, Queue<$t8,
76            QueueSingle<$t9>
77        >>>>>>>>
78    };
79
80    (
81        $t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty, $t7:ty, $t8:ty,
82        $t9:ty, $t10:ty
83    ) => {
84        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, Queue<$t6, Queue<$t7, Queue<$t8,
85            Queue<$t9, QueueSingle<$t10>>
86        >>>>>>>>
87    };
88
89    (
90        $t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty, $t7:ty, $t8:ty,
91        $t9:ty, $t10:ty, $t11:ty
92    ) => {
93        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, Queue<$t6, Queue<$t7, Queue<$t8,
94            Queue<$t9, Queue<$t10, QueueSingle<$t11>>>
95        >>>>>>>>
96    };
97
98    (
99        $t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty, $t7:ty, $t8:ty,
100        $t9:ty, $t10:ty, $t11:ty, $t12:ty
101    ) => {
102        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, Queue<$t6, Queue<$t7, Queue<$t8,
103            Queue<$t9, Queue<$t10, Queue<$t11, QueueSingle<$t12>>>>
104        >>>>>>>>
105    };
106
107    (
108        $t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty, $t7:ty, $t8:ty,
109        $t9:ty, $t10:ty, $t11:ty, $t12:ty, $t13:ty
110    ) => {
111        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, Queue<$t6, Queue<$t7, Queue<$t8,
112            Queue<$t9, Queue<$t10, Queue<$t11, Queue<$t12, QueueSingle<$t13>>>>>
113        >>>>>>>>
114    };
115
116    (
117        $t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty, $t7:ty, $t8:ty,
118        $t9:ty, $t10:ty, $t11:ty, $t12:ty, $t13:ty, $t14:ty
119    ) => {
120        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, Queue<$t6, Queue<$t7, Queue<$t8,
121            Queue<$t9, Queue<$t10, Queue<$t11, Queue<$t12, Queue<$t13, QueueSingle<$t14>>>>>>
122        >>>>>>>>
123    };
124
125    (
126        $t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty, $t7:ty, $t8:ty,
127        $t9:ty, $t10:ty, $t11:ty, $t12:ty, $t13:ty, $t14:ty, $t15:ty
128    ) => {
129        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, Queue<$t6, Queue<$t7, Queue<$t8,
130            Queue<$t9, Queue<$t10, Queue<$t11, Queue<$t12, Queue<$t13, Queue<$t14, QueueSingle<$t15>>>>>>>
131        >>>>>>>>
132    };
133
134    (
135        $t1:ty, $t2:ty, $t3:ty, $t4:ty, $t5:ty, $t6:ty, $t7:ty, $t8:ty,
136        $t9:ty, $t10:ty, $t11:ty, $t12:ty, $t13:ty, $t14:ty, $t15:ty, $t16:ty
137    ) => {
138        Queue<$t1, Queue<$t2, Queue<$t3, Queue<$t4, Queue<$t5, Queue<$t6, Queue<$t7, Queue<$t8,
139            Queue<$t9, Queue<$t10, Queue<$t11, Queue<$t12, Queue<$t13, Queue<$t14, Queue<$t15, QueueSingle<$t16>>>>>>>>
140        >>>>>>>>
141    };
142}