bitmaps/
types.rs

1// This Source Code Form is subject to the terms of the Mozilla Public
2// License, v. 2.0. If a copy of the MPL was not distributed with this
3// file, You can obtain one at http://mozilla.org/MPL/2.0/.
4
5use core::fmt::Debug;
6
7use typenum::*;
8
9/// A trait that defines generalised operations on a `Bits::Store` type.
10pub trait BitOps {
11    fn get(bits: &Self, index: usize) -> bool;
12    fn set(bits: &mut Self, index: usize, value: bool) -> bool;
13    fn len(bits: &Self) -> usize;
14    fn first_index(bits: &Self) -> Option<usize>;
15    fn bit_and(bits: &mut Self, other_bits: &Self);
16    fn bit_or(bits: &mut Self, other_bits: &Self);
17    fn bit_xor(bits: &mut Self, other_bits: &Self);
18    fn invert(bits: &mut Self);
19    fn make_mask(shift: usize) -> Self;
20    #[cfg(feature = "std")]
21    fn to_hex(bits: &Self) -> String;
22}
23
24impl BitOps for bool {
25    #[inline]
26    fn get(bits: &Self, index: usize) -> bool {
27        debug_assert!(index == 0);
28        *bits
29    }
30
31    #[inline]
32    fn set(bits: &mut Self, index: usize, value: bool) -> bool {
33        debug_assert!(index == 0);
34        core::mem::replace(bits, value)
35    }
36
37    #[inline]
38    fn len(bits: &Self) -> usize {
39        if *bits {
40            1
41        } else {
42            0
43        }
44    }
45
46    #[inline]
47    fn first_index(bits: &Self) -> Option<usize> {
48        if *bits {
49            Some(0)
50        } else {
51            None
52        }
53    }
54
55    #[inline]
56    fn bit_and(bits: &mut Self, other_bits: &Self) {
57        *bits &= *other_bits;
58    }
59
60    #[inline]
61    fn bit_or(bits: &mut Self, other_bits: &Self) {
62        *bits |= *other_bits;
63    }
64
65    #[inline]
66    fn bit_xor(bits: &mut Self, other_bits: &Self) {
67        *bits ^= *other_bits;
68    }
69
70    #[inline]
71    fn invert(bits: &mut Self) {
72        *bits = !*bits;
73    }
74
75    #[inline]
76    fn make_mask(shift: usize) -> Self {
77        shift > 0
78    }
79
80    #[cfg(feature = "std")]
81    fn to_hex(bits: &Self) -> String {
82        if *bits {
83            "1".to_owned()
84        } else {
85            "0".to_owned()
86        }
87    }
88}
89
90macro_rules! bitops_for {
91    ($target:ty) => {
92        impl BitOps for $target {
93            #[inline]
94            fn get(bits: &Self, index: usize) -> bool {
95                bits & (1 << index) != 0
96            }
97
98            #[inline]
99            fn set(bits: &mut Self, index: usize, value: bool) -> bool {
100                let mask = 1 << index;
101                let prev = *bits & mask;
102                if value {
103                    *bits |= mask;
104                } else {
105                    *bits &= !mask;
106                }
107                prev != 0
108            }
109
110            #[inline]
111            fn len(bits: &Self) -> usize {
112                bits.count_ones() as usize
113            }
114
115            #[inline]
116            fn first_index(bits: &Self) -> Option<usize> {
117                if *bits == 0 {
118                    None
119                } else {
120                    Some(bits.trailing_zeros() as usize)
121                }
122            }
123
124            #[inline]
125            fn bit_and(bits: &mut Self, other_bits: &Self) {
126                *bits &= *other_bits;
127            }
128
129            #[inline]
130            fn bit_or(bits: &mut Self, other_bits: &Self) {
131                *bits |= *other_bits;
132            }
133
134            #[inline]
135            fn bit_xor(bits: &mut Self, other_bits: &Self) {
136                *bits ^= *other_bits;
137            }
138
139            #[inline]
140            fn invert(bits: &mut Self) {
141                *bits = !*bits;
142            }
143
144            #[inline]
145            fn make_mask(shift: usize) -> Self {
146                (1 << shift) - 1
147            }
148
149            #[cfg(feature = "std")]
150            fn to_hex(bits: &Self) -> String {
151                format!("{:x}", bits)
152            }
153        }
154    };
155}
156
157macro_rules! bitops_for_big {
158    ($words:expr) => {
159        impl BitOps for [u128; $words] {
160            #[inline]
161            fn get(bits: &Self, index: usize) -> bool {
162                let word_index = index / 128;
163                let index = index & 127;
164                bits[word_index] & (1 << index) != 0
165            }
166
167            #[inline]
168            fn set(bits: &mut Self, index: usize, value: bool) -> bool {
169                let word_index = index / 128;
170                let index = index & 127;
171
172                let mask = 1 << (index & 127);
173                let bits = &mut bits[word_index];
174                let prev = *bits & mask;
175                if value {
176                    *bits |= mask;
177                } else {
178                    *bits &= !mask;
179                }
180                prev != 0
181            }
182
183            fn make_mask(shift: usize) -> Self {
184                let word_index = shift / 128;
185                let index = shift & 127;
186                let mut out = [0; $words];
187                for (chunk_index, chunk) in out.iter_mut().enumerate() {
188                    if chunk_index < word_index {
189                        *chunk = !0u128;
190                    } else if chunk_index == word_index {
191                        *chunk = (1 << index) - 1;
192                    } else {
193                        return out;
194                    }
195                }
196                out
197            }
198
199            #[inline]
200            fn len(bits: &Self) -> usize {
201                bits.iter().fold(0, |acc, next| acc + next.count_ones()) as usize
202            }
203
204            #[inline]
205            fn first_index(bits: &Self) -> Option<usize> {
206                for (index, part) in bits.iter().enumerate() {
207                    if *part != 0u128 {
208                        return Some(part.trailing_zeros() as usize + (128 * index));
209                    }
210                }
211                None
212            }
213
214            #[inline]
215            fn bit_and(bits: &mut Self, other_bits: &Self) {
216                for (left, right) in bits.iter_mut().zip(other_bits.iter()) {
217                    *left &= *right;
218                }
219            }
220
221            #[inline]
222            fn bit_or(bits: &mut Self, other_bits: &Self) {
223                for (left, right) in bits.iter_mut().zip(other_bits.iter()) {
224                    *left |= *right;
225                }
226            }
227
228            #[inline]
229            fn bit_xor(bits: &mut Self, other_bits: &Self) {
230                for (left, right) in bits.iter_mut().zip(other_bits.iter()) {
231                    *left ^= *right;
232                }
233            }
234
235            #[inline]
236            fn invert(bits: &mut Self) {
237                for chunk in bits.iter_mut() {
238                    *chunk = !*chunk;
239                }
240            }
241
242            #[cfg(feature = "std")]
243            fn to_hex(bits: &Self) -> String {
244                let mut out = String::new();
245                for chunk in bits {
246                    out += &format!("{:x}", chunk);
247                }
248                out
249            }
250        }
251    };
252}
253
254bitops_for!(u8);
255bitops_for!(u16);
256bitops_for!(u32);
257bitops_for!(u64);
258bitops_for!(u128);
259
260bitops_for_big!(2);
261bitops_for_big!(3);
262bitops_for_big!(4);
263bitops_for_big!(5);
264bitops_for_big!(6);
265bitops_for_big!(7);
266bitops_for_big!(8);
267
268/// A type level number signifying the number of bits in a bitmap.
269///
270/// This trait is implemented for type level numbers from `U1` to `U1024`.
271///
272/// # Examples
273///
274/// ```rust
275/// # #[macro_use] extern crate bitmaps;
276/// # use bitmaps::Bits;
277/// # use typenum::U10;
278/// assert_eq!(
279///     std::mem::size_of::<<U10 as Bits>::Store>(),
280///     std::mem::size_of::<u16>()
281/// );
282/// ```
283pub trait Bits: Unsigned {
284    /// A primitive integer type suitable for storing this many bits.
285    type Store: BitOps + Default + Copy + PartialEq + Debug;
286}
287
288impl Bits for U1 {
289    type Store = bool;
290}
291
292macro_rules! bits_for {
293    ($num:ty, $result:ty) => {
294        impl Bits for $num {
295            type Store = $result;
296        }
297    };
298}
299
300macro_rules! bits_for_big {
301    ($num:ty, $words:expr) => {
302        impl Bits for $num {
303            type Store = [u128; $words];
304        }
305    };
306}
307
308bits_for!(U2, u8);
309bits_for!(U3, u8);
310bits_for!(U4, u8);
311bits_for!(U5, u8);
312bits_for!(U6, u8);
313bits_for!(U7, u8);
314bits_for!(U8, u8);
315bits_for!(U9, u16);
316bits_for!(U10, u16);
317bits_for!(U11, u16);
318bits_for!(U12, u16);
319bits_for!(U13, u16);
320bits_for!(U14, u16);
321bits_for!(U15, u16);
322bits_for!(U16, u16);
323bits_for!(U17, u32);
324bits_for!(U18, u32);
325bits_for!(U19, u32);
326bits_for!(U20, u32);
327bits_for!(U21, u32);
328bits_for!(U22, u32);
329bits_for!(U23, u32);
330bits_for!(U24, u32);
331bits_for!(U25, u32);
332bits_for!(U26, u32);
333bits_for!(U27, u32);
334bits_for!(U28, u32);
335bits_for!(U29, u32);
336bits_for!(U30, u32);
337bits_for!(U31, u32);
338bits_for!(U32, u32);
339bits_for!(U33, u64);
340bits_for!(U34, u64);
341bits_for!(U35, u64);
342bits_for!(U36, u64);
343bits_for!(U37, u64);
344bits_for!(U38, u64);
345bits_for!(U39, u64);
346bits_for!(U40, u64);
347bits_for!(U41, u64);
348bits_for!(U42, u64);
349bits_for!(U43, u64);
350bits_for!(U44, u64);
351bits_for!(U45, u64);
352bits_for!(U46, u64);
353bits_for!(U47, u64);
354bits_for!(U48, u64);
355bits_for!(U49, u64);
356bits_for!(U50, u64);
357bits_for!(U51, u64);
358bits_for!(U52, u64);
359bits_for!(U53, u64);
360bits_for!(U54, u64);
361bits_for!(U55, u64);
362bits_for!(U56, u64);
363bits_for!(U57, u64);
364bits_for!(U58, u64);
365bits_for!(U59, u64);
366bits_for!(U60, u64);
367bits_for!(U61, u64);
368bits_for!(U62, u64);
369bits_for!(U63, u64);
370bits_for!(U64, u64);
371bits_for!(U65, u128);
372bits_for!(U66, u128);
373bits_for!(U67, u128);
374bits_for!(U68, u128);
375bits_for!(U69, u128);
376bits_for!(U70, u128);
377bits_for!(U71, u128);
378bits_for!(U72, u128);
379bits_for!(U73, u128);
380bits_for!(U74, u128);
381bits_for!(U75, u128);
382bits_for!(U76, u128);
383bits_for!(U77, u128);
384bits_for!(U78, u128);
385bits_for!(U79, u128);
386bits_for!(U80, u128);
387bits_for!(U81, u128);
388bits_for!(U82, u128);
389bits_for!(U83, u128);
390bits_for!(U84, u128);
391bits_for!(U85, u128);
392bits_for!(U86, u128);
393bits_for!(U87, u128);
394bits_for!(U88, u128);
395bits_for!(U89, u128);
396bits_for!(U90, u128);
397bits_for!(U91, u128);
398bits_for!(U92, u128);
399bits_for!(U93, u128);
400bits_for!(U94, u128);
401bits_for!(U95, u128);
402bits_for!(U96, u128);
403bits_for!(U97, u128);
404bits_for!(U98, u128);
405bits_for!(U99, u128);
406bits_for!(U100, u128);
407bits_for!(U101, u128);
408bits_for!(U102, u128);
409bits_for!(U103, u128);
410bits_for!(U104, u128);
411bits_for!(U105, u128);
412bits_for!(U106, u128);
413bits_for!(U107, u128);
414bits_for!(U108, u128);
415bits_for!(U109, u128);
416bits_for!(U110, u128);
417bits_for!(U111, u128);
418bits_for!(U112, u128);
419bits_for!(U113, u128);
420bits_for!(U114, u128);
421bits_for!(U115, u128);
422bits_for!(U116, u128);
423bits_for!(U117, u128);
424bits_for!(U118, u128);
425bits_for!(U119, u128);
426bits_for!(U120, u128);
427bits_for!(U121, u128);
428bits_for!(U122, u128);
429bits_for!(U123, u128);
430bits_for!(U124, u128);
431bits_for!(U125, u128);
432bits_for!(U126, u128);
433bits_for!(U127, u128);
434bits_for!(U128, u128);
435
436bits_for_big!(U129, 2);
437bits_for_big!(U130, 2);
438bits_for_big!(U131, 2);
439bits_for_big!(U132, 2);
440bits_for_big!(U133, 2);
441bits_for_big!(U134, 2);
442bits_for_big!(U135, 2);
443bits_for_big!(U136, 2);
444bits_for_big!(U137, 2);
445bits_for_big!(U138, 2);
446bits_for_big!(U139, 2);
447bits_for_big!(U140, 2);
448bits_for_big!(U141, 2);
449bits_for_big!(U142, 2);
450bits_for_big!(U143, 2);
451bits_for_big!(U144, 2);
452bits_for_big!(U145, 2);
453bits_for_big!(U146, 2);
454bits_for_big!(U147, 2);
455bits_for_big!(U148, 2);
456bits_for_big!(U149, 2);
457bits_for_big!(U150, 2);
458bits_for_big!(U151, 2);
459bits_for_big!(U152, 2);
460bits_for_big!(U153, 2);
461bits_for_big!(U154, 2);
462bits_for_big!(U155, 2);
463bits_for_big!(U156, 2);
464bits_for_big!(U157, 2);
465bits_for_big!(U158, 2);
466bits_for_big!(U159, 2);
467bits_for_big!(U160, 2);
468bits_for_big!(U161, 2);
469bits_for_big!(U162, 2);
470bits_for_big!(U163, 2);
471bits_for_big!(U164, 2);
472bits_for_big!(U165, 2);
473bits_for_big!(U166, 2);
474bits_for_big!(U167, 2);
475bits_for_big!(U168, 2);
476bits_for_big!(U169, 2);
477bits_for_big!(U170, 2);
478bits_for_big!(U171, 2);
479bits_for_big!(U172, 2);
480bits_for_big!(U173, 2);
481bits_for_big!(U174, 2);
482bits_for_big!(U175, 2);
483bits_for_big!(U176, 2);
484bits_for_big!(U177, 2);
485bits_for_big!(U178, 2);
486bits_for_big!(U179, 2);
487bits_for_big!(U180, 2);
488bits_for_big!(U181, 2);
489bits_for_big!(U182, 2);
490bits_for_big!(U183, 2);
491bits_for_big!(U184, 2);
492bits_for_big!(U185, 2);
493bits_for_big!(U186, 2);
494bits_for_big!(U187, 2);
495bits_for_big!(U188, 2);
496bits_for_big!(U189, 2);
497bits_for_big!(U190, 2);
498bits_for_big!(U191, 2);
499bits_for_big!(U192, 2);
500bits_for_big!(U193, 2);
501bits_for_big!(U194, 2);
502bits_for_big!(U195, 2);
503bits_for_big!(U196, 2);
504bits_for_big!(U197, 2);
505bits_for_big!(U198, 2);
506bits_for_big!(U199, 2);
507bits_for_big!(U200, 2);
508bits_for_big!(U201, 2);
509bits_for_big!(U202, 2);
510bits_for_big!(U203, 2);
511bits_for_big!(U204, 2);
512bits_for_big!(U205, 2);
513bits_for_big!(U206, 2);
514bits_for_big!(U207, 2);
515bits_for_big!(U208, 2);
516bits_for_big!(U209, 2);
517bits_for_big!(U210, 2);
518bits_for_big!(U211, 2);
519bits_for_big!(U212, 2);
520bits_for_big!(U213, 2);
521bits_for_big!(U214, 2);
522bits_for_big!(U215, 2);
523bits_for_big!(U216, 2);
524bits_for_big!(U217, 2);
525bits_for_big!(U218, 2);
526bits_for_big!(U219, 2);
527bits_for_big!(U220, 2);
528bits_for_big!(U221, 2);
529bits_for_big!(U222, 2);
530bits_for_big!(U223, 2);
531bits_for_big!(U224, 2);
532bits_for_big!(U225, 2);
533bits_for_big!(U226, 2);
534bits_for_big!(U227, 2);
535bits_for_big!(U228, 2);
536bits_for_big!(U229, 2);
537bits_for_big!(U230, 2);
538bits_for_big!(U231, 2);
539bits_for_big!(U232, 2);
540bits_for_big!(U233, 2);
541bits_for_big!(U234, 2);
542bits_for_big!(U235, 2);
543bits_for_big!(U236, 2);
544bits_for_big!(U237, 2);
545bits_for_big!(U238, 2);
546bits_for_big!(U239, 2);
547bits_for_big!(U240, 2);
548bits_for_big!(U241, 2);
549bits_for_big!(U242, 2);
550bits_for_big!(U243, 2);
551bits_for_big!(U244, 2);
552bits_for_big!(U245, 2);
553bits_for_big!(U246, 2);
554bits_for_big!(U247, 2);
555bits_for_big!(U248, 2);
556bits_for_big!(U249, 2);
557bits_for_big!(U250, 2);
558bits_for_big!(U251, 2);
559bits_for_big!(U252, 2);
560bits_for_big!(U253, 2);
561bits_for_big!(U254, 2);
562bits_for_big!(U255, 2);
563bits_for_big!(U256, 2);
564
565bits_for_big!(U257, 3);
566bits_for_big!(U258, 3);
567bits_for_big!(U259, 3);
568bits_for_big!(U260, 3);
569bits_for_big!(U261, 3);
570bits_for_big!(U262, 3);
571bits_for_big!(U263, 3);
572bits_for_big!(U264, 3);
573bits_for_big!(U265, 3);
574bits_for_big!(U266, 3);
575bits_for_big!(U267, 3);
576bits_for_big!(U268, 3);
577bits_for_big!(U269, 3);
578bits_for_big!(U270, 3);
579bits_for_big!(U271, 3);
580bits_for_big!(U272, 3);
581bits_for_big!(U273, 3);
582bits_for_big!(U274, 3);
583bits_for_big!(U275, 3);
584bits_for_big!(U276, 3);
585bits_for_big!(U277, 3);
586bits_for_big!(U278, 3);
587bits_for_big!(U279, 3);
588bits_for_big!(U280, 3);
589bits_for_big!(U281, 3);
590bits_for_big!(U282, 3);
591bits_for_big!(U283, 3);
592bits_for_big!(U284, 3);
593bits_for_big!(U285, 3);
594bits_for_big!(U286, 3);
595bits_for_big!(U287, 3);
596bits_for_big!(U288, 3);
597bits_for_big!(U289, 3);
598bits_for_big!(U290, 3);
599bits_for_big!(U291, 3);
600bits_for_big!(U292, 3);
601bits_for_big!(U293, 3);
602bits_for_big!(U294, 3);
603bits_for_big!(U295, 3);
604bits_for_big!(U296, 3);
605bits_for_big!(U297, 3);
606bits_for_big!(U298, 3);
607bits_for_big!(U299, 3);
608bits_for_big!(U300, 3);
609bits_for_big!(U301, 3);
610bits_for_big!(U302, 3);
611bits_for_big!(U303, 3);
612bits_for_big!(U304, 3);
613bits_for_big!(U305, 3);
614bits_for_big!(U306, 3);
615bits_for_big!(U307, 3);
616bits_for_big!(U308, 3);
617bits_for_big!(U309, 3);
618bits_for_big!(U310, 3);
619bits_for_big!(U311, 3);
620bits_for_big!(U312, 3);
621bits_for_big!(U313, 3);
622bits_for_big!(U314, 3);
623bits_for_big!(U315, 3);
624bits_for_big!(U316, 3);
625bits_for_big!(U317, 3);
626bits_for_big!(U318, 3);
627bits_for_big!(U319, 3);
628bits_for_big!(U320, 3);
629bits_for_big!(U321, 3);
630bits_for_big!(U322, 3);
631bits_for_big!(U323, 3);
632bits_for_big!(U324, 3);
633bits_for_big!(U325, 3);
634bits_for_big!(U326, 3);
635bits_for_big!(U327, 3);
636bits_for_big!(U328, 3);
637bits_for_big!(U329, 3);
638bits_for_big!(U330, 3);
639bits_for_big!(U331, 3);
640bits_for_big!(U332, 3);
641bits_for_big!(U333, 3);
642bits_for_big!(U334, 3);
643bits_for_big!(U335, 3);
644bits_for_big!(U336, 3);
645bits_for_big!(U337, 3);
646bits_for_big!(U338, 3);
647bits_for_big!(U339, 3);
648bits_for_big!(U340, 3);
649bits_for_big!(U341, 3);
650bits_for_big!(U342, 3);
651bits_for_big!(U343, 3);
652bits_for_big!(U344, 3);
653bits_for_big!(U345, 3);
654bits_for_big!(U346, 3);
655bits_for_big!(U347, 3);
656bits_for_big!(U348, 3);
657bits_for_big!(U349, 3);
658bits_for_big!(U350, 3);
659bits_for_big!(U351, 3);
660bits_for_big!(U352, 3);
661bits_for_big!(U353, 3);
662bits_for_big!(U354, 3);
663bits_for_big!(U355, 3);
664bits_for_big!(U356, 3);
665bits_for_big!(U357, 3);
666bits_for_big!(U358, 3);
667bits_for_big!(U359, 3);
668bits_for_big!(U360, 3);
669bits_for_big!(U361, 3);
670bits_for_big!(U362, 3);
671bits_for_big!(U363, 3);
672bits_for_big!(U364, 3);
673bits_for_big!(U365, 3);
674bits_for_big!(U366, 3);
675bits_for_big!(U367, 3);
676bits_for_big!(U368, 3);
677bits_for_big!(U369, 3);
678bits_for_big!(U370, 3);
679bits_for_big!(U371, 3);
680bits_for_big!(U372, 3);
681bits_for_big!(U373, 3);
682bits_for_big!(U374, 3);
683bits_for_big!(U375, 3);
684bits_for_big!(U376, 3);
685bits_for_big!(U377, 3);
686bits_for_big!(U378, 3);
687bits_for_big!(U379, 3);
688bits_for_big!(U380, 3);
689bits_for_big!(U381, 3);
690bits_for_big!(U382, 3);
691bits_for_big!(U383, 3);
692bits_for_big!(U384, 3);
693
694bits_for_big!(U385, 4);
695bits_for_big!(U386, 4);
696bits_for_big!(U387, 4);
697bits_for_big!(U388, 4);
698bits_for_big!(U389, 4);
699bits_for_big!(U390, 4);
700bits_for_big!(U391, 4);
701bits_for_big!(U392, 4);
702bits_for_big!(U393, 4);
703bits_for_big!(U394, 4);
704bits_for_big!(U395, 4);
705bits_for_big!(U396, 4);
706bits_for_big!(U397, 4);
707bits_for_big!(U398, 4);
708bits_for_big!(U399, 4);
709bits_for_big!(U400, 4);
710bits_for_big!(U401, 4);
711bits_for_big!(U402, 4);
712bits_for_big!(U403, 4);
713bits_for_big!(U404, 4);
714bits_for_big!(U405, 4);
715bits_for_big!(U406, 4);
716bits_for_big!(U407, 4);
717bits_for_big!(U408, 4);
718bits_for_big!(U409, 4);
719bits_for_big!(U410, 4);
720bits_for_big!(U411, 4);
721bits_for_big!(U412, 4);
722bits_for_big!(U413, 4);
723bits_for_big!(U414, 4);
724bits_for_big!(U415, 4);
725bits_for_big!(U416, 4);
726bits_for_big!(U417, 4);
727bits_for_big!(U418, 4);
728bits_for_big!(U419, 4);
729bits_for_big!(U420, 4);
730bits_for_big!(U421, 4);
731bits_for_big!(U422, 4);
732bits_for_big!(U423, 4);
733bits_for_big!(U424, 4);
734bits_for_big!(U425, 4);
735bits_for_big!(U426, 4);
736bits_for_big!(U427, 4);
737bits_for_big!(U428, 4);
738bits_for_big!(U429, 4);
739bits_for_big!(U430, 4);
740bits_for_big!(U431, 4);
741bits_for_big!(U432, 4);
742bits_for_big!(U433, 4);
743bits_for_big!(U434, 4);
744bits_for_big!(U435, 4);
745bits_for_big!(U436, 4);
746bits_for_big!(U437, 4);
747bits_for_big!(U438, 4);
748bits_for_big!(U439, 4);
749bits_for_big!(U440, 4);
750bits_for_big!(U441, 4);
751bits_for_big!(U442, 4);
752bits_for_big!(U443, 4);
753bits_for_big!(U444, 4);
754bits_for_big!(U445, 4);
755bits_for_big!(U446, 4);
756bits_for_big!(U447, 4);
757bits_for_big!(U448, 4);
758bits_for_big!(U449, 4);
759bits_for_big!(U450, 4);
760bits_for_big!(U451, 4);
761bits_for_big!(U452, 4);
762bits_for_big!(U453, 4);
763bits_for_big!(U454, 4);
764bits_for_big!(U455, 4);
765bits_for_big!(U456, 4);
766bits_for_big!(U457, 4);
767bits_for_big!(U458, 4);
768bits_for_big!(U459, 4);
769bits_for_big!(U460, 4);
770bits_for_big!(U461, 4);
771bits_for_big!(U462, 4);
772bits_for_big!(U463, 4);
773bits_for_big!(U464, 4);
774bits_for_big!(U465, 4);
775bits_for_big!(U466, 4);
776bits_for_big!(U467, 4);
777bits_for_big!(U468, 4);
778bits_for_big!(U469, 4);
779bits_for_big!(U470, 4);
780bits_for_big!(U471, 4);
781bits_for_big!(U472, 4);
782bits_for_big!(U473, 4);
783bits_for_big!(U474, 4);
784bits_for_big!(U475, 4);
785bits_for_big!(U476, 4);
786bits_for_big!(U477, 4);
787bits_for_big!(U478, 4);
788bits_for_big!(U479, 4);
789bits_for_big!(U480, 4);
790bits_for_big!(U481, 4);
791bits_for_big!(U482, 4);
792bits_for_big!(U483, 4);
793bits_for_big!(U484, 4);
794bits_for_big!(U485, 4);
795bits_for_big!(U486, 4);
796bits_for_big!(U487, 4);
797bits_for_big!(U488, 4);
798bits_for_big!(U489, 4);
799bits_for_big!(U490, 4);
800bits_for_big!(U491, 4);
801bits_for_big!(U492, 4);
802bits_for_big!(U493, 4);
803bits_for_big!(U494, 4);
804bits_for_big!(U495, 4);
805bits_for_big!(U496, 4);
806bits_for_big!(U497, 4);
807bits_for_big!(U498, 4);
808bits_for_big!(U499, 4);
809bits_for_big!(U500, 4);
810bits_for_big!(U501, 4);
811bits_for_big!(U502, 4);
812bits_for_big!(U503, 4);
813bits_for_big!(U504, 4);
814bits_for_big!(U505, 4);
815bits_for_big!(U506, 4);
816bits_for_big!(U507, 4);
817bits_for_big!(U508, 4);
818bits_for_big!(U509, 4);
819bits_for_big!(U510, 4);
820bits_for_big!(U511, 4);
821bits_for_big!(U512, 4);
822
823bits_for_big!(U513, 5);
824bits_for_big!(U514, 5);
825bits_for_big!(U515, 5);
826bits_for_big!(U516, 5);
827bits_for_big!(U517, 5);
828bits_for_big!(U518, 5);
829bits_for_big!(U519, 5);
830bits_for_big!(U520, 5);
831bits_for_big!(U521, 5);
832bits_for_big!(U522, 5);
833bits_for_big!(U523, 5);
834bits_for_big!(U524, 5);
835bits_for_big!(U525, 5);
836bits_for_big!(U526, 5);
837bits_for_big!(U527, 5);
838bits_for_big!(U528, 5);
839bits_for_big!(U529, 5);
840bits_for_big!(U530, 5);
841bits_for_big!(U531, 5);
842bits_for_big!(U532, 5);
843bits_for_big!(U533, 5);
844bits_for_big!(U534, 5);
845bits_for_big!(U535, 5);
846bits_for_big!(U536, 5);
847bits_for_big!(U537, 5);
848bits_for_big!(U538, 5);
849bits_for_big!(U539, 5);
850bits_for_big!(U540, 5);
851bits_for_big!(U541, 5);
852bits_for_big!(U542, 5);
853bits_for_big!(U543, 5);
854bits_for_big!(U544, 5);
855bits_for_big!(U545, 5);
856bits_for_big!(U546, 5);
857bits_for_big!(U547, 5);
858bits_for_big!(U548, 5);
859bits_for_big!(U549, 5);
860bits_for_big!(U550, 5);
861bits_for_big!(U551, 5);
862bits_for_big!(U552, 5);
863bits_for_big!(U553, 5);
864bits_for_big!(U554, 5);
865bits_for_big!(U555, 5);
866bits_for_big!(U556, 5);
867bits_for_big!(U557, 5);
868bits_for_big!(U558, 5);
869bits_for_big!(U559, 5);
870bits_for_big!(U560, 5);
871bits_for_big!(U561, 5);
872bits_for_big!(U562, 5);
873bits_for_big!(U563, 5);
874bits_for_big!(U564, 5);
875bits_for_big!(U565, 5);
876bits_for_big!(U566, 5);
877bits_for_big!(U567, 5);
878bits_for_big!(U568, 5);
879bits_for_big!(U569, 5);
880bits_for_big!(U570, 5);
881bits_for_big!(U571, 5);
882bits_for_big!(U572, 5);
883bits_for_big!(U573, 5);
884bits_for_big!(U574, 5);
885bits_for_big!(U575, 5);
886bits_for_big!(U576, 5);
887bits_for_big!(U577, 5);
888bits_for_big!(U578, 5);
889bits_for_big!(U579, 5);
890bits_for_big!(U580, 5);
891bits_for_big!(U581, 5);
892bits_for_big!(U582, 5);
893bits_for_big!(U583, 5);
894bits_for_big!(U584, 5);
895bits_for_big!(U585, 5);
896bits_for_big!(U586, 5);
897bits_for_big!(U587, 5);
898bits_for_big!(U588, 5);
899bits_for_big!(U589, 5);
900bits_for_big!(U590, 5);
901bits_for_big!(U591, 5);
902bits_for_big!(U592, 5);
903bits_for_big!(U593, 5);
904bits_for_big!(U594, 5);
905bits_for_big!(U595, 5);
906bits_for_big!(U596, 5);
907bits_for_big!(U597, 5);
908bits_for_big!(U598, 5);
909bits_for_big!(U599, 5);
910bits_for_big!(U600, 5);
911bits_for_big!(U601, 5);
912bits_for_big!(U602, 5);
913bits_for_big!(U603, 5);
914bits_for_big!(U604, 5);
915bits_for_big!(U605, 5);
916bits_for_big!(U606, 5);
917bits_for_big!(U607, 5);
918bits_for_big!(U608, 5);
919bits_for_big!(U609, 5);
920bits_for_big!(U610, 5);
921bits_for_big!(U611, 5);
922bits_for_big!(U612, 5);
923bits_for_big!(U613, 5);
924bits_for_big!(U614, 5);
925bits_for_big!(U615, 5);
926bits_for_big!(U616, 5);
927bits_for_big!(U617, 5);
928bits_for_big!(U618, 5);
929bits_for_big!(U619, 5);
930bits_for_big!(U620, 5);
931bits_for_big!(U621, 5);
932bits_for_big!(U622, 5);
933bits_for_big!(U623, 5);
934bits_for_big!(U624, 5);
935bits_for_big!(U625, 5);
936bits_for_big!(U626, 5);
937bits_for_big!(U627, 5);
938bits_for_big!(U628, 5);
939bits_for_big!(U629, 5);
940bits_for_big!(U630, 5);
941bits_for_big!(U631, 5);
942bits_for_big!(U632, 5);
943bits_for_big!(U633, 5);
944bits_for_big!(U634, 5);
945bits_for_big!(U635, 5);
946bits_for_big!(U636, 5);
947bits_for_big!(U637, 5);
948bits_for_big!(U638, 5);
949bits_for_big!(U639, 5);
950bits_for_big!(U640, 5);
951
952bits_for_big!(U641, 6);
953bits_for_big!(U642, 6);
954bits_for_big!(U643, 6);
955bits_for_big!(U644, 6);
956bits_for_big!(U645, 6);
957bits_for_big!(U646, 6);
958bits_for_big!(U647, 6);
959bits_for_big!(U648, 6);
960bits_for_big!(U649, 6);
961bits_for_big!(U650, 6);
962bits_for_big!(U651, 6);
963bits_for_big!(U652, 6);
964bits_for_big!(U653, 6);
965bits_for_big!(U654, 6);
966bits_for_big!(U655, 6);
967bits_for_big!(U656, 6);
968bits_for_big!(U657, 6);
969bits_for_big!(U658, 6);
970bits_for_big!(U659, 6);
971bits_for_big!(U660, 6);
972bits_for_big!(U661, 6);
973bits_for_big!(U662, 6);
974bits_for_big!(U663, 6);
975bits_for_big!(U664, 6);
976bits_for_big!(U665, 6);
977bits_for_big!(U666, 6);
978bits_for_big!(U667, 6);
979bits_for_big!(U668, 6);
980bits_for_big!(U669, 6);
981bits_for_big!(U670, 6);
982bits_for_big!(U671, 6);
983bits_for_big!(U672, 6);
984bits_for_big!(U673, 6);
985bits_for_big!(U674, 6);
986bits_for_big!(U675, 6);
987bits_for_big!(U676, 6);
988bits_for_big!(U677, 6);
989bits_for_big!(U678, 6);
990bits_for_big!(U679, 6);
991bits_for_big!(U680, 6);
992bits_for_big!(U681, 6);
993bits_for_big!(U682, 6);
994bits_for_big!(U683, 6);
995bits_for_big!(U684, 6);
996bits_for_big!(U685, 6);
997bits_for_big!(U686, 6);
998bits_for_big!(U687, 6);
999bits_for_big!(U688, 6);
1000bits_for_big!(U689, 6);
1001bits_for_big!(U690, 6);
1002bits_for_big!(U691, 6);
1003bits_for_big!(U692, 6);
1004bits_for_big!(U693, 6);
1005bits_for_big!(U694, 6);
1006bits_for_big!(U695, 6);
1007bits_for_big!(U696, 6);
1008bits_for_big!(U697, 6);
1009bits_for_big!(U698, 6);
1010bits_for_big!(U699, 6);
1011bits_for_big!(U700, 6);
1012bits_for_big!(U701, 6);
1013bits_for_big!(U702, 6);
1014bits_for_big!(U703, 6);
1015bits_for_big!(U704, 6);
1016bits_for_big!(U705, 6);
1017bits_for_big!(U706, 6);
1018bits_for_big!(U707, 6);
1019bits_for_big!(U708, 6);
1020bits_for_big!(U709, 6);
1021bits_for_big!(U710, 6);
1022bits_for_big!(U711, 6);
1023bits_for_big!(U712, 6);
1024bits_for_big!(U713, 6);
1025bits_for_big!(U714, 6);
1026bits_for_big!(U715, 6);
1027bits_for_big!(U716, 6);
1028bits_for_big!(U717, 6);
1029bits_for_big!(U718, 6);
1030bits_for_big!(U719, 6);
1031bits_for_big!(U720, 6);
1032bits_for_big!(U721, 6);
1033bits_for_big!(U722, 6);
1034bits_for_big!(U723, 6);
1035bits_for_big!(U724, 6);
1036bits_for_big!(U725, 6);
1037bits_for_big!(U726, 6);
1038bits_for_big!(U727, 6);
1039bits_for_big!(U728, 6);
1040bits_for_big!(U729, 6);
1041bits_for_big!(U730, 6);
1042bits_for_big!(U731, 6);
1043bits_for_big!(U732, 6);
1044bits_for_big!(U733, 6);
1045bits_for_big!(U734, 6);
1046bits_for_big!(U735, 6);
1047bits_for_big!(U736, 6);
1048bits_for_big!(U737, 6);
1049bits_for_big!(U738, 6);
1050bits_for_big!(U739, 6);
1051bits_for_big!(U740, 6);
1052bits_for_big!(U741, 6);
1053bits_for_big!(U742, 6);
1054bits_for_big!(U743, 6);
1055bits_for_big!(U744, 6);
1056bits_for_big!(U745, 6);
1057bits_for_big!(U746, 6);
1058bits_for_big!(U747, 6);
1059bits_for_big!(U748, 6);
1060bits_for_big!(U749, 6);
1061bits_for_big!(U750, 6);
1062bits_for_big!(U751, 6);
1063bits_for_big!(U752, 6);
1064bits_for_big!(U753, 6);
1065bits_for_big!(U754, 6);
1066bits_for_big!(U755, 6);
1067bits_for_big!(U756, 6);
1068bits_for_big!(U757, 6);
1069bits_for_big!(U758, 6);
1070bits_for_big!(U759, 6);
1071bits_for_big!(U760, 6);
1072bits_for_big!(U761, 6);
1073bits_for_big!(U762, 6);
1074bits_for_big!(U763, 6);
1075bits_for_big!(U764, 6);
1076bits_for_big!(U765, 6);
1077bits_for_big!(U766, 6);
1078bits_for_big!(U767, 6);
1079bits_for_big!(U768, 6);
1080
1081bits_for_big!(U769, 7);
1082bits_for_big!(U770, 7);
1083bits_for_big!(U771, 7);
1084bits_for_big!(U772, 7);
1085bits_for_big!(U773, 7);
1086bits_for_big!(U774, 7);
1087bits_for_big!(U775, 7);
1088bits_for_big!(U776, 7);
1089bits_for_big!(U777, 7);
1090bits_for_big!(U778, 7);
1091bits_for_big!(U779, 7);
1092bits_for_big!(U780, 7);
1093bits_for_big!(U781, 7);
1094bits_for_big!(U782, 7);
1095bits_for_big!(U783, 7);
1096bits_for_big!(U784, 7);
1097bits_for_big!(U785, 7);
1098bits_for_big!(U786, 7);
1099bits_for_big!(U787, 7);
1100bits_for_big!(U788, 7);
1101bits_for_big!(U789, 7);
1102bits_for_big!(U790, 7);
1103bits_for_big!(U791, 7);
1104bits_for_big!(U792, 7);
1105bits_for_big!(U793, 7);
1106bits_for_big!(U794, 7);
1107bits_for_big!(U795, 7);
1108bits_for_big!(U796, 7);
1109bits_for_big!(U797, 7);
1110bits_for_big!(U798, 7);
1111bits_for_big!(U799, 7);
1112bits_for_big!(U800, 7);
1113bits_for_big!(U801, 7);
1114bits_for_big!(U802, 7);
1115bits_for_big!(U803, 7);
1116bits_for_big!(U804, 7);
1117bits_for_big!(U805, 7);
1118bits_for_big!(U806, 7);
1119bits_for_big!(U807, 7);
1120bits_for_big!(U808, 7);
1121bits_for_big!(U809, 7);
1122bits_for_big!(U810, 7);
1123bits_for_big!(U811, 7);
1124bits_for_big!(U812, 7);
1125bits_for_big!(U813, 7);
1126bits_for_big!(U814, 7);
1127bits_for_big!(U815, 7);
1128bits_for_big!(U816, 7);
1129bits_for_big!(U817, 7);
1130bits_for_big!(U818, 7);
1131bits_for_big!(U819, 7);
1132bits_for_big!(U820, 7);
1133bits_for_big!(U821, 7);
1134bits_for_big!(U822, 7);
1135bits_for_big!(U823, 7);
1136bits_for_big!(U824, 7);
1137bits_for_big!(U825, 7);
1138bits_for_big!(U826, 7);
1139bits_for_big!(U827, 7);
1140bits_for_big!(U828, 7);
1141bits_for_big!(U829, 7);
1142bits_for_big!(U830, 7);
1143bits_for_big!(U831, 7);
1144bits_for_big!(U832, 7);
1145bits_for_big!(U833, 7);
1146bits_for_big!(U834, 7);
1147bits_for_big!(U835, 7);
1148bits_for_big!(U836, 7);
1149bits_for_big!(U837, 7);
1150bits_for_big!(U838, 7);
1151bits_for_big!(U839, 7);
1152bits_for_big!(U840, 7);
1153bits_for_big!(U841, 7);
1154bits_for_big!(U842, 7);
1155bits_for_big!(U843, 7);
1156bits_for_big!(U844, 7);
1157bits_for_big!(U845, 7);
1158bits_for_big!(U846, 7);
1159bits_for_big!(U847, 7);
1160bits_for_big!(U848, 7);
1161bits_for_big!(U849, 7);
1162bits_for_big!(U850, 7);
1163bits_for_big!(U851, 7);
1164bits_for_big!(U852, 7);
1165bits_for_big!(U853, 7);
1166bits_for_big!(U854, 7);
1167bits_for_big!(U855, 7);
1168bits_for_big!(U856, 7);
1169bits_for_big!(U857, 7);
1170bits_for_big!(U858, 7);
1171bits_for_big!(U859, 7);
1172bits_for_big!(U860, 7);
1173bits_for_big!(U861, 7);
1174bits_for_big!(U862, 7);
1175bits_for_big!(U863, 7);
1176bits_for_big!(U864, 7);
1177bits_for_big!(U865, 7);
1178bits_for_big!(U866, 7);
1179bits_for_big!(U867, 7);
1180bits_for_big!(U868, 7);
1181bits_for_big!(U869, 7);
1182bits_for_big!(U870, 7);
1183bits_for_big!(U871, 7);
1184bits_for_big!(U872, 7);
1185bits_for_big!(U873, 7);
1186bits_for_big!(U874, 7);
1187bits_for_big!(U875, 7);
1188bits_for_big!(U876, 7);
1189bits_for_big!(U877, 7);
1190bits_for_big!(U878, 7);
1191bits_for_big!(U879, 7);
1192bits_for_big!(U880, 7);
1193bits_for_big!(U881, 7);
1194bits_for_big!(U882, 7);
1195bits_for_big!(U883, 7);
1196bits_for_big!(U884, 7);
1197bits_for_big!(U885, 7);
1198bits_for_big!(U886, 7);
1199bits_for_big!(U887, 7);
1200bits_for_big!(U888, 7);
1201bits_for_big!(U889, 7);
1202bits_for_big!(U890, 7);
1203bits_for_big!(U891, 7);
1204bits_for_big!(U892, 7);
1205bits_for_big!(U893, 7);
1206bits_for_big!(U894, 7);
1207bits_for_big!(U895, 7);
1208bits_for_big!(U896, 7);
1209
1210bits_for_big!(U897, 8);
1211bits_for_big!(U898, 8);
1212bits_for_big!(U899, 8);
1213bits_for_big!(U900, 8);
1214bits_for_big!(U901, 8);
1215bits_for_big!(U902, 8);
1216bits_for_big!(U903, 8);
1217bits_for_big!(U904, 8);
1218bits_for_big!(U905, 8);
1219bits_for_big!(U906, 8);
1220bits_for_big!(U907, 8);
1221bits_for_big!(U908, 8);
1222bits_for_big!(U909, 8);
1223bits_for_big!(U910, 8);
1224bits_for_big!(U911, 8);
1225bits_for_big!(U912, 8);
1226bits_for_big!(U913, 8);
1227bits_for_big!(U914, 8);
1228bits_for_big!(U915, 8);
1229bits_for_big!(U916, 8);
1230bits_for_big!(U917, 8);
1231bits_for_big!(U918, 8);
1232bits_for_big!(U919, 8);
1233bits_for_big!(U920, 8);
1234bits_for_big!(U921, 8);
1235bits_for_big!(U922, 8);
1236bits_for_big!(U923, 8);
1237bits_for_big!(U924, 8);
1238bits_for_big!(U925, 8);
1239bits_for_big!(U926, 8);
1240bits_for_big!(U927, 8);
1241bits_for_big!(U928, 8);
1242bits_for_big!(U929, 8);
1243bits_for_big!(U930, 8);
1244bits_for_big!(U931, 8);
1245bits_for_big!(U932, 8);
1246bits_for_big!(U933, 8);
1247bits_for_big!(U934, 8);
1248bits_for_big!(U935, 8);
1249bits_for_big!(U936, 8);
1250bits_for_big!(U937, 8);
1251bits_for_big!(U938, 8);
1252bits_for_big!(U939, 8);
1253bits_for_big!(U940, 8);
1254bits_for_big!(U941, 8);
1255bits_for_big!(U942, 8);
1256bits_for_big!(U943, 8);
1257bits_for_big!(U944, 8);
1258bits_for_big!(U945, 8);
1259bits_for_big!(U946, 8);
1260bits_for_big!(U947, 8);
1261bits_for_big!(U948, 8);
1262bits_for_big!(U949, 8);
1263bits_for_big!(U950, 8);
1264bits_for_big!(U951, 8);
1265bits_for_big!(U952, 8);
1266bits_for_big!(U953, 8);
1267bits_for_big!(U954, 8);
1268bits_for_big!(U955, 8);
1269bits_for_big!(U956, 8);
1270bits_for_big!(U957, 8);
1271bits_for_big!(U958, 8);
1272bits_for_big!(U959, 8);
1273bits_for_big!(U960, 8);
1274bits_for_big!(U961, 8);
1275bits_for_big!(U962, 8);
1276bits_for_big!(U963, 8);
1277bits_for_big!(U964, 8);
1278bits_for_big!(U965, 8);
1279bits_for_big!(U966, 8);
1280bits_for_big!(U967, 8);
1281bits_for_big!(U968, 8);
1282bits_for_big!(U969, 8);
1283bits_for_big!(U970, 8);
1284bits_for_big!(U971, 8);
1285bits_for_big!(U972, 8);
1286bits_for_big!(U973, 8);
1287bits_for_big!(U974, 8);
1288bits_for_big!(U975, 8);
1289bits_for_big!(U976, 8);
1290bits_for_big!(U977, 8);
1291bits_for_big!(U978, 8);
1292bits_for_big!(U979, 8);
1293bits_for_big!(U980, 8);
1294bits_for_big!(U981, 8);
1295bits_for_big!(U982, 8);
1296bits_for_big!(U983, 8);
1297bits_for_big!(U984, 8);
1298bits_for_big!(U985, 8);
1299bits_for_big!(U986, 8);
1300bits_for_big!(U987, 8);
1301bits_for_big!(U988, 8);
1302bits_for_big!(U989, 8);
1303bits_for_big!(U990, 8);
1304bits_for_big!(U991, 8);
1305bits_for_big!(U992, 8);
1306bits_for_big!(U993, 8);
1307bits_for_big!(U994, 8);
1308bits_for_big!(U995, 8);
1309bits_for_big!(U996, 8);
1310bits_for_big!(U997, 8);
1311bits_for_big!(U998, 8);
1312bits_for_big!(U999, 8);
1313bits_for_big!(U1000, 8);
1314bits_for_big!(U1001, 8);
1315bits_for_big!(U1002, 8);
1316bits_for_big!(U1003, 8);
1317bits_for_big!(U1004, 8);
1318bits_for_big!(U1005, 8);
1319bits_for_big!(U1006, 8);
1320bits_for_big!(U1007, 8);
1321bits_for_big!(U1008, 8);
1322bits_for_big!(U1009, 8);
1323bits_for_big!(U1010, 8);
1324bits_for_big!(U1011, 8);
1325bits_for_big!(U1012, 8);
1326bits_for_big!(U1013, 8);
1327bits_for_big!(U1014, 8);
1328bits_for_big!(U1015, 8);
1329bits_for_big!(U1016, 8);
1330bits_for_big!(U1017, 8);
1331bits_for_big!(U1018, 8);
1332bits_for_big!(U1019, 8);
1333bits_for_big!(U1020, 8);
1334bits_for_big!(U1021, 8);
1335bits_for_big!(U1022, 8);
1336bits_for_big!(U1023, 8);
1337bits_for_big!(U1024, 8);