bitstring 0.2.1

Bitstring traits and implementations
Documentation
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
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
use super::int_helpers::u8;

fn u8_slice_inc<S: AsMut<[u8]>>(mut slice: S, prefix: usize) -> (bool, S) {
	let overflow = u8::slice_inc(slice.as_mut(), prefix);
	(overflow, slice)
}

fn u8_slice_set<S: AsMut<[u8]>>(mut slice: S, ndx: usize, bit: bool) -> S {
	u8::slice_set(slice.as_mut(), ndx, bit);
	slice
}

fn u8_slice_flip<S: AsMut<[u8]>>(mut slice: S, ndx: usize) -> S {
	u8::slice_flip(slice.as_mut(), ndx);
	slice
}

fn u8_slice_set_false_from<S: AsMut<[u8]>>(mut slice: S, ndx: usize) -> S {
	u8::slice_set_false_from(slice.as_mut(), ndx);
	slice
}

fn u8_slice_set_true_from<S: AsMut<[u8]>>(mut slice: S, ndx: usize) -> S {
	u8::slice_set_true_from(slice.as_mut(), ndx);
	slice
}

#[test]
fn test_u8_element_inc() {
	assert_eq!(u8::make_element_inc(0b0000_0000, 0), (0b0000_0001, false));
	assert_eq!(u8::make_element_inc(0b0000_0000, 4), (0b0000_0001, false));
	assert_eq!(u8::make_element_inc(0b0000_0000, 8), (0b0000_0000, true));
	assert_eq!(u8::make_element_inc(0b0000_1000, 0), (0b0000_1001, false));
	assert_eq!(u8::make_element_inc(0b0000_1000, 4), (0b0000_1001, false));
	assert_eq!(u8::make_element_inc(0b0000_1000, 8), (0b0000_1000, true));
	assert_eq!(u8::make_element_inc(0b0000_1111, 0), (0b0001_0000, false));
	assert_eq!(u8::make_element_inc(0b0000_1111, 4), (0b0000_0000, true));
	assert_eq!(u8::make_element_inc(0b0000_1111, 8), (0b0000_1111, true));
	assert_eq!(u8::make_element_inc(0b0001_1111, 0), (0b0010_0000, false));
	assert_eq!(u8::make_element_inc(0b0001_1111, 4), (0b0001_0000, true));
	assert_eq!(u8::make_element_inc(0b0001_1111, 8), (0b0001_1111, true));
	assert_eq!(u8::make_element_inc(0b1111_1111, 0), (0b0000_0000, true));
	assert_eq!(u8::make_element_inc(0b1111_1111, 4), (0b1111_0000, true));
	assert_eq!(u8::make_element_inc(0b1111_1111, 8), (0b1111_1111, true));
}

#[test]
fn test_u8_element_set() {
	assert_eq!(u8::make_element_set(0b0000_0000, 0, true), 0b1000_0000);
	assert_eq!(u8::make_element_set(0b1000_0000, 0, true), 0b1000_0000);
	assert_eq!(u8::make_element_set(0b0000_0000, 4, true), 0b0000_1000);
	assert_eq!(u8::make_element_set(0b0000_1000, 4, true), 0b0000_1000);
	assert_eq!(u8::make_element_set(0b0000_0000, 7, true), 0b0000_0001);
	assert_eq!(u8::make_element_set(0b0000_0001, 7, true), 0b0000_0001);

	assert_eq!(u8::make_element_set(0b1000_0000, 0, false), 0b0000_0000);
	assert_eq!(u8::make_element_set(0b0000_0000, 0, false), 0b0000_0000);
	assert_eq!(u8::make_element_set(0b0000_1000, 4, false), 0b0000_0000);
	assert_eq!(u8::make_element_set(0b0000_0000, 4, false), 0b0000_0000);
	assert_eq!(u8::make_element_set(0b0000_0001, 7, false), 0b0000_0000);
	assert_eq!(u8::make_element_set(0b0000_0000, 7, false), 0b0000_0000);
}

#[test]
fn test_u8_element_flip() {
	assert_eq!(u8::make_element_flip(0b0000_0000, 0), 0b1000_0000);
	assert_eq!(u8::make_element_flip(0b1000_0000, 0), 0b0000_0000);
	assert_eq!(u8::make_element_flip(0b0000_0000, 4), 0b0000_1000);
	assert_eq!(u8::make_element_flip(0b0000_1000, 4), 0b0000_0000);
	assert_eq!(u8::make_element_flip(0b0000_0000, 7), 0b0000_0001);
	assert_eq!(u8::make_element_flip(0b0000_0001, 7), 0b0000_0000);
}

#[test]
fn test_u8_element_shared_prefix_len() {
	assert_eq!(
		u8::element_shared_prefix_len(0b0000_0000, 0b0000_0000, 0),
		0
	);
	assert_eq!(
		u8::element_shared_prefix_len(0b0000_0000, 0b1000_0000, 8),
		0
	);
	assert_eq!(
		u8::element_shared_prefix_len(0b0000_0000, 0b0000_0000, 1),
		1
	);
	assert_eq!(
		u8::element_shared_prefix_len(0b0000_0000, 0b0100_0000, 8),
		1
	);
	assert_eq!(
		u8::element_shared_prefix_len(0b1100_0000, 0b1100_0001, 7),
		7
	);
	assert_eq!(
		u8::element_shared_prefix_len(0b1100_0000, 0b1100_0001, 8),
		7
	);
	assert_eq!(
		u8::element_shared_prefix_len(0b0000_0000, 0b0000_0000, 8),
		8
	);
	assert_eq!(
		u8::element_shared_prefix_len(0b1100_0001, 0b1100_0001, 8),
		8
	);
	assert_eq!(
		u8::element_shared_prefix_len(0b1111_1111, 0b1111_1111, 8),
		8
	);
}

#[test]
fn test_u8_element_get() {
	assert_eq!(u8::element_get(0b0000_0000, 0), false);
	assert_eq!(u8::element_get(0b1000_0000, 0), true);
	assert_eq!(u8::element_get(0b0000_0000, 1), false);
	assert_eq!(u8::element_get(0b0100_0000, 1), true);
	assert_eq!(u8::element_get(0b0000_0000, 2), false);
	assert_eq!(u8::element_get(0b0010_0000, 2), true);
	assert_eq!(u8::element_get(0b0000_0000, 3), false);
	assert_eq!(u8::element_get(0b0001_0000, 3), true);
	assert_eq!(u8::element_get(0b0000_0000, 6), false);
	assert_eq!(u8::element_get(0b0000_0010, 6), true);
	assert_eq!(u8::element_get(0b0000_0000, 7), false);
	assert_eq!(u8::element_get(0b0000_0001, 7), true);
}

#[test]
fn test_u8_element_is_false_from() {
	assert!(u8::element_is_false_from(0b0000_0000, 0));
	assert!(!u8::element_is_false_from(0b1111_1111, 0));
	assert!(u8::element_is_false_from(0b0000_0000, 1));
	assert!(u8::element_is_false_from(0b1000_0000, 1));
	assert!(!u8::element_is_false_from(0b1111_1111, 1));
	assert!(u8::element_is_false_from(0b0001_0000, 4));
	assert!(u8::element_is_false_from(0b1111_0000, 4));
	assert!(!u8::element_is_false_from(0b0000_1111, 4));
	assert!(u8::element_is_false_from(0b1111_1110, 7));
	assert!(!u8::element_is_false_from(0b1111_1111, 7));
	assert!(u8::element_is_false_from(0b1111_1111, 8));
}

#[test]
fn test_u8_element_set_false_from() {
	assert_eq!(u8::make_element_set_false_from(0b0000_0000, 0), 0b0000_0000);
	assert_eq!(u8::make_element_set_false_from(0b1111_1111, 0), 0b0000_0000);
	assert_eq!(u8::make_element_set_false_from(0b1111_0000, 4), 0b1111_0000);
	assert_eq!(u8::make_element_set_false_from(0b1111_1111, 4), 0b1111_0000);
	assert_eq!(u8::make_element_set_false_from(0b0000_1111, 8), 0b0000_1111);
	assert_eq!(u8::make_element_set_false_from(0b1111_0000, 8), 0b1111_0000);
	assert_eq!(u8::make_element_set_false_from(0b1111_1111, 8), 0b1111_1111);
}

#[test]
fn test_u8_element_is_true_from() {
	assert!(u8::element_is_true_from(0b1111_1111, 0));
	assert!(!u8::element_is_true_from(0b0000_0000, 0));
	assert!(u8::element_is_true_from(0b0111_1111, 1));
	assert!(u8::element_is_true_from(0b1111_1111, 1));
	assert!(!u8::element_is_true_from(0b1000_0000, 1));
	assert!(u8::element_is_true_from(0b1110_1111, 4));
	assert!(u8::element_is_true_from(0b0000_1111, 4));
	assert!(!u8::element_is_true_from(0b1111_0000, 4));
	assert!(u8::element_is_true_from(0b0000_0001, 7));
	assert!(!u8::element_is_true_from(0b0000_0000, 7));
	assert!(u8::element_is_true_from(0b0000_0000, 8));
}

#[test]
fn test_u8_element_set_true_from() {
	assert_eq!(u8::make_element_set_true_from(0b0000_0000, 0), 0b1111_1111);
	assert_eq!(u8::make_element_set_true_from(0b1111_1111, 0), 0b1111_1111);
	assert_eq!(u8::make_element_set_true_from(0b0000_0000, 4), 0b0000_1111);
	assert_eq!(u8::make_element_set_true_from(0b0000_1111, 4), 0b0000_1111);
	assert_eq!(u8::make_element_set_true_from(0b0000_1111, 8), 0b0000_1111);
	assert_eq!(u8::make_element_set_true_from(0b1111_0000, 8), 0b1111_0000);
	assert_eq!(u8::make_element_set_true_from(0b0000_0000, 8), 0b0000_0000);
}

#[test]
fn test_u8_element_contains() {
	assert!(u8::element_contains(0b0000_0000, 0, 0b0000_0000));
	assert!(u8::element_contains(0b1000_0000, 0, 0b0000_0000));
	assert!(u8::element_contains(0b0000_0000, 0, 0b1000_0000));
	assert!(u8::element_contains(0b0000_1000, 0, 0b0000_0000));
	assert!(u8::element_contains(0b0000_0000, 0, 0b1000_1000));
	assert!(u8::element_contains(0b0000_0001, 0, 0b0000_0000));
	assert!(u8::element_contains(0b0000_0000, 0, 0b1000_0001));
	assert!(u8::element_contains(0b0000_0000, 1, 0b0111_1111));
	assert!(u8::element_contains(0b1111_1111, 1, 0b1000_0000));
	assert!(u8::element_contains(0b0000_0000, 1, 0b0111_1111));
	assert!(u8::element_contains(0b1111_1111, 1, 0b1000_0000));
	assert!(u8::element_contains(0b0000_0000, 7, 0b0000_0001));
	assert!(u8::element_contains(0b1111_1111, 7, 0b1111_1110));
	assert!(!u8::element_contains(0b0000_0000, 7, 0b1000_0001));
	assert!(!u8::element_contains(0b0000_0000, 7, 0b0000_1001));
	assert!(!u8::element_contains(0b0111_1111, 7, 0b1111_1110));
	assert!(!u8::element_contains(0b1111_1111, 7, 0b1111_0110));
	assert!(u8::element_contains(0b0000_0000, 8, 0b0000_0000));
	assert!(u8::element_contains(0b1111_1111, 8, 0b1111_1111));
	assert!(!u8::element_contains(0b0000_0000, 8, 0b0000_0001));
	assert!(!u8::element_contains(0b0000_0000, 8, 0b1000_0000));
	assert!(!u8::element_contains(0b1111_1111, 8, 0b1111_1110));
	assert!(!u8::element_contains(0b1111_1111, 8, 0b0111_1111));
}

#[test]
fn test_u8_slice_inc() {
	// make sure overflow doesn't change the fixed prefix
	assert_eq!(
		u8_slice_inc([0b0000_0000, 0b0000_0000], 16),
		(true, [0b0000_0000, 0b0000_0000])
	);
	assert_eq!(
		u8_slice_inc([0b0000_0000, 0b0000_0000], 15),
		(false, [0b0000_0000, 0b0000_0001]),
	);
	assert_eq!(
		u8_slice_inc([0b0000_0000, 0b0000_0001], 15),
		(true, [0b0000_0000, 0b0000_0000]),
	);
	assert_eq!(
		u8_slice_inc([0b0000_0000, 0b0000_1011], 15),
		(true, [0b0000_0000, 0b0000_1010]),
	);
	assert_eq!(
		u8_slice_inc([0b0000_0000, 0b0000_1111], 15),
		(true, [0b0000_0000, 0b0000_1110]),
	);
	assert_eq!(
		u8_slice_inc([0b0000_0000, 0b1111_1111], 15),
		(true, [0b0000_0000, 0b1111_1110]),
	);
	assert_eq!(
		u8_slice_inc([0b0000_0001, 0b1111_1111], 15),
		(true, [0b0000_0001, 0b1111_1110]),
	);
	assert_eq!(
		u8_slice_inc([0b0000_0000, 0b0000_0000], 8),
		(false, [0b0000_0000, 0b0000_0001]),
	);
	assert_eq!(
		u8_slice_inc([0b0000_0000, 0b1111_1111], 8),
		(true, [0b0000_0000, 0b0000_0000]),
	);
	assert_eq!(
		u8_slice_inc([0b0000_0001, 0b1111_1111], 8),
		(true, [0b0000_0001, 0b0000_0000]),
	);
	assert_eq!(
		u8_slice_inc([0b0000_0000, 0b0000_0000], 0),
		(false, [0b0000_0000, 0b0000_0001]),
	);
	assert_eq!(
		u8_slice_inc([0b1111_1111, 0b1111_1111], 0),
		(true, [0b0000_0000, 0b0000_0000]),
	);
}

#[test]
fn test_u8_slice_get() {
	assert!(!u8::slice_get(&[0, 0b0000_0000], 15));
	assert!(u8::slice_get(&[0, 0b0000_0001], 15));
	assert!(!u8::slice_get(&[0, 0b0000_0000], 14));
	assert!(u8::slice_get(&[0, 0b0000_0010], 14));
	assert!(!u8::slice_get(&[0, 0b0000_0000], 8));
	assert!(u8::slice_get(&[0, 0b1000_0000], 8));
	assert!(!u8::slice_get(&[0b0000_0000, 0], 7));
	assert!(u8::slice_get(&[0b0000_0001, 0], 7));
	assert!(!u8::slice_get(&[0b0000_0000, 0], 1));
	assert!(u8::slice_get(&[0b0100_0000, 0], 1));
	assert!(!u8::slice_get(&[0b0000_0000, 0], 0));
	assert!(u8::slice_get(&[0b1000_0000, 0], 0));
}

#[test]
fn test_u8_slice_set() {
	assert_eq!(u8_slice_set([0, 0b0000_0000], 15, true), [0, 0b0000_0001]);
	assert_eq!(u8_slice_set([0, 0b0000_0001], 15, false), [0, 0b0000_0000]);
	assert_eq!(u8_slice_set([!0, 0b0000_0001], 15, true), [!0, 0b0000_0001]);
	assert_eq!(
		u8_slice_set([!0, 0b0000_0000], 15, false),
		[!0, 0b0000_0000]
	);
	assert_eq!(u8_slice_set([0, 0b0000_0000], 14, true), [0, 0b0000_0010]);
	assert_eq!(u8_slice_set([0, 0b0000_0010], 14, false), [0, 0b0000_0000]);
	assert_eq!(u8_slice_set([!0, 0b1111_1111], 14, true), [!0, 0b1111_1111]);
	assert_eq!(u8_slice_set([0, 0b0000_0000], 8, true), [0, 0b1000_0000]);
	assert_eq!(u8_slice_set([0, 0b1000_0000], 8, false), [0, 0b0000_0000]);
	assert_eq!(u8_slice_set([!0, 0b1111_1111], 8, true), [!0, 0b1111_1111]);
	assert_eq!(u8_slice_set([0b0000_0000, 0], 7, true), [0b0000_0001, 0]);
	assert_eq!(u8_slice_set([0b0000_0001, 0], 7, false), [0b0000_0000, 0]);
	assert_eq!(u8_slice_set([0b0000_0001, !0], 7, true), [0b0000_0001, !0]);
	assert_eq!(u8_slice_set([0b0000_0000, 0], 0, true), [0b1000_0000, 0]);
	assert_eq!(u8_slice_set([0b1000_0000, 0], 0, false), [0b0000_0000, 0]);
	assert_eq!(u8_slice_set([0b1111_1111, !0], 0, true), [0b1111_1111, !0]);
}

#[test]
fn test_u8_slice_flip() {
	assert_eq!(u8_slice_flip([0, 0b0000_0000], 15), [0, 0b0000_0001]);
	assert_eq!(u8_slice_flip([0, 0b0000_0001], 15), [0, 0b0000_0000]);
	assert_eq!(u8_slice_flip([0, 0b0000_0000], 8), [0, 0b1000_0000]);
	assert_eq!(u8_slice_flip([!0, 0b1111_1111], 8), [!0, 0b0111_1111]);
	assert_eq!(u8_slice_flip([0b0000_0000, 0], 7), [0b0000_0001, 0]);
	assert_eq!(u8_slice_flip([0b0000_0001, 0], 7), [0b0000_0000, 0]);
	assert_eq!(u8_slice_flip([0b0000_0000, !0], 0), [0b1000_0000, !0]);
	assert_eq!(u8_slice_flip([0b1111_1111, 0], 0), [0b0111_1111, 0]);
}

#[test]
fn test_u8_slice_shared_prefix_len() {
	assert_eq!(
		0,
		u8::slice_shared_prefix_len(&[0b0000_0000], &[0b0000_0000], 0)
	);
	assert_eq!(
		0,
		u8::slice_shared_prefix_len(&[0b0000_0000], &[0b1000_0000], 8)
	);
	assert_eq!(
		1,
		u8::slice_shared_prefix_len(&[0b0000_0000], &[0b0000_0000], 1)
	);
	assert_eq!(
		1,
		u8::slice_shared_prefix_len(&[0b0000_0000], &[0b0100_0000], 8)
	);
	assert_eq!(
		7,
		u8::slice_shared_prefix_len(&[0b1100_0000], &[0b1100_0001], 7)
	);
	assert_eq!(
		7,
		u8::slice_shared_prefix_len(&[0b1100_0000], &[0b1100_0001], 8)
	);

	assert_eq!(
		0,
		u8::slice_shared_prefix_len(&[0b0000_0000, 0b0000_0000], &[0b0000_0000, 0b0000_0000], 0)
	);
	assert_eq!(
		0,
		u8::slice_shared_prefix_len(&[0b0000_0000, 0b0000_0000], &[0b1000_0000, 0b0000_0000], 8)
	);
	assert_eq!(
		1,
		u8::slice_shared_prefix_len(&[0b0000_0000, 0b0000_0000], &[0b0000_0000, 0b0000_0000], 1)
	);
	assert_eq!(
		1,
		u8::slice_shared_prefix_len(&[0b0000_0000, 0b0000_0000], &[0b0100_0000, 0b0000_0000], 8)
	);
	assert_eq!(
		7,
		u8::slice_shared_prefix_len(&[0b1100_0000, 0b0000_0000], &[0b1100_0001, 0b0000_0000], 7)
	);
	assert_eq!(
		7,
		u8::slice_shared_prefix_len(&[0b1100_0000, 0b0000_0000], &[0b1100_0001, 0b0000_0000], 8)
	);

	assert_eq!(
		8,
		u8::slice_shared_prefix_len(&[0b0010_1000, 0b0000_0000], &[0b0010_1000, 0b0000_0000], 8)
	);
	assert_eq!(
		8,
		u8::slice_shared_prefix_len(&[0b0010_1000, 0b0000_0000], &[0b0010_1000, 0b1000_0000], 16)
	);
	assert_eq!(
		9,
		u8::slice_shared_prefix_len(&[0b0010_1000, 0b0000_0000], &[0b0010_1000, 0b0000_0000], 9)
	);
	assert_eq!(
		9,
		u8::slice_shared_prefix_len(&[0b0010_1000, 0b0000_0000], &[0b0010_1000, 0b0100_0000], 16)
	);
	assert_eq!(
		15,
		u8::slice_shared_prefix_len(&[0b0010_1000, 0b1100_0000], &[0b0010_1000, 0b1100_0001], 15)
	);
	assert_eq!(
		15,
		u8::slice_shared_prefix_len(&[0b0010_1000, 0b1100_0000], &[0b0010_1000, 0b1100_0001], 16)
	);
}

#[test]
fn test_u8_slice_set_false_from() {
	assert_eq!(
		u8_slice_set_false_from([0, 0b1111_1111], 16),
		[0, 0b1111_1111]
	);
	assert_eq!(
		u8_slice_set_false_from([!0, 0b1111_1111], 16),
		[!0, 0b1111_1111]
	);
	assert_eq!(
		u8_slice_set_false_from([!0, 0b1111_1111], 15),
		[!0, 0b1111_1110]
	);
	assert_eq!(
		u8_slice_set_false_from([!0, 0b1111_1111], 9),
		[!0, 0b1000_0000]
	);
	assert_eq!(
		u8_slice_set_false_from([0, 0b1111_1111], 8),
		[0, 0b0000_0000]
	);
	assert_eq!(
		u8_slice_set_false_from([!0, 0b1111_1111], 8),
		[!0, 0b0000_0000]
	);
	assert_eq!(
		u8_slice_set_false_from([0b1111_1111, !0], 7),
		[0b1111_1110, 0]
	);
	assert_eq!(
		u8_slice_set_false_from([0b1111_1111, !0], 1),
		[0b1000_0000, 0]
	);
	assert_eq!(
		u8_slice_set_false_from([0b1111_1111, !0], 0),
		[0b0000_0000, 0]
	);
}

#[test]
fn test_u8_slice_is_false_from() {
	assert!(u8::slice_is_false_from(&[0, 0b1111_1111], 16));
	assert!(u8::slice_is_false_from(&[!0, 0b1111_1111], 16));
	assert!(u8::slice_is_false_from(&[!0, 0b1111_1110], 15));
	assert!(u8::slice_is_false_from(&[!0, 0b1000_0000], 9));
	assert!(u8::slice_is_false_from(&[0, 0b0000_0000], 8));
	assert!(u8::slice_is_false_from(&[!0, 0b0000_0000], 8));
	assert!(u8::slice_is_false_from(&[0b1111_1110, 0], 7));
	assert!(u8::slice_is_false_from(&[0b1000_0000, 0], 1));
	assert!(u8::slice_is_false_from(&[0b0000_0000, 0], 0));
}

#[test]
fn test_u8_slice_set_true_from() {
	assert_eq!(
		u8_slice_set_true_from([!0, 0b1111_1111], 16),
		[!0, 0b1111_1111]
	);
	assert_eq!(
		u8_slice_set_true_from([0, 0b0000_0000], 16),
		[0, 0b0000_0000]
	);
	assert_eq!(
		u8_slice_set_true_from([0, 0b0000_0000], 15),
		[0, 0b0000_0001]
	);
	assert_eq!(
		u8_slice_set_true_from([0, 0b0000_0000], 9),
		[0, 0b0111_1111]
	);
	assert_eq!(
		u8_slice_set_true_from([!0, 0b0000_0000], 8),
		[!0, 0b1111_1111]
	);
	assert_eq!(
		u8_slice_set_true_from([0, 0b0000_0000], 8),
		[0, 0b1111_1111]
	);
	assert_eq!(
		u8_slice_set_true_from([0b0000_0000, 0], 7),
		[0b0000_0001, !0]
	);
	assert_eq!(
		u8_slice_set_true_from([0b0000_0000, 0], 1),
		[0b0111_1111, !0]
	);
	assert_eq!(
		u8_slice_set_true_from([0b0000_0000, 0], 0),
		[0b1111_1111, !0]
	);
}

#[test]
fn test_u8_slice_is_true_from() {
	assert!(u8::slice_is_true_from(&[!0, 0b1111_1111], 16));
	assert!(u8::slice_is_true_from(&[0, 0b0000_0000], 16));
	assert!(u8::slice_is_true_from(&[0, 0b0000_0001], 15));
	assert!(u8::slice_is_true_from(&[0, 0b0111_1111], 9));
	assert!(u8::slice_is_true_from(&[!0, 0b1111_1111], 8));
	assert!(u8::slice_is_true_from(&[0, 0b1111_1111], 8));
	assert!(u8::slice_is_true_from(&[0b0000_0001, !0], 7));
	assert!(u8::slice_is_true_from(&[0b0111_1111, !0], 1));
	assert!(u8::slice_is_true_from(&[0b1111_1111, !0], 0));
}

#[test]
fn test_u8_slice_contains() {
	assert!(u8::slice_contains(&[0, 0], 0, &[!0, !0]));
	assert!(u8::slice_contains(&[0b0000_0000, 0], 1, &[0b0111_1111, !0]));
	assert!(u8::slice_contains(&[0b1111_1111, !0], 1, &[0b1000_0000, 0]));
	assert!(u8::slice_contains(&[0b0000_0000, 0], 7, &[0b0000_0001, !0]));
	assert!(u8::slice_contains(&[0b1111_1111, 0], 7, &[0b1111_1110, !0]));
	assert!(!u8::slice_contains(&[0b0000_0000, 0], 7, &[0b1000_0001, 0]));
	assert!(!u8::slice_contains(&[0b0000_0000, 0], 7, &[0b0000_1001, 0]));
	assert!(!u8::slice_contains(&[0b0111_1111, 0], 7, &[0b1111_1110, 0]));
	assert!(!u8::slice_contains(&[0b1111_1111, 0], 7, &[0b1111_0110, 0]));
	assert!(u8::slice_contains(&[0b0000_0000, 0], 8, &[0b0000_0000, !0]));
	assert!(u8::slice_contains(&[0b1111_1111, !0], 8, &[0b1111_1111, 0]));
	assert!(!u8::slice_contains(&[0b0000_0000, 0], 8, &[0b0000_0001, 0]));
	assert!(!u8::slice_contains(&[0b0000_0000, 0], 8, &[0b1000_0000, 0]));
	assert!(!u8::slice_contains(&[0b1111_1111, 0], 8, &[0b1111_1110, 0]));
	assert!(!u8::slice_contains(&[0b1111_1111, 0], 8, &[0b0111_1111, 0]));

	assert!(u8::slice_contains(&[0, 0b0000_0000], 9, &[0, 0b0111_1111]));
	assert!(u8::slice_contains(
		&[!0, 0b1111_1111],
		9,
		&[!0, 0b1000_0000]
	));
	assert!(u8::slice_contains(&[0, 0b0000_0000], 15, &[0, 0b0000_0001]));
	assert!(u8::slice_contains(
		&[!0, 0b1111_1111],
		15,
		&[!0, 0b1111_1110]
	));
	assert!(!u8::slice_contains(
		&[0, 0b0000_0000],
		15,
		&[0, 0b1000_0001]
	));
	assert!(!u8::slice_contains(
		&[0, 0b0000_0000],
		15,
		&[0, 0b0000_1001]
	));
	assert!(!u8::slice_contains(
		&[!0, 0b0111_1111],
		15,
		&[!0, 0b1111_1110]
	));
	assert!(!u8::slice_contains(
		&[!0, 0b1111_1111],
		15,
		&[!0, 0b1111_0110]
	));
	assert!(u8::slice_contains(&[0, 0b0000_0000], 16, &[0, 0b0000_0000]));
	assert!(u8::slice_contains(
		&[!0, 0b1111_1111],
		16,
		&[!0, 0b1111_1111]
	));
	assert!(!u8::slice_contains(
		&[0, 0b0000_0000],
		16,
		&[0, 0b0000_0001]
	));
	assert!(!u8::slice_contains(
		&[0, 0b0000_0000],
		16,
		&[0, 0b1000_0000]
	));
	assert!(!u8::slice_contains(
		&[!0, 0b1111_1111],
		16,
		&[!0, 0b1111_1110]
	));
	assert!(!u8::slice_contains(
		&[!0, 0b1111_1111],
		16,
		&[!0, 0b0111_1111]
	));
}