-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathtraits.rs
299 lines (287 loc) · 7.53 KB
/
traits.rs
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
// Rust language amplification library providing multiple generic trait
// implementations, type wrappers, derive macros and other language enhancements
//
// Written in 2014 by
// Andrew Poelstra <[email protected]>
// Updated in 2020-2024 by
// Dr. Maxim Orlovsky <[email protected]>
//
// To the extent possible under law, the author(s) have dedicated all
// copyright and related and neighboring rights to this software to
// the public domain worldwide. This software is distributed without
// any warranty.
//
// You should have received a copy of the MIT License
// along with this software.
// If not, see <https://opensource.org/licenses/MIT>.
use crate::{i1024, i256, i512, u1, u1024, u2, u24, u256, u3, u4, u40, u48, u5, u512, u56, u6, u7};
pub trait Integer {
const BITS: usize;
const BYTES: usize;
const MIN: Self;
const MAX: Self;
const ZERO: Self;
const ONE: Self;
const IS_SIGNED: bool;
}
impl Integer for u1 {
const BITS: usize = 1;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS as u8 - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u2 {
const BITS: usize = 2;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS as u8 - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u3 {
const BITS: usize = 3;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS as u8 - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u4 {
const BITS: usize = 4;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS as u8 - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u5 {
const BITS: usize = 5;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS as u8 - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u6 {
const BITS: usize = 6;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS as u8 - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u7 {
const BITS: usize = 7;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS as u8 - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u8 {
const BITS: usize = 8;
const BYTES: usize = 1;
const MIN: Self = 0;
const MAX: Self = 2 ^ Self::BITS as Self - 1;
const ZERO: Self = 0;
const ONE: Self = 1;
const IS_SIGNED: bool = false;
}
impl Integer for u16 {
const BITS: usize = 16;
const BYTES: usize = 1;
const MIN: Self = 0;
const MAX: Self = 2 ^ Self::BITS as Self - 1;
const ZERO: Self = 0;
const ONE: Self = 1;
const IS_SIGNED: bool = false;
}
impl Integer for u24 {
const BITS: usize = 24;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u32 {
const BITS: usize = 32;
const BYTES: usize = 1;
const MIN: Self = 0;
const MAX: Self = 2 ^ Self::BITS - 1;
const ZERO: Self = 0;
const ONE: Self = 1;
const IS_SIGNED: bool = false;
}
impl Integer for u40 {
const BITS: usize = 40;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS as u64 - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u48 {
const BITS: usize = 48;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS as u64 - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u56 {
const BITS: usize = 56;
const BYTES: usize = 1;
const MIN: Self = Self(0);
const MAX: Self = Self(2 ^ Self::BITS as u64 - 1);
const ZERO: Self = Self(0);
const ONE: Self = Self(1);
const IS_SIGNED: bool = false;
}
impl Integer for u64 {
const BITS: usize = 64;
const BYTES: usize = 1;
const MIN: Self = 0;
const MAX: Self = 2 ^ Self::BITS as Self - 1;
const ZERO: Self = 0;
const ONE: Self = 1;
const IS_SIGNED: bool = false;
}
impl Integer for u128 {
const BITS: usize = 128;
const BYTES: usize = 1;
const MIN: Self = 0;
const MAX: Self = 2 ^ Self::BITS as Self - 1;
const ZERO: Self = 0;
const ONE: Self = 1;
const IS_SIGNED: bool = false;
}
impl Integer for u256 {
const BITS: usize = 256;
const BYTES: usize = 1;
const MIN: Self = Self::ZERO;
const MAX: Self = Self::MAX;
const ZERO: Self = Self::ZERO;
const ONE: Self = Self::ONE;
const IS_SIGNED: bool = false;
}
impl Integer for u512 {
const BITS: usize = 512;
const BYTES: usize = 1;
const MIN: Self = Self::ZERO;
const MAX: Self = Self::MAX;
const ZERO: Self = Self::ZERO;
const ONE: Self = Self::ONE;
const IS_SIGNED: bool = false;
}
impl Integer for u1024 {
const BITS: usize = 1024;
const BYTES: usize = 1;
const MIN: Self = Self::ZERO;
const MAX: Self = Self::MAX;
const ZERO: Self = Self::ZERO;
const ONE: Self = Self::ONE;
const IS_SIGNED: bool = false;
}
pub trait MultibyteInteger: Integer {
fn from_le_bytes(bytes: [u8; Self::BYTES]) -> Self;
fn from_be_bytes(bytes: [u8; Self::BYTES]) -> Self;
fn to_le_bytes(self) -> [u8; Self::BYTES];
fn to_be_bytes(self) -> [u8; Self::BYTES];
}
pub trait SInteger {
const NEG: Self;
}
impl SInteger for i8 {
const NEG: Self = -1;
}
impl SInteger for i16 {
const NEG: Self = -1;
}
impl SInteger for i32 {
const NEG: Self = -1;
}
impl SInteger for i64 {
const NEG: Self = -1;
}
impl SInteger for i128 {
const NEG: Self = -1;
}
pub trait UInteger {}
impl UInteger for u1 {}
impl UInteger for u2 {}
impl UInteger for u3 {}
impl UInteger for u4 {}
impl UInteger for u5 {}
impl UInteger for u6 {}
impl UInteger for u7 {}
impl UInteger for u8 {}
impl UInteger for u16 {}
impl UInteger for u24 {}
impl UInteger for u32 {}
impl UInteger for u40 {}
impl UInteger for u48 {}
impl UInteger for u56 {}
impl UInteger for u64 {}
impl UInteger for u128 {}
impl UInteger for u256 {}
impl UInteger for u512 {}
impl UInteger for u1024 {}
pub trait SmallInteger {
type Inner: Integer;
}
impl SmallInteger for u1 {
type Inner = u8;
}
impl SmallInteger for u2 {
type Inner = u8;
}
impl SmallInteger for u3 {
type Inner = u8;
}
impl SmallInteger for u4 {
type Inner = u8;
}
impl SmallInteger for u5 {
type Inner = u8;
}
impl SmallInteger for u6 {
type Inner = u8;
}
impl SmallInteger for u7 {
type Inner = u8;
}
impl SmallInteger for u24 {
type Inner = u32;
}
impl SmallInteger for u40 {
type Inner = u64;
}
impl SmallInteger for u48 {
type Inner = u64;
}
impl SmallInteger for u56 {
type Inner = u64;
}
pub trait BigInteger {
const INNER_LEN: u8;
type Inner: Integer;
}
impl BigInteger for u256 {}
impl BigInteger for u512 {}
impl BigInteger for u1024 {}
impl BigInteger for i256 {}
impl BigInteger for i512 {}
impl BigInteger for i1024 {}