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
use super::Base;

macro_rules! decl_from_lossy {
	{
		$(
			trait: $trait_name:ident
			fn: $fn_name:ident
			from: $from:ident
		)*
		// trait: $($trait_name:ident)*
	} => {
		$(
			/// Potentially lossy conversion from
			#[doc = concat!("`", stringify!($from), "`")]
			///
			/// This trait is implemented for all number types. This is not a guaranteed
			/// lossless conversion. It's the same as an `as` cast, but in trait form.
			pub trait $trait_name: Base {
				/// Converts the provided
				#[doc = concat!("`", stringify!($from), "`")]
				/// into Self, potentially lossily
				fn $fn_name(val: $from) -> Self;
			}

			decl_from_lossy! {
				@impl
				trait: $trait_name
				fn: $fn_name
				from: $from

				u8 u16 u32 u64 u128 usize
				i8 i16 i32 i64 i128 isize
				f32 f64
			}
		)*
	};

	{
		@impl
		trait: $trait_name:ident
		fn: $fn_name:ident
		from: $from:ident
		$($num:ident)*
	} => {
		$(
			impl $trait_name for $num {
				/// Converts the provided
				#[doc = concat!("`", stringify!($from), "`")]
				/// into
				#[doc = concat!("`", stringify!($num), "`,")]
				/// potentially lossily
				#[expect(clippy::as_conversions)]
				#[inline(always)]
				fn $fn_name(val: $from) -> $num { val as _ }
			}
		)*
	};
}

decl_from_lossy! {
	trait: FromU8Lossy
	fn: from_u8_lossy
	from: u8

	trait: FromU16Lossy
	fn: from_u16_lossy
	from: u16

	trait: FromU32Lossy
	fn: from_u32_lossy
	from: u32

	trait: FromU64Lossy
	fn: from_u64_lossy
	from: u64

	trait: FromU128Lossy
	fn: from_u128_lossy
	from: u128

	trait: FromUsizeLossy
	fn: from_usize_lossy
	from: usize

	trait: FromI8Lossy
	fn: from_i8_lossy
	from: i8

	trait: FromI16Lossy
	fn: from_i16_lossy
	from: i16

	trait: FromI32Lossy
	fn: from_i32_lossy
	from: i32

	trait: FromI64Lossy
	fn: from_i64_lossy
	from: i64

	trait: FromI128Lossy
	fn: from_i128_lossy
	from: i128

	trait: FromIsizeLossy
	fn: from_isize_lossy
	from: isize

	trait: FromF32Lossy
	fn: from_f32_lossy
	from: f32

	trait: FromF64Lossy
	fn: from_f64_lossy
	from: f64
}