1#[crate::stabby]
3#[derive(Clone, Copy, Default, Debug, Ord, PartialEq, PartialOrd, Eq, Hash)]
4pub struct IllegalValue;
5impl core::fmt::Display for IllegalValue {
6 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
7 core::fmt::Debug::fmt(&self, f)
8 }
9}
10#[cfg(feature = "std")]
11impl std::error::Error for IllegalValue {}
12
13macro_rules! define_non_max {
14 ($NonMaxU8:ident: $u8: ty = $NonZeroU8: ty; $u8s: literal ) => {
15 #[repr(transparent)]
19 #[derive(Clone, Copy, PartialEq, Eq)]
20 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
21 #[cfg_attr(feature = "serde", serde(into = $u8s))]
22 #[cfg_attr(feature = "serde", serde(try_from = $u8s))]
23 pub struct $NonMaxU8 {
24 inner: $NonZeroU8,
25 }
26 impl $NonMaxU8 {
27 pub const fn new(n: $u8) -> Option<Self> {
29 match <$NonZeroU8>::new(!n) {
30 Some(n) => Some(Self { inner: n }),
31 None => None,
32 }
33 }
34 pub const unsafe fn new_unchecked(n: $u8) -> Self {
39 Self {
40 inner: <$NonZeroU8>::new_unchecked(!n),
41 }
42 }
43 pub const fn get(self) -> $u8 {
45 !self.inner.get()
46 }
47 }
48 impl From<$NonMaxU8> for $u8 {
49 fn from(value: $NonMaxU8) -> Self {
50 value.get()
51 }
52 }
53 impl TryFrom<$u8> for $NonMaxU8 {
54 type Error = IllegalValue;
55 fn try_from(value: $u8) -> Result<Self, Self::Error> {
56 Self::new(value).ok_or(IllegalValue)
57 }
58 }
59 impl PartialOrd for $NonMaxU8 {
60 fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
61 Some(self.cmp(other))
62 }
63 }
64 impl Ord for $NonMaxU8 {
65 fn cmp(&self, other: &Self) -> core::cmp::Ordering {
66 self.get().cmp(&other.get())
67 }
68 }
69 impl core::hash::Hash for $NonMaxU8 {
70 fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
71 self.get().hash(state)
72 }
73 }
74 unsafe impl crate::IStable for $NonMaxU8 {
75 type Size = <$NonZeroU8 as crate::IStable>::Size;
76 type Align = <$NonZeroU8 as crate::IStable>::Align;
77 type ForbiddenValues = <$NonZeroU8 as crate::IStable>::ForbiddenValues;
78 type UnusedBits = <$NonZeroU8 as crate::IStable>::UnusedBits;
79 type HasExactlyOneNiche = <$NonZeroU8 as crate::IStable>::HasExactlyOneNiche;
80 type ContainsIndirections = <$NonZeroU8 as crate::IStable>::ContainsIndirections;
81 #[cfg(feature = "experimental-ctypes")]
82 type CType = <$NonZeroU8 as crate::IStable>::CType;
83 const ID: u64 = $crate::report::gen_id(Self::REPORT);
84 const REPORT: &'static $crate::report::TypeReport = &$crate::report::TypeReport {
85 name: $crate::str::Str::new(stringify!($NonMaxU8)),
86 module: $crate::str::Str::new(core::module_path!()),
87 fields: $crate::StableLike::new(None),
88 version: 0,
89 tyty: $crate::report::TyTy::Struct,
90 };
91 }
92 };
93}
94macro_rules! define_non_x {
95 ($NonMaxU8:ident: $u8: ty = $NonZeroU8: ty; $u8s: literal ) => {
96 #[repr(transparent)]
100 #[derive(Clone, Copy, PartialEq, Eq)]
101 #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
102 #[cfg_attr(feature = "serde", serde(into = $u8s))]
103 #[cfg_attr(feature = "serde", serde(try_from = $u8s))]
104 pub struct $NonMaxU8<const FORBIDDEN: $u8> {
105 inner: $NonZeroU8,
106 }
107 impl<const FORBIDDEN: $u8> $NonMaxU8<{ FORBIDDEN }> {
108 pub const fn new(n: $u8) -> Option<Self> {
110 match <$NonZeroU8>::new(n.wrapping_sub(FORBIDDEN)) {
111 Some(n) => Some(Self { inner: n }),
112 None => None,
113 }
114 }
115 pub const unsafe fn new_unchecked(n: $u8) -> Self {
120 Self {
121 inner: <$NonZeroU8>::new_unchecked(n.wrapping_sub(FORBIDDEN)),
122 }
123 }
124 pub const fn get(self) -> $u8 {
126 self.inner.get().wrapping_add(FORBIDDEN)
127 }
128 }
129 impl<const FORBIDDEN: $u8> From<$NonMaxU8<{ FORBIDDEN }>> for $u8 {
130 fn from(value: $NonMaxU8<{ FORBIDDEN }>) -> Self {
131 value.get()
132 }
133 }
134 impl<const FORBIDDEN: $u8> TryFrom<$u8> for $NonMaxU8<{ FORBIDDEN }> {
135 type Error = IllegalValue;
136 fn try_from(value: $u8) -> Result<Self, Self::Error> {
137 Self::new(value).ok_or(IllegalValue)
138 }
139 }
140 impl<const FORBIDDEN: $u8> PartialOrd for $NonMaxU8<{ FORBIDDEN }> {
141 fn partial_cmp(&self, other: &Self) -> Option<core::cmp::Ordering> {
142 Some(self.cmp(other))
143 }
144 }
145 impl<const FORBIDDEN: $u8> Ord for $NonMaxU8<{ FORBIDDEN }> {
146 fn cmp(&self, other: &Self) -> core::cmp::Ordering {
147 self.get().cmp(&other.get())
148 }
149 }
150 impl<const FORBIDDEN: $u8> core::hash::Hash for $NonMaxU8<{ FORBIDDEN }> {
151 fn hash<H: core::hash::Hasher>(&self, state: &mut H) {
152 self.get().hash(state)
153 }
154 }
155 unsafe impl<const FORBIDDEN: $u8> crate::IStable for $NonMaxU8<{ FORBIDDEN }> {
156 type Size = <$NonZeroU8 as crate::IStable>::Size;
157 type Align = <$NonZeroU8 as crate::IStable>::Align;
158 type ForbiddenValues = <$NonZeroU8 as crate::IStable>::ForbiddenValues;
159 type UnusedBits = <$NonZeroU8 as crate::IStable>::UnusedBits;
160 type HasExactlyOneNiche = <$NonZeroU8 as crate::IStable>::HasExactlyOneNiche;
161 type ContainsIndirections = <$NonZeroU8 as crate::IStable>::ContainsIndirections;
162 #[cfg(feature = "experimental-ctypes")]
163 type CType = <$NonZeroU8 as crate::IStable>::CType;
164 const ID: u64 = $crate::report::gen_id(Self::REPORT);
165 const REPORT: &'static $crate::report::TypeReport = &$crate::report::TypeReport {
166 name: $crate::str::Str::new(stringify!($NonMaxU8)),
167 module: $crate::str::Str::new(core::module_path!()),
168 fields: $crate::StableLike::new(None),
169 version: 0,
170 tyty: $crate::report::TyTy::Struct,
171 };
172 }
173 };
174}
175
176define_non_max!(NonMaxU8: u8 = core::num::NonZeroU8; "u8");
177define_non_max!(NonMaxU16: u16 = core::num::NonZeroU16; "u16");
178define_non_max!(NonMaxU32: u32 = core::num::NonZeroU32; "u32");
179define_non_max!(NonMaxU64: u64 = core::num::NonZeroU64; "u64");
180define_non_max!(NonMaxU128: u128 = core::num::NonZeroU128; "u128");
181define_non_max!(NonMaxUsize: usize = core::num::NonZeroUsize; "usize");
182
183define_non_x!(NonXU8: u8 = core::num::NonZeroU8; "u8");
184define_non_x!(NonXU16: u16 = core::num::NonZeroU16; "u16");
185define_non_x!(NonXU32: u32 = core::num::NonZeroU32; "u32");
186define_non_x!(NonXU64: u64 = core::num::NonZeroU64; "u64");
187define_non_x!(NonXU128: u128 = core::num::NonZeroU128; "u128");
188define_non_x!(NonXUsize: usize = core::num::NonZeroUsize; "usize");
189define_non_x!(NonXI8: i8 = core::num::NonZeroI8; "i8");
190define_non_x!(NonXI16: i16 = core::num::NonZeroI16; "i16");
191define_non_x!(NonXI32: i32 = core::num::NonZeroI32; "i32");
192define_non_x!(NonXI64: i64 = core::num::NonZeroI64; "i64");
193define_non_x!(NonXI128: i128 = core::num::NonZeroI128; "i128");
194define_non_x!(NonXIsize: isize = core::num::NonZeroIsize; "isize");
195
196macro_rules! makeutest {
197 ($u8: ident, $NonMaxU8: ident, $NonXU8: ident) => {
198 #[test]
199 fn $u8() {
200 for i in 0..255 {
201 assert_eq!($NonMaxU8::new(i).unwrap().get(), i);
202 assert_eq!($NonXU8::<{ $u8::MAX }>::new(i).unwrap().get(), i);
203 }
204 assert!($NonMaxU8::new($u8::MAX).is_none());
205 assert!($NonXU8::<{ $u8::MAX }>::new($u8::MAX).is_none());
206 assert!($NonXU8::<72>::new(72).is_none());
207 for i in 0..=255 {
208 if i != 72 {
209 assert_eq!($NonXU8::<72>::new(i).unwrap().get(), i);
210 }
211 }
212 }
213 };
214}
215makeutest!(u8, NonMaxU8, NonXU8);
216makeutest!(u16, NonMaxU16, NonXU16);
217makeutest!(u32, NonMaxU32, NonXU32);
218makeutest!(u64, NonMaxU64, NonXU64);
219makeutest!(u128, NonMaxU128, NonXU128);
220makeutest!(usize, NonMaxUsize, NonXUsize);
221macro_rules! makeitest {
222 ($i8: ident, $NonXI8: ident) => {
223 #[test]
224 fn $i8() {
225 for i in -127..=127 {
226 assert_eq!($NonXI8::<{ $i8::MIN }>::new(i).unwrap().get(), i);
227 }
228 assert!($NonXI8::<{ $i8::MIN }>::new($i8::MIN).is_none());
229 assert!($NonXI8::<72>::new(72).is_none());
230 for i in -128..=127 {
231 if i != 72 {
232 assert_eq!($NonXI8::<72>::new(i).unwrap().get(), i);
233 }
234 }
235 }
236 };
237}
238makeitest!(i8, NonXI8);
239makeitest!(i16, NonXI16);
240makeitest!(i32, NonXI32);
241makeitest!(i64, NonXI64);
242makeitest!(i128, NonXI128);
243makeitest!(isize, NonXIsize);
244
245macro_rules! makeumask {
246 ($name: ident, $base: ident, $bits: ty, $docs: literal) => {
247 #[doc = $docs]
248 #[allow(non_camel_case_types)]
255 #[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Default)]
256 pub struct $name($base);
257 impl $name {
258 const MASK: $base = $base::MAX
259 >> (8 * ::core::mem::size_of::<$base>() as $base
260 - <$bits as $crate::typenum2::Unsigned>::U128 as $base);
261 pub const MAX: Self = Self(Self::MASK);
263 pub const MIN: Self = Self(0);
265 pub const fn new(value: $base) -> Option<Self> {
267 match value <= Self::MASK {
268 true => Some(Self(value)),
269 false => None,
270 }
271 }
272 pub const fn get(&self) -> $base {
274 self.0 & Self::MASK
275 }
276 }
277 impl ::core::fmt::Debug for $name {
278 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
279 ::core::fmt::Debug::fmt(&self.0, f)
280 }
281 }
282 impl ::core::fmt::Display for $name {
283 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
284 ::core::fmt::Display::fmt(&self.0, f)
285 }
286 }
287 impl ::core::fmt::LowerHex for $name {
288 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
289 ::core::fmt::LowerHex::fmt(&self.0, f)
290 }
291 }
292 impl ::core::fmt::UpperHex for $name {
293 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
294 ::core::fmt::UpperHex::fmt(&self.0, f)
295 }
296 }
297 impl ::core::fmt::LowerExp for $name {
298 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
299 ::core::fmt::LowerExp::fmt(&self.0, f)
300 }
301 }
302 impl ::core::fmt::UpperExp for $name {
303 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
304 ::core::fmt::UpperExp::fmt(&self.0, f)
305 }
306 }
307 impl ::core::fmt::Binary for $name {
308 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
309 ::core::fmt::Binary::fmt(&self.0, f)
310 }
311 }
312 impl ::core::fmt::Octal for $name {
313 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
314 ::core::fmt::Octal::fmt(&self.0, f)
315 }
316 }
317 impl ::core::ops::BitAnd<$base> for $name {
318 type Output = Self;
319 fn bitand(self, rhs: $base) -> Self {
320 Self(self.0 & rhs)
321 }
322 }
323 impl ::core::ops::BitAnd for $name {
324 type Output = Self;
325 fn bitand(self, rhs: Self) -> Self {
326 Self(self.0 & rhs.0)
327 }
328 }
329 impl<T> ::core::ops::BitAndAssign<T> for $name
330 where
331 Self: ::core::ops::BitAnd<T, Output = Self>,
332 {
333 fn bitand_assign(&mut self, rhs: T) {
334 *self = *self & rhs;
335 }
336 }
337 impl ::core::ops::BitOr for $name {
338 type Output = Self;
339 fn bitor(self, rhs: Self) -> Self {
340 Self(self.0 | rhs.0)
341 }
342 }
343 impl ::core::ops::BitOr<$base> for $name {
344 type Output = $base;
345 fn bitor(self, rhs: $base) -> $base {
346 self.get() | rhs
347 }
348 }
349 impl<T> ::core::ops::BitOrAssign<T> for $name
350 where
351 Self: ::core::ops::BitOr<T, Output = Self>,
352 {
353 fn bitor_assign(&mut self, rhs: T) {
354 *self = *self | rhs;
355 }
356 }
357 impl ::core::ops::Add for $name {
358 type Output = $base;
359 fn add(self, rhs: Self) -> $base {
360 unsafe { self.get().checked_add(rhs.get()).unwrap_unchecked() }
362 }
363 }
364 impl ::core::ops::Sub<$base> for $name {
365 type Output = Self;
366 fn sub(self, rhs: $base) -> Self {
367 Self(self.get() - rhs)
368 }
369 }
370 impl ::core::ops::Sub for $name {
371 type Output = Self;
372 fn sub(self, rhs: Self) -> Self {
373 Self(self.get() - rhs.get())
374 }
375 }
376 };
377}
378
379macro_rules! makeimask {
380 ($name: ident, $base: ident, $bits: ty, $docs: literal) => {
381 #[doc = $docs]
382 #[allow(non_camel_case_types)]
389 #[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Default)]
390 pub struct $name($base);
391 impl $name {
392 const MASK: $base = ($base::MAX
393 >> (8 * ::core::mem::size_of::<$base>() as i32
394 - <$bits as $crate::typenum2::Unsigned>::U128 as i32))
395 | (1 << (<$bits as $crate::typenum2::Unsigned>::U128 as i32 - 1));
396 pub const MAX: Self =
398 Self($base::MAX >> (<$bits as $crate::typenum2::Unsigned>::U128 as $base));
399 pub const MIN: Self =
401 Self(1 << (<$bits as $crate::typenum2::Unsigned>::U128 as i32 - 1));
402 pub const fn new(value: $base) -> Option<Self> {
404 match value <= Self::MAX.get() && value >= Self::MIN.get() {
405 true => Some(Self(value)),
406 false => None,
407 }
408 }
409 const fn sign_extend(value: $base) -> $base {
410 const SHIFT: i32 = (8 * ::core::mem::size_of::<$base>() as i32
411 - <$bits as $crate::typenum2::Unsigned>::U128 as i32);
412 value | ((value & Self::MIN.0) << SHIFT) >> (SHIFT - 1)
413 }
414 pub const fn get(&self) -> $base {
416 Self::sign_extend(self.0 & Self::MASK)
417 }
418 }
419 impl ::core::fmt::Debug for $name {
420 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
421 ::core::fmt::Debug::fmt(&self.0, f)
422 }
423 }
424 impl ::core::fmt::Display for $name {
425 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
426 ::core::fmt::Display::fmt(&self.0, f)
427 }
428 }
429 impl ::core::fmt::LowerHex for $name {
430 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
431 ::core::fmt::LowerHex::fmt(&self.0, f)
432 }
433 }
434 impl ::core::fmt::UpperHex for $name {
435 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
436 ::core::fmt::UpperHex::fmt(&self.0, f)
437 }
438 }
439 impl ::core::fmt::LowerExp for $name {
440 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
441 ::core::fmt::LowerExp::fmt(&self.0, f)
442 }
443 }
444 impl ::core::fmt::UpperExp for $name {
445 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
446 ::core::fmt::UpperExp::fmt(&self.0, f)
447 }
448 }
449 impl ::core::fmt::Binary for $name {
450 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
451 ::core::fmt::Binary::fmt(&self.0, f)
452 }
453 }
454 impl ::core::fmt::Octal for $name {
455 fn fmt(&self, f: &mut ::core::fmt::Formatter<'_>) -> core::fmt::Result {
456 ::core::fmt::Octal::fmt(&self.0, f)
457 }
458 }
459 impl ::core::ops::BitAnd<$base> for $name {
460 type Output = Self;
461 fn bitand(self, rhs: $base) -> Self {
462 Self(self.0 & rhs)
463 }
464 }
465 impl ::core::ops::BitAnd for $name {
466 type Output = Self;
467 fn bitand(self, rhs: Self) -> Self {
468 Self(self.0 & rhs.0)
469 }
470 }
471 impl<T> ::core::ops::BitAndAssign<T> for $name
472 where
473 Self: ::core::ops::BitAnd<T, Output = Self>,
474 {
475 fn bitand_assign(&mut self, rhs: T) {
476 *self = *self & rhs;
477 }
478 }
479 impl ::core::ops::BitOr for $name {
480 type Output = Self;
481 fn bitor(self, rhs: Self) -> Self {
482 Self(self.0 | rhs.0)
483 }
484 }
485 impl<T> ::core::ops::BitOrAssign<T> for $name
486 where
487 Self: ::core::ops::BitOr<T, Output = Self>,
488 {
489 fn bitor_assign(&mut self, rhs: T) {
490 *self = *self | rhs;
491 }
492 }
493 };
494}
495
496#[test]
497fn numbers() {
498 macro_rules! deftest {
499 ($name: ty, $base: ty) => {
500 for i in (<$base>::MIN..<$base>::MAX)
501 .rev()
502 .step_by(<$base>::MAX as usize / 127)
503 {
504 let Some(n) = <$name>::new(dbg!(i)) else {
505 assert!(i > <$name>::MAX.get() || i < <$name>::MIN.get());
506 continue;
507 };
508 assert_eq!(n.get(), i);
509 assert!(i <= dbg!(<$name>::MAX.get()));
510 assert!(i >= dbg!(<$name>::MIN.get()));
511 }
512 };
513 }
514 deftest!(u6, u8);
515 deftest!(u26, u32);
516 deftest!(i6, i8);
517 deftest!(i26, i32);
518}
519
520makeumask!(u1, u8, crate::typenum2::U1, "A 1 bit unsigned integer");
521makeumask!(u2, u8, crate::typenum2::U2, "A 2 bit unsigned integer");
522makeumask!(u3, u8, crate::typenum2::U3, "A 3 bit unsigned integer");
523makeumask!(u4, u8, crate::typenum2::U4, "A 4 bit unsigned integer");
524makeumask!(u5, u8, crate::typenum2::U5, "A 5 bit unsigned integer");
525makeumask!(u6, u8, crate::typenum2::U6, "A 6 bit unsigned integer");
526makeumask!(u7, u8, crate::typenum2::U7, "A 7 bit unsigned integer");
527
528makeumask!(u9, u16, crate::typenum2::U9, "A 9 bit unsigned integer");
529makeumask!(u10, u16, crate::typenum2::U10, "A 10 bit unsigned integer");
530makeumask!(u11, u16, crate::typenum2::U11, "A 11 bit unsigned integer");
531makeumask!(u12, u16, crate::typenum2::U12, "A 12 bit unsigned integer");
532makeumask!(u13, u16, crate::typenum2::U13, "A 13 bit unsigned integer");
533makeumask!(u14, u16, crate::typenum2::U14, "A 14 bit unsigned integer");
534makeumask!(u15, u16, crate::typenum2::U15, "A 15 bit unsigned integer");
535
536makeumask!(u17, u32, crate::typenum2::U17, "A 17 bit unsigned integer");
537makeumask!(u18, u32, crate::typenum2::U18, "A 18 bit unsigned integer");
538makeumask!(u19, u32, crate::typenum2::U19, "A 19 bit unsigned integer");
539makeumask!(u20, u32, crate::typenum2::U20, "A 20 bit unsigned integer");
540makeumask!(u21, u32, crate::typenum2::U21, "A 21 bit unsigned integer");
541makeumask!(u22, u32, crate::typenum2::U22, "A 22 bit unsigned integer");
542makeumask!(u23, u32, crate::typenum2::U23, "A 23 bit unsigned integer");
543makeumask!(u24, u32, crate::typenum2::U24, "A 24 bit unsigned integer");
544makeumask!(u25, u32, crate::typenum2::U25, "A 25 bit unsigned integer");
545makeumask!(u26, u32, crate::typenum2::U26, "A 26 bit unsigned integer");
546makeumask!(u27, u32, crate::typenum2::U27, "A 27 bit unsigned integer");
547makeumask!(u28, u32, crate::typenum2::U28, "A 28 bit unsigned integer");
548makeumask!(u29, u32, crate::typenum2::U29, "A 29 bit unsigned integer");
549makeumask!(u30, u32, crate::typenum2::U30, "A 30 bit unsigned integer");
550makeumask!(u31, u32, crate::typenum2::U31, "A 31 bit unsigned integer");
551
552makeumask!(u33, u64, crate::typenum2::U33, "A 33 bit unsigned integer");
553makeumask!(u34, u64, crate::typenum2::U34, "A 34 bit unsigned integer");
554makeumask!(u35, u64, crate::typenum2::U35, "A 35 bit unsigned integer");
555makeumask!(u36, u64, crate::typenum2::U36, "A 36 bit unsigned integer");
556makeumask!(u37, u64, crate::typenum2::U37, "A 37 bit unsigned integer");
557makeumask!(u38, u64, crate::typenum2::U38, "A 38 bit unsigned integer");
558makeumask!(u39, u64, crate::typenum2::U39, "A 39 bit unsigned integer");
559makeumask!(u40, u64, crate::typenum2::U40, "A 40 bit unsigned integer");
560makeumask!(u41, u64, crate::typenum2::U41, "A 41 bit unsigned integer");
561makeumask!(u42, u64, crate::typenum2::U42, "A 42 bit unsigned integer");
562makeumask!(u43, u64, crate::typenum2::U43, "A 43 bit unsigned integer");
563makeumask!(u44, u64, crate::typenum2::U44, "A 44 bit unsigned integer");
564makeumask!(u45, u64, crate::typenum2::U45, "A 45 bit unsigned integer");
565makeumask!(u46, u64, crate::typenum2::U46, "A 46 bit unsigned integer");
566makeumask!(u47, u64, crate::typenum2::U47, "A 47 bit unsigned integer");
567makeumask!(u48, u64, crate::typenum2::U48, "A 48 bit unsigned integer");
568makeumask!(u49, u64, crate::typenum2::U49, "A 49 bit unsigned integer");
569makeumask!(u50, u64, crate::typenum2::U50, "A 50 bit unsigned integer");
570makeumask!(u51, u64, crate::typenum2::U51, "A 51 bit unsigned integer");
571makeumask!(u52, u64, crate::typenum2::U52, "A 52 bit unsigned integer");
572makeumask!(u53, u64, crate::typenum2::U53, "A 53 bit unsigned integer");
573makeumask!(u54, u64, crate::typenum2::U54, "A 54 bit unsigned integer");
574makeumask!(u55, u64, crate::typenum2::U55, "A 55 bit unsigned integer");
575makeumask!(u56, u64, crate::typenum2::U56, "A 56 bit unsigned integer");
576makeumask!(u57, u64, crate::typenum2::U57, "A 57 bit unsigned integer");
577makeumask!(u58, u64, crate::typenum2::U58, "A 58 bit unsigned integer");
578makeumask!(u59, u64, crate::typenum2::U59, "A 59 bit unsigned integer");
579makeumask!(u60, u64, crate::typenum2::U60, "A 60 bit unsigned integer");
580makeumask!(u61, u64, crate::typenum2::U61, "A 61 bit unsigned integer");
581makeumask!(u62, u64, crate::typenum2::U62, "A 62 bit unsigned integer");
582makeumask!(u63, u64, crate::typenum2::U63, "A 63 bit unsigned integer");
583
584makeumask!(u65, u128, crate::typenum2::U65, "A 65 bit unsigned integer");
585makeumask!(u66, u128, crate::typenum2::U66, "A 66 bit unsigned integer");
586makeumask!(u67, u128, crate::typenum2::U67, "A 67 bit unsigned integer");
587makeumask!(u68, u128, crate::typenum2::U68, "A 68 bit unsigned integer");
588makeumask!(u69, u128, crate::typenum2::U69, "A 69 bit unsigned integer");
589makeumask!(u70, u128, crate::typenum2::U70, "A 70 bit unsigned integer");
590makeumask!(u71, u128, crate::typenum2::U71, "A 71 bit unsigned integer");
591makeumask!(u72, u128, crate::typenum2::U72, "A 72 bit unsigned integer");
592makeumask!(u73, u128, crate::typenum2::U73, "A 73 bit unsigned integer");
593makeumask!(u74, u128, crate::typenum2::U74, "A 74 bit unsigned integer");
594makeumask!(u75, u128, crate::typenum2::U75, "A 75 bit unsigned integer");
595makeumask!(u76, u128, crate::typenum2::U76, "A 76 bit unsigned integer");
596makeumask!(u77, u128, crate::typenum2::U77, "A 77 bit unsigned integer");
597makeumask!(u78, u128, crate::typenum2::U78, "A 78 bit unsigned integer");
598makeumask!(u79, u128, crate::typenum2::U79, "A 79 bit unsigned integer");
599makeumask!(u80, u128, crate::typenum2::U80, "A 80 bit unsigned integer");
600makeumask!(u81, u128, crate::typenum2::U81, "A 81 bit unsigned integer");
601makeumask!(u82, u128, crate::typenum2::U82, "A 82 bit unsigned integer");
602makeumask!(u83, u128, crate::typenum2::U83, "A 83 bit unsigned integer");
603makeumask!(u84, u128, crate::typenum2::U84, "A 84 bit unsigned integer");
604makeumask!(u85, u128, crate::typenum2::U85, "A 85 bit unsigned integer");
605makeumask!(u86, u128, crate::typenum2::U86, "A 86 bit unsigned integer");
606makeumask!(u87, u128, crate::typenum2::U87, "A 87 bit unsigned integer");
607makeumask!(u88, u128, crate::typenum2::U88, "A 88 bit unsigned integer");
608makeumask!(u89, u128, crate::typenum2::U89, "A 89 bit unsigned integer");
609makeumask!(u90, u128, crate::typenum2::U90, "A 90 bit unsigned integer");
610makeumask!(u91, u128, crate::typenum2::U91, "A 91 bit unsigned integer");
611makeumask!(u92, u128, crate::typenum2::U92, "A 92 bit unsigned integer");
612makeumask!(u93, u128, crate::typenum2::U93, "A 93 bit unsigned integer");
613makeumask!(u94, u128, crate::typenum2::U94, "A 94 bit unsigned integer");
614makeumask!(u95, u128, crate::typenum2::U95, "A 95 bit unsigned integer");
615makeumask!(u96, u128, crate::typenum2::U96, "A 96 bit unsigned integer");
616makeumask!(u97, u128, crate::typenum2::U97, "A 97 bit unsigned integer");
617makeumask!(u98, u128, crate::typenum2::U98, "A 98 bit unsigned integer");
618makeumask!(u99, u128, crate::typenum2::U99, "A 99 bit unsigned integer");
619makeumask!(
620 u100,
621 u128,
622 crate::typenum2::U100,
623 "A 100 bit unsigned integer"
624);
625makeumask!(
626 u101,
627 u128,
628 crate::typenum2::U101,
629 "A 101 bit unsigned integer"
630);
631makeumask!(
632 u102,
633 u128,
634 crate::typenum2::U102,
635 "A 102 bit unsigned integer"
636);
637makeumask!(
638 u103,
639 u128,
640 crate::typenum2::U103,
641 "A 103 bit unsigned integer"
642);
643makeumask!(
644 u104,
645 u128,
646 crate::typenum2::U104,
647 "A 104 bit unsigned integer"
648);
649makeumask!(
650 u105,
651 u128,
652 crate::typenum2::U105,
653 "A 105 bit unsigned integer"
654);
655makeumask!(
656 u106,
657 u128,
658 crate::typenum2::U106,
659 "A 106 bit unsigned integer"
660);
661makeumask!(
662 u107,
663 u128,
664 crate::typenum2::U107,
665 "A 107 bit unsigned integer"
666);
667makeumask!(
668 u108,
669 u128,
670 crate::typenum2::U108,
671 "A 108 bit unsigned integer"
672);
673makeumask!(
674 u109,
675 u128,
676 crate::typenum2::U109,
677 "A 109 bit unsigned integer"
678);
679makeumask!(
680 u110,
681 u128,
682 crate::typenum2::U110,
683 "A 110 bit unsigned integer"
684);
685makeumask!(
686 u111,
687 u128,
688 crate::typenum2::U111,
689 "A 111 bit unsigned integer"
690);
691makeumask!(
692 u112,
693 u128,
694 crate::typenum2::U112,
695 "A 112 bit unsigned integer"
696);
697makeumask!(
698 u113,
699 u128,
700 crate::typenum2::U113,
701 "A 113 bit unsigned integer"
702);
703makeumask!(
704 u114,
705 u128,
706 crate::typenum2::U114,
707 "A 114 bit unsigned integer"
708);
709makeumask!(
710 u115,
711 u128,
712 crate::typenum2::U115,
713 "A 115 bit unsigned integer"
714);
715makeumask!(
716 u116,
717 u128,
718 crate::typenum2::U116,
719 "A 116 bit unsigned integer"
720);
721makeumask!(
722 u117,
723 u128,
724 crate::typenum2::U117,
725 "A 117 bit unsigned integer"
726);
727makeumask!(
728 u118,
729 u128,
730 crate::typenum2::U118,
731 "A 118 bit unsigned integer"
732);
733makeumask!(
734 u119,
735 u128,
736 crate::typenum2::U119,
737 "A 119 bit unsigned integer"
738);
739makeumask!(
740 u120,
741 u128,
742 crate::typenum2::U120,
743 "A 120 bit unsigned integer"
744);
745makeumask!(
746 u121,
747 u128,
748 crate::typenum2::U121,
749 "A 121 bit unsigned integer"
750);
751makeumask!(
752 u122,
753 u128,
754 crate::typenum2::U122,
755 "A 122 bit unsigned integer"
756);
757makeumask!(
758 u123,
759 u128,
760 crate::typenum2::U123,
761 "A 123 bit unsigned integer"
762);
763makeumask!(
764 u124,
765 u128,
766 crate::typenum2::U124,
767 "A 124 bit unsigned integer"
768);
769makeumask!(
770 u125,
771 u128,
772 crate::typenum2::U125,
773 "A 125 bit unsigned integer"
774);
775makeumask!(
776 u126,
777 u128,
778 crate::typenum2::U126,
779 "A 126 bit unsigned integer"
780);
781makeumask!(
782 u127,
783 u128,
784 crate::typenum2::U127,
785 "A 127 bit unsigned integer"
786);
787
788makeimask!(i1, i8, crate::typenum2::U1, "A 1 bit signed integer");
789makeimask!(i2, i8, crate::typenum2::U2, "A 2 bit signed integer");
790makeimask!(i3, i8, crate::typenum2::U3, "A 3 bit signed integer");
791makeimask!(i4, i8, crate::typenum2::U4, "A 4 bit signed integer");
792makeimask!(i5, i8, crate::typenum2::U5, "A 5 bit signed integer");
793makeimask!(i6, i8, crate::typenum2::U6, "A 6 bit signed integer");
794makeimask!(i7, i8, crate::typenum2::U7, "A 7 bit signed integer");
795
796makeimask!(i9, i16, crate::typenum2::U9, "A 9 bit signed integer");
797makeimask!(i10, i16, crate::typenum2::U10, "A 10 bit signed integer");
798makeimask!(i11, i16, crate::typenum2::U11, "A 11 bit signed integer");
799makeimask!(i12, i16, crate::typenum2::U12, "A 12 bit signed integer");
800makeimask!(i13, i16, crate::typenum2::U13, "A 13 bit signed integer");
801makeimask!(i14, i16, crate::typenum2::U14, "A 14 bit signed integer");
802makeimask!(i15, i16, crate::typenum2::U15, "A 15 bit signed integer");
803
804makeimask!(i17, i32, crate::typenum2::U17, "A 17 bit signed integer");
805makeimask!(i18, i32, crate::typenum2::U18, "A 18 bit signed integer");
806makeimask!(i19, i32, crate::typenum2::U19, "A 19 bit signed integer");
807makeimask!(i20, i32, crate::typenum2::U20, "A 20 bit signed integer");
808makeimask!(i21, i32, crate::typenum2::U21, "A 21 bit signed integer");
809makeimask!(i22, i32, crate::typenum2::U22, "A 22 bit signed integer");
810makeimask!(i23, i32, crate::typenum2::U23, "A 23 bit signed integer");
811makeimask!(i24, i32, crate::typenum2::U24, "A 24 bit signed integer");
812makeimask!(i25, i32, crate::typenum2::U25, "A 25 bit signed integer");
813makeimask!(i26, i32, crate::typenum2::U26, "A 26 bit signed integer");
814makeimask!(i27, i32, crate::typenum2::U27, "A 27 bit signed integer");
815makeimask!(i28, i32, crate::typenum2::U28, "A 28 bit signed integer");
816makeimask!(i29, i32, crate::typenum2::U29, "A 29 bit signed integer");
817makeimask!(i30, i32, crate::typenum2::U30, "A 30 bit signed integer");
818makeimask!(i31, i32, crate::typenum2::U31, "A 31 bit signed integer");
819
820makeimask!(i33, i64, crate::typenum2::U33, "A 33 bit signed integer");
821makeimask!(i34, i64, crate::typenum2::U34, "A 34 bit signed integer");
822makeimask!(i35, i64, crate::typenum2::U35, "A 35 bit signed integer");
823makeimask!(i36, i64, crate::typenum2::U36, "A 36 bit signed integer");
824makeimask!(i37, i64, crate::typenum2::U37, "A 37 bit signed integer");
825makeimask!(i38, i64, crate::typenum2::U38, "A 38 bit signed integer");
826makeimask!(i39, i64, crate::typenum2::U39, "A 39 bit signed integer");
827makeimask!(i40, i64, crate::typenum2::U40, "A 40 bit signed integer");
828makeimask!(i41, i64, crate::typenum2::U41, "A 41 bit signed integer");
829makeimask!(i42, i64, crate::typenum2::U42, "A 42 bit signed integer");
830makeimask!(i43, i64, crate::typenum2::U43, "A 43 bit signed integer");
831makeimask!(i44, i64, crate::typenum2::U44, "A 44 bit signed integer");
832makeimask!(i45, i64, crate::typenum2::U45, "A 45 bit signed integer");
833makeimask!(i46, i64, crate::typenum2::U46, "A 46 bit signed integer");
834makeimask!(i47, i64, crate::typenum2::U47, "A 47 bit signed integer");
835makeimask!(i48, i64, crate::typenum2::U48, "A 48 bit signed integer");
836makeimask!(i49, i64, crate::typenum2::U49, "A 49 bit signed integer");
837makeimask!(i50, i64, crate::typenum2::U50, "A 50 bit signed integer");
838makeimask!(i51, i64, crate::typenum2::U51, "A 51 bit signed integer");
839makeimask!(i52, i64, crate::typenum2::U52, "A 52 bit signed integer");
840makeimask!(i53, i64, crate::typenum2::U53, "A 53 bit signed integer");
841makeimask!(i54, i64, crate::typenum2::U54, "A 54 bit signed integer");
842makeimask!(i55, i64, crate::typenum2::U55, "A 55 bit signed integer");
843makeimask!(i56, i64, crate::typenum2::U56, "A 56 bit signed integer");
844makeimask!(i57, i64, crate::typenum2::U57, "A 57 bit signed integer");
845makeimask!(i58, i64, crate::typenum2::U58, "A 58 bit signed integer");
846makeimask!(i59, i64, crate::typenum2::U59, "A 59 bit signed integer");
847makeimask!(i60, i64, crate::typenum2::U60, "A 60 bit signed integer");
848makeimask!(i61, i64, crate::typenum2::U61, "A 61 bit signed integer");
849makeimask!(i62, i64, crate::typenum2::U62, "A 62 bit signed integer");
850makeimask!(i63, i64, crate::typenum2::U63, "A 63 bit signed integer");
851
852makeimask!(i65, i128, crate::typenum2::U65, "A 65 bit signed integer");
853makeimask!(i66, i128, crate::typenum2::U66, "A 66 bit signed integer");
854makeimask!(i67, i128, crate::typenum2::U67, "A 67 bit signed integer");
855makeimask!(i68, i128, crate::typenum2::U68, "A 68 bit signed integer");
856makeimask!(i69, i128, crate::typenum2::U69, "A 69 bit signed integer");
857makeimask!(i70, i128, crate::typenum2::U70, "A 70 bit signed integer");
858makeimask!(i71, i128, crate::typenum2::U71, "A 71 bit signed integer");
859makeimask!(i72, i128, crate::typenum2::U72, "A 72 bit signed integer");
860makeimask!(i73, i128, crate::typenum2::U73, "A 73 bit signed integer");
861makeimask!(i74, i128, crate::typenum2::U74, "A 74 bit signed integer");
862makeimask!(i75, i128, crate::typenum2::U75, "A 75 bit signed integer");
863makeimask!(i76, i128, crate::typenum2::U76, "A 76 bit signed integer");
864makeimask!(i77, i128, crate::typenum2::U77, "A 77 bit signed integer");
865makeimask!(i78, i128, crate::typenum2::U78, "A 78 bit signed integer");
866makeimask!(i79, i128, crate::typenum2::U79, "A 79 bit signed integer");
867makeimask!(i80, i128, crate::typenum2::U80, "A 80 bit signed integer");
868makeimask!(i81, i128, crate::typenum2::U81, "A 81 bit signed integer");
869makeimask!(i82, i128, crate::typenum2::U82, "A 82 bit signed integer");
870makeimask!(i83, i128, crate::typenum2::U83, "A 83 bit signed integer");
871makeimask!(i84, i128, crate::typenum2::U84, "A 84 bit signed integer");
872makeimask!(i85, i128, crate::typenum2::U85, "A 85 bit signed integer");
873makeimask!(i86, i128, crate::typenum2::U86, "A 86 bit signed integer");
874makeimask!(i87, i128, crate::typenum2::U87, "A 87 bit signed integer");
875makeimask!(i88, i128, crate::typenum2::U88, "A 88 bit signed integer");
876makeimask!(i89, i128, crate::typenum2::U89, "A 89 bit signed integer");
877makeimask!(i90, i128, crate::typenum2::U90, "A 90 bit signed integer");
878makeimask!(i91, i128, crate::typenum2::U91, "A 91 bit signed integer");
879makeimask!(i92, i128, crate::typenum2::U92, "A 92 bit signed integer");
880makeimask!(i93, i128, crate::typenum2::U93, "A 93 bit signed integer");
881makeimask!(i94, i128, crate::typenum2::U94, "A 94 bit signed integer");
882makeimask!(i95, i128, crate::typenum2::U95, "A 95 bit signed integer");
883makeimask!(i96, i128, crate::typenum2::U96, "A 96 bit signed integer");
884makeimask!(i97, i128, crate::typenum2::U97, "A 97 bit signed integer");
885makeimask!(i98, i128, crate::typenum2::U98, "A 98 bit signed integer");
886makeimask!(i99, i128, crate::typenum2::U99, "A 99 bit signed integer");
887makeimask!(
888 i100,
889 i128,
890 crate::typenum2::U100,
891 "A 100 bit signed integer"
892);
893makeimask!(
894 i101,
895 i128,
896 crate::typenum2::U101,
897 "A 101 bit signed integer"
898);
899makeimask!(
900 i102,
901 i128,
902 crate::typenum2::U102,
903 "A 102 bit signed integer"
904);
905makeimask!(
906 i103,
907 i128,
908 crate::typenum2::U103,
909 "A 103 bit signed integer"
910);
911makeimask!(
912 i104,
913 i128,
914 crate::typenum2::U104,
915 "A 104 bit signed integer"
916);
917makeimask!(
918 i105,
919 i128,
920 crate::typenum2::U105,
921 "A 105 bit signed integer"
922);
923makeimask!(
924 i106,
925 i128,
926 crate::typenum2::U106,
927 "A 106 bit signed integer"
928);
929makeimask!(
930 i107,
931 i128,
932 crate::typenum2::U107,
933 "A 107 bit signed integer"
934);
935makeimask!(
936 i108,
937 i128,
938 crate::typenum2::U108,
939 "A 108 bit signed integer"
940);
941makeimask!(
942 i109,
943 i128,
944 crate::typenum2::U109,
945 "A 109 bit signed integer"
946);
947makeimask!(
948 i110,
949 i128,
950 crate::typenum2::U110,
951 "A 110 bit signed integer"
952);
953makeimask!(
954 i111,
955 i128,
956 crate::typenum2::U111,
957 "A 111 bit signed integer"
958);
959makeimask!(
960 i112,
961 i128,
962 crate::typenum2::U112,
963 "A 112 bit signed integer"
964);
965makeimask!(
966 i113,
967 i128,
968 crate::typenum2::U113,
969 "A 113 bit signed integer"
970);
971makeimask!(
972 i114,
973 i128,
974 crate::typenum2::U114,
975 "A 114 bit signed integer"
976);
977makeimask!(
978 i115,
979 i128,
980 crate::typenum2::U115,
981 "A 115 bit signed integer"
982);
983makeimask!(
984 i116,
985 i128,
986 crate::typenum2::U116,
987 "A 116 bit signed integer"
988);
989makeimask!(
990 i117,
991 i128,
992 crate::typenum2::U117,
993 "A 117 bit signed integer"
994);
995makeimask!(
996 i118,
997 i128,
998 crate::typenum2::U118,
999 "A 118 bit signed integer"
1000);
1001makeimask!(
1002 i119,
1003 i128,
1004 crate::typenum2::U119,
1005 "A 119 bit signed integer"
1006);
1007makeimask!(
1008 i120,
1009 i128,
1010 crate::typenum2::U120,
1011 "A 120 bit signed integer"
1012);
1013makeimask!(
1014 i121,
1015 i128,
1016 crate::typenum2::U121,
1017 "A 121 bit signed integer"
1018);
1019makeimask!(
1020 i122,
1021 i128,
1022 crate::typenum2::U122,
1023 "A 122 bit signed integer"
1024);
1025makeimask!(
1026 i123,
1027 i128,
1028 crate::typenum2::U123,
1029 "A 123 bit signed integer"
1030);
1031makeimask!(
1032 i124,
1033 i128,
1034 crate::typenum2::U124,
1035 "A 124 bit signed integer"
1036);
1037makeimask!(
1038 i125,
1039 i128,
1040 crate::typenum2::U125,
1041 "A 125 bit signed integer"
1042);
1043makeimask!(
1044 i126,
1045 i128,
1046 crate::typenum2::U126,
1047 "A 126 bit signed integer"
1048);
1049makeimask!(
1050 i127,
1051 i128,
1052 crate::typenum2::U127,
1053 "A 127 bit signed integer"
1054);