1use std::{
2 fmt::{self, Debug, Display, Formatter},
3};
4
5use crate::*;
6
7#[macro_export]
9macro_rules! format_array {
10 () => {
11 "".to_string()
12 };
13 ($data:expr) => {
14 format_array!($data, ", ", "{}")
15 };
16 ($data:expr, hex2) => {
17 format_array!($data, " ", "{:02x}")
18 };
19 ($data:expr, hex4) => {
20 format_array!($data, " ", "{:04x}")
21 };
22 ($data:expr, hex8) => {
23 format_array!($data, " ", "{:08x}")
24 };
25 ($data:expr, hex2arr) => {
26 format_array!($data, ", ", "0x{:02x}")
27 };
28 ($data:expr, hex4arr) => {
29 format_array!($data, ", ", "0x{:04x}")
30 };
31 ($data:expr, hex8arr) => {
32 format_array!($data, ", ", "0x{:08x}")
33 };
34 ($data:expr, debug) => {
35 format_array!($data, ", ", "{:?}")
36 };
37 ($data:expr, $delims:expr, $($arg:tt)*) => {
38 $data.iter().map(|&v|format!($($arg)*, v)).collect::<Vec<_>>().join($delims)
39 };
40}
41
42pub struct NestVecFormatter<'a, T>
43where
44 T: Display + Copy {
45 vec: &'a Vec<T>,
46}
47
48impl<'a, T> NestVecFormatter<'a, T>
49where
50 T: Display + Copy {
51 pub fn new(vec: &'a Vec<T>) -> Self {
52 Self {
53 vec,
54 }
55 }
56
57 pub fn new_level1(vec: &'a Vec<Vec<T>>) -> Vec<Self> {
58 let mut ret = Vec::with_capacity(vec.len());
59 for v in vec.iter() {
60 ret.push(Self::new(&v))
61 }
62 ret
63 }
64
65 pub fn new_level2(vec: &'a Vec<Vec<Vec<T>>>) -> Vec<Vec<Self>> {
66 let mut ret = Vec::with_capacity(vec.len());
67 for v in vec.iter() {
68 let mut new_v = Vec::with_capacity(v.len());
69 for v in v.iter() {
70 new_v.push(Self::new(&v))
71 }
72 ret.push(new_v)
73 }
74 ret
75 }
76}
77
78impl<T> Debug for NestVecFormatter<'_, T>
79where
80 T: Display + Copy {
81 fn fmt(&self, f: &mut Formatter) -> fmt::Result {
82 f.debug_list()
83 .entries(&[format_args!("[{}]", format_array!(&self.vec))])
84 .finish()
85 }
86}
87
88#[macro_export]
89macro_rules! debugln {
90 () => {
91 if SHOW_DEBUG {
92 println!("");
93 }
94 };
95 ($($arg:tt)*) => {
96 if SHOW_DEBUG {
97 println!($($arg)*);
98 }
99 };
100}
101
102#[macro_export]
103macro_rules! return_Err {
104 ($error:expr) => {
105 if PANIC_ON_ERROR {
106 panic!("{:?}", $error)
107 } else {
108 return Err($error)
109 }
110 }
111}
112
113#[macro_export]
114macro_rules! derive_index {
115 ($object:ident, $target:ident, $member:tt) => {
116 use std::ops::{Index, IndexMut, Range, RangeFrom, RangeTo, RangeFull};
117
118 impl Index<usize> for $object {
119 type Output = $target;
120
121 #[track_caller]
122 fn index(&self, index: usize) -> &$target {
123 &self.$member[index]
124 }
125 }
126
127 impl IndexMut<usize> for $object {
128 #[track_caller]
129 fn index_mut(&mut self, index: usize) -> &mut $target {
130 &mut self.$member[index]
131 }
132 }
133
134 impl Index<Range<usize>> for $object {
135 type Output = [$target];
136
137 #[track_caller]
138 fn index(&self, range: Range<usize>) -> &[$target] {
139 &self.$member[range]
140 }
141 }
142
143 impl IndexMut<Range<usize>> for $object {
144 #[track_caller]
145 fn index_mut(&mut self, range: Range<usize>) -> &mut [$target] {
146 &mut self.$member[range]
147 }
148 }
149
150 impl Index<RangeFrom<usize>> for $object {
151 type Output = [$target];
152
153 #[track_caller]
154 fn index(&self, range: RangeFrom<usize>) -> &[$target] {
155 &self.$member[range]
156 }
157 }
158
159 impl IndexMut<RangeFrom<usize>> for $object {
160 #[track_caller]
161 fn index_mut(&mut self, range: RangeFrom<usize>) -> &mut [$target] {
162 &mut self.$member[range]
163 }
164 }
165
166 impl Index<RangeTo<usize>> for $object {
167 type Output = [$target];
168
169 #[track_caller]
170 fn index(&self, range: RangeTo<usize>) -> &[$target] {
171 &self.$member[range]
172 }
173 }
174
175 impl IndexMut<RangeTo<usize>> for $object {
176 #[track_caller]
177 fn index_mut(&mut self, range: RangeTo<usize>) -> &mut [$target] {
178 &mut self.$member[range]
179 }
180 }
181
182 impl Index<RangeFull> for $object {
183 type Output = [$target];
184
185 #[track_caller]
186 fn index(&self, _range: RangeFull) -> &[$target] {
187 &self.$member[..]
188 }
189 }
190
191 impl IndexMut<RangeFull> for $object {
192 #[track_caller]
193 fn index_mut(&mut self, _range: RangeFull) -> &mut [$target] {
194 &mut self.$member[..]
195 }
196 }
197 }
198}
199
200#[macro_export]
201macro_rules! rint {
202 ($x:expr) => {
203 ($x.floor() + 0.5) as i32
204 };
205}
206
207#[macro_export]
208macro_rules! vecvec {
209 [[$val:expr; $len1:expr]; $len2:expr] => {
210 (0..$len2).map(|_|vec![$val; $len1]).collect::<Vec<_>>()
211 }
212}
213
214#[macro_export]
215macro_rules! field {
216 ($prev:ident, $self:ident, $field:tt) => {
217 $prev.field(stringify!($field), &$self.$field)
218 }
219}
220
221#[macro_export]
222macro_rules! field_array {
223 ($prev:ident, $self:ident, $field:tt) => {
224 $prev.field(stringify!($field), &format_args!("[{}]", format_array!($self.$field)))
225 }
226}