Coverage Report

Created: 2026-01-10 07:01

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/rust/registry/src/index.crates.io-1949cf8c6b5b557f/aligned-0.4.3/src/lib.rs
Line
Count
Source
1
//! A newtype with alignment of at least `A` bytes
2
//!
3
//! # Examples
4
//!
5
//! ```
6
//! use std::mem;
7
//!
8
//! use aligned::{Aligned, A2, A4, A16};
9
//!
10
//! // Array aligned to a 2 byte boundary
11
//! static X: Aligned<A2, [u8; 3]> = Aligned([0; 3]);
12
//!
13
//! // Array aligned to a 4 byte boundary
14
//! static Y: Aligned<A4, [u8; 3]> = Aligned([0; 3]);
15
//!
16
//! // Unaligned array
17
//! static Z: [u8; 3] = [0; 3];
18
//!
19
//! // You can allocate the aligned arrays on the stack too
20
//! let w: Aligned<A16, _> = Aligned([0u8; 3]);
21
//!
22
//! assert_eq!(mem::align_of_val(&X), 2);
23
//! assert_eq!(mem::align_of_val(&Y), 4);
24
//! assert_eq!(mem::align_of_val(&Z), 1);
25
//! assert_eq!(mem::align_of_val(&w), 16);
26
//! ```
27
28
#![deny(missing_docs)]
29
#![deny(warnings)]
30
#![cfg_attr(not(test), no_std)]
31
32
use core::{
33
    borrow::{Borrow, BorrowMut},
34
    cmp::Ordering,
35
    fmt::{Debug, Display},
36
    hash::{Hash, Hasher},
37
    ops::{self},
38
};
39
40
use as_slice::{AsMutSlice, AsSlice};
41
42
/// A marker trait for an alignment value.
43
pub trait Alignment: Copy + sealed::Sealed {
44
    /// The alignment in bytes.
45
    const ALIGN: usize;
46
}
47
48
impl Alignment for A1 {
49
    const ALIGN: usize = 1;
50
}
51
impl Alignment for A2 {
52
    const ALIGN: usize = 2;
53
}
54
impl Alignment for A4 {
55
    const ALIGN: usize = 4;
56
}
57
impl Alignment for A8 {
58
    const ALIGN: usize = 8;
59
}
60
impl Alignment for A16 {
61
    const ALIGN: usize = 16;
62
}
63
impl Alignment for A32 {
64
    const ALIGN: usize = 32;
65
}
66
impl Alignment for A64 {
67
    const ALIGN: usize = 64;
68
}
69
70
mod sealed {
71
    pub trait Sealed {}
72
73
    impl Sealed for super::A1 {}
74
    impl Sealed for super::A2 {}
75
    impl Sealed for super::A4 {}
76
    impl Sealed for super::A8 {}
77
    impl Sealed for super::A16 {}
78
    impl Sealed for super::A32 {}
79
    impl Sealed for super::A64 {}
80
}
81
82
/// 1-byte alignment
83
#[derive(Clone, Copy)]
84
#[repr(align(1))]
85
pub struct A1;
86
87
/// 2-byte alignment
88
#[derive(Clone, Copy)]
89
#[repr(align(2))]
90
pub struct A2;
91
92
/// 4-byte alignment
93
#[derive(Clone, Copy)]
94
#[repr(align(4))]
95
pub struct A4;
96
97
/// 8-byte alignment
98
#[derive(Clone, Copy)]
99
#[repr(align(8))]
100
pub struct A8;
101
102
/// 16-byte alignment
103
#[derive(Clone, Copy)]
104
#[repr(align(16))]
105
pub struct A16;
106
107
/// 32-byte alignment
108
#[derive(Clone, Copy)]
109
#[repr(align(32))]
110
pub struct A32;
111
112
/// 64-byte alignment
113
#[derive(Clone, Copy)]
114
#[repr(align(64))]
115
pub struct A64;
116
117
/// A newtype with alignment of at least `A` bytes
118
#[repr(C)]
119
pub struct Aligned<A, T>
120
where
121
    T: ?Sized,
122
{
123
    _alignment: [A; 0],
124
    value: T,
125
}
126
127
/// Changes the alignment of `value` to be at least `A` bytes
128
#[allow(non_snake_case)]
129
0
pub const fn Aligned<A, T>(value: T) -> Aligned<A, T> {
130
0
    Aligned {
131
0
        _alignment: [],
132
0
        value,
133
0
    }
134
0
}
Unexecuted instantiation: aligned::Aligned::<aligned::A64, [core::mem::maybe_uninit::MaybeUninit<u16>; 257]>
Unexecuted instantiation: aligned::Aligned::<aligned::A64, [u16; 16384]>
Unexecuted instantiation: aligned::Aligned::<aligned::A64, [core::mem::maybe_uninit::MaybeUninit<u8>; 257]>
Unexecuted instantiation: aligned::Aligned::<aligned::A64, [u8; 16384]>
135
136
impl<A, T> ops::Deref for Aligned<A, T>
137
where
138
    A: Alignment,
139
    T: ?Sized,
140
{
141
    type Target = T;
142
143
    fn deref(&self) -> &T {
144
        &self.value
145
    }
146
}
147
148
impl<A, T> ops::DerefMut for Aligned<A, T>
149
where
150
    A: Alignment,
151
    T: ?Sized,
152
{
153
0
    fn deref_mut(&mut self) -> &mut T {
154
0
        &mut self.value
155
0
    }
Unexecuted instantiation: <aligned::Aligned<aligned::A64, [core::mem::maybe_uninit::MaybeUninit<u16>; 257]> as core::ops::deref::DerefMut>::deref_mut
Unexecuted instantiation: <aligned::Aligned<aligned::A64, [u16; 16384]> as core::ops::deref::DerefMut>::deref_mut
Unexecuted instantiation: <aligned::Aligned<aligned::A64, [core::mem::maybe_uninit::MaybeUninit<u8>; 257]> as core::ops::deref::DerefMut>::deref_mut
Unexecuted instantiation: <aligned::Aligned<aligned::A64, [u8; 16384]> as core::ops::deref::DerefMut>::deref_mut
156
}
157
158
impl<A, T> Aligned<A, [T]>
159
where
160
    A: Alignment,
161
{
162
    fn is_index_aligned(index: usize) -> bool {
163
        use core::mem::size_of;
164
165
        (index * size_of::<T>()) % A::ALIGN == 0
166
    }
167
    fn check_start_index(index: usize) {
168
        if !Self::is_index_aligned(index) {
169
            panic!("Unaligned start index");
170
        }
171
    }
172
}
173
174
impl<A, T> ops::Index<ops::RangeFrom<usize>> for Aligned<A, [T]>
175
where
176
    A: Alignment,
177
{
178
    type Output = Aligned<A, [T]>;
179
180
    fn index(&self, range: ops::RangeFrom<usize>) -> &Aligned<A, [T]> {
181
        Self::check_start_index(range.start);
182
        unsafe { &*(&self.value[range] as *const [T] as *const Aligned<A, [T]>) }
183
    }
184
}
185
186
impl<A, T> ops::Index<ops::RangeTo<usize>> for Aligned<A, [T]>
187
where
188
    A: Alignment,
189
{
190
    type Output = Aligned<A, [T]>;
191
192
    fn index(&self, range: ops::RangeTo<usize>) -> &Aligned<A, [T]> {
193
        unsafe { &*(&self.value[range] as *const [T] as *const Aligned<A, [T]>) }
194
    }
195
}
196
197
impl<A, T> ops::Index<ops::RangeToInclusive<usize>> for Aligned<A, [T]>
198
where
199
    A: Alignment,
200
{
201
    type Output = Aligned<A, [T]>;
202
203
    fn index(&self, range: ops::RangeToInclusive<usize>) -> &Aligned<A, [T]> {
204
        unsafe { &*(&self.value[range] as *const [T] as *const Aligned<A, [T]>) }
205
    }
206
}
207
208
impl<A, T> ops::Index<ops::RangeInclusive<usize>> for Aligned<A, [T]>
209
where
210
    A: Alignment,
211
{
212
    type Output = Aligned<A, [T]>;
213
214
    fn index(&self, range: ops::RangeInclusive<usize>) -> &Aligned<A, [T]> {
215
        Self::check_start_index(*range.start());
216
        unsafe { &*(&self.value[range] as *const [T] as *const Aligned<A, [T]>) }
217
    }
218
}
219
220
impl<A, T> ops::Index<ops::Range<usize>> for Aligned<A, [T]>
221
where
222
    A: Alignment,
223
{
224
    type Output = Aligned<A, [T]>;
225
226
    fn index(&self, range: ops::Range<usize>) -> &Aligned<A, [T]> {
227
        Self::check_start_index(range.start);
228
        unsafe { &*(&self.value[range] as *const [T] as *const Aligned<A, [T]>) }
229
    }
230
}
231
232
impl<A, T> ops::Index<ops::RangeFull> for Aligned<A, [T]>
233
where
234
    A: Alignment,
235
{
236
    type Output = Aligned<A, [T]>;
237
238
    fn index(&self, range: ops::RangeFull) -> &Aligned<A, [T]> {
239
        unsafe { &*(&self.value[range] as *const [T] as *const Aligned<A, [T]>) }
240
    }
241
}
242
243
impl<A, T> ops::IndexMut<ops::RangeFrom<usize>> for Aligned<A, [T]>
244
where
245
    A: Alignment,
246
{
247
    fn index_mut(&mut self, range: ops::RangeFrom<usize>) -> &mut Aligned<A, [T]> {
248
        Self::check_start_index(range.start);
249
        unsafe { &mut *(&mut self.value[range] as *mut [T] as *mut Aligned<A, [T]>) }
250
    }
251
}
252
253
impl<A, T> ops::IndexMut<ops::RangeTo<usize>> for Aligned<A, [T]>
254
where
255
    A: Alignment,
256
{
257
    fn index_mut(&mut self, range: ops::RangeTo<usize>) -> &mut Aligned<A, [T]> {
258
        unsafe { &mut *(&mut self.value[range] as *mut [T] as *mut Aligned<A, [T]>) }
259
    }
260
}
261
262
impl<A, T> ops::IndexMut<ops::RangeToInclusive<usize>> for Aligned<A, [T]>
263
where
264
    A: Alignment,
265
{
266
    fn index_mut(&mut self, range: ops::RangeToInclusive<usize>) -> &mut Aligned<A, [T]> {
267
        unsafe { &mut *(&mut self.value[range] as *mut [T] as *mut Aligned<A, [T]>) }
268
    }
269
}
270
271
impl<A, T> ops::IndexMut<ops::RangeInclusive<usize>> for Aligned<A, [T]>
272
where
273
    A: Alignment,
274
{
275
    fn index_mut(&mut self, range: ops::RangeInclusive<usize>) -> &mut Aligned<A, [T]> {
276
        Self::check_start_index(*range.start());
277
        unsafe { &mut *(&mut self.value[range] as *mut [T] as *mut Aligned<A, [T]>) }
278
    }
279
}
280
281
impl<A, T> ops::IndexMut<ops::Range<usize>> for Aligned<A, [T]>
282
where
283
    A: Alignment,
284
{
285
    fn index_mut(&mut self, range: ops::Range<usize>) -> &mut Aligned<A, [T]> {
286
        Self::check_start_index(range.start);
287
        unsafe { &mut *(&mut self.value[range] as *mut [T] as *mut Aligned<A, [T]>) }
288
    }
289
}
290
291
impl<A, T> ops::IndexMut<ops::RangeFull> for Aligned<A, [T]>
292
where
293
    A: Alignment,
294
{
295
    fn index_mut(&mut self, range: ops::RangeFull) -> &mut Aligned<A, [T]> {
296
        unsafe { &mut *(&mut self.value[range] as *mut [T] as *mut Aligned<A, [T]>) }
297
    }
298
}
299
300
impl<A, T> AsSlice for Aligned<A, T>
301
where
302
    A: Alignment,
303
    T: AsSlice,
304
{
305
    type Element = T::Element;
306
307
    fn as_slice(&self) -> &[T::Element] {
308
        T::as_slice(&**self)
309
    }
310
}
311
312
impl<A, T> AsMutSlice for Aligned<A, T>
313
where
314
    A: Alignment,
315
    T: AsMutSlice,
316
{
317
    fn as_mut_slice(&mut self) -> &mut [T::Element] {
318
        T::as_mut_slice(&mut **self)
319
    }
320
}
321
322
impl<A, T> Borrow<T> for Aligned<A, T>
323
where
324
    A: Alignment,
325
{
326
    fn borrow(&self) -> &T {
327
        &self.value
328
    }
329
}
330
331
impl<A, T> BorrowMut<T> for Aligned<A, T>
332
where
333
    A: Alignment,
334
{
335
    fn borrow_mut(&mut self) -> &mut T {
336
        &mut self.value
337
    }
338
}
339
340
impl<A, T> Borrow<[<Aligned<A, T> as AsSlice>::Element]> for Aligned<A, T>
341
where
342
    A: Alignment,
343
    Aligned<A, T>: AsSlice,
344
{
345
    fn borrow(&self) -> &[<Aligned<A, T> as AsSlice>::Element] {
346
        self.as_slice()
347
    }
348
}
349
350
impl<A, T> BorrowMut<[<Aligned<A, T> as AsSlice>::Element]> for Aligned<A, T>
351
where
352
    A: Alignment,
353
    Aligned<A, T>: AsMutSlice,
354
{
355
    fn borrow_mut(&mut self) -> &mut [<Aligned<A, T> as AsSlice>::Element] {
356
        self.as_mut_slice()
357
    }
358
}
359
360
impl<A, T> Clone for Aligned<A, T>
361
where
362
    A: Alignment,
363
    T: Clone,
364
{
365
    fn clone(&self) -> Self {
366
        Self {
367
            _alignment: [],
368
            value: self.value.clone(),
369
        }
370
    }
371
}
372
373
impl<A, T> Copy for Aligned<A, T>
374
where
375
    A: Alignment,
376
    T: Copy,
377
{
378
}
379
380
impl<A, T> Default for Aligned<A, T>
381
where
382
    A: Alignment,
383
    T: Default,
384
{
385
    fn default() -> Self {
386
        Self {
387
            _alignment: [],
388
            value: Default::default(),
389
        }
390
    }
391
}
392
393
impl<A, T> Debug for Aligned<A, T>
394
where
395
    A: Alignment,
396
    T: Debug,
397
{
398
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
399
        self.value.fmt(f)
400
    }
401
}
402
403
impl<A, T> Display for Aligned<A, T>
404
where
405
    A: Alignment,
406
    T: Display,
407
{
408
    fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
409
        self.value.fmt(f)
410
    }
411
}
412
413
impl<A, T> PartialEq for Aligned<A, T>
414
where
415
    A: Alignment,
416
    T: PartialEq,
417
{
418
    fn eq(&self, other: &Self) -> bool {
419
        self.value == other.value
420
    }
421
}
422
423
impl<A, T> Eq for Aligned<A, T>
424
where
425
    A: Alignment,
426
    T: Eq,
427
{
428
}
429
430
impl<A, T> Hash for Aligned<A, T>
431
where
432
    A: Alignment,
433
    T: Hash,
434
{
435
    fn hash<H: Hasher>(&self, state: &mut H) {
436
        self.value.hash(state);
437
    }
438
}
439
440
impl<A, T> Ord for Aligned<A, T>
441
where
442
    A: Alignment,
443
    T: Ord,
444
{
445
    fn cmp(&self, other: &Self) -> Ordering {
446
        self.value.cmp(&other.value)
447
    }
448
}
449
450
impl<A, T> PartialOrd for Aligned<A, T>
451
where
452
    A: Alignment,
453
    T: PartialOrd,
454
{
455
    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
456
        self.value.partial_cmp(&other.value)
457
    }
458
}
459
460
#[test]
461
fn sanity() {
462
    use core::mem;
463
464
    let a: Aligned<A1, _> = Aligned([0u8; 3]);
465
    let x: Aligned<A2, _> = Aligned([0u8; 3]);
466
    let y: Aligned<A4, _> = Aligned([0u8; 3]);
467
    let z: Aligned<A8, _> = Aligned([0u8; 3]);
468
    let w: Aligned<A16, _> = Aligned([0u8; 3]);
469
470
    // check alignment
471
    assert_eq!(mem::align_of_val(&a), 1);
472
    assert_eq!(mem::align_of_val(&x), 2);
473
    assert_eq!(mem::align_of_val(&y), 4);
474
    assert_eq!(mem::align_of_val(&z), 8);
475
    assert_eq!(mem::align_of_val(&w), 16);
476
477
    assert!(a.as_ptr() as usize % 1 == 0);
478
    assert!(x.as_ptr() as usize % 2 == 0);
479
    assert!(y.as_ptr() as usize % 4 == 0);
480
    assert!(z.as_ptr() as usize % 8 == 0);
481
    assert!(w.as_ptr() as usize % 16 == 0);
482
483
    // test `deref`
484
    assert_eq!(a.len(), 3);
485
    assert_eq!(x.len(), 3);
486
    assert_eq!(y.len(), 3);
487
    assert_eq!(z.len(), 3);
488
    assert_eq!(w.len(), 3);
489
490
    // alignment should be preserved after slicing
491
    let a: &Aligned<_, [_]> = &a;
492
    let x: &Aligned<_, [_]> = &x;
493
    let y: &Aligned<_, [_]> = &y;
494
    let z: &Aligned<_, [_]> = &z;
495
    let w: &Aligned<_, [_]> = &w;
496
497
    let a: &Aligned<_, _> = &a[..2];
498
    let x: &Aligned<_, _> = &x[..2];
499
    let y: &Aligned<_, _> = &y[..2];
500
    let z: &Aligned<_, _> = &z[..2];
501
    let w: &Aligned<_, _> = &w[..2];
502
503
    assert!(a.as_ptr() as usize % 1 == 0);
504
    assert!(x.as_ptr() as usize % 2 == 0);
505
    assert!(y.as_ptr() as usize % 4 == 0);
506
    assert!(z.as_ptr() as usize % 8 == 0);
507
    assert!(w.as_ptr() as usize % 16 == 0);
508
509
    // alignment should be preserved after boxing
510
    let a: Box<Aligned<A1, [u8]>> = Box::new(Aligned([0u8; 3]));
511
    let x: Box<Aligned<A2, [u8]>> = Box::new(Aligned([0u8; 3]));
512
    let y: Box<Aligned<A4, [u8]>> = Box::new(Aligned([0u8; 3]));
513
    let z: Box<Aligned<A8, [u8]>> = Box::new(Aligned([0u8; 3]));
514
    let w: Box<Aligned<A16, [u8]>> = Box::new(Aligned([0u8; 3]));
515
516
    assert_eq!(mem::align_of_val(&*a), 1);
517
    assert_eq!(mem::align_of_val(&*x), 2);
518
    assert_eq!(mem::align_of_val(&*y), 4);
519
    assert_eq!(mem::align_of_val(&*z), 8);
520
    assert_eq!(mem::align_of_val(&*w), 16);
521
522
    // test coercions
523
    let x: Aligned<A2, _> = Aligned([0u8; 3]);
524
    let y: &Aligned<A2, [u8]> = &x;
525
    let _: &[u8] = y;
526
}
527
528
#[test]
529
fn test_range_to() {
530
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0, 1, 2, 3]);
531
    assert_eq!((&a[..0]).as_slice(), &[],);
532
    assert_eq!((&a[..1]).as_slice(), &[0],);
533
    assert_eq!((&a[..2]).as_slice(), &[0, 1],);
534
    assert_eq!((&a[..3]).as_slice(), &[0, 1, 2],);
535
    assert_eq!((&a[..4]).as_slice(), &[0, 1, 2, 3],);
536
}
537
538
#[test]
539
fn test_range_to_mut() {
540
    let a: &mut Aligned<A2, [u8]> = &mut Aligned::<A2, _>([0, 1, 2, 3]);
541
    assert_eq!((&mut a[..0]).as_slice(), &[],);
542
    assert_eq!((&mut a[..1]).as_slice(), &[0],);
543
    assert_eq!((&mut a[..2]).as_slice(), &[0, 1],);
544
    assert_eq!((&mut a[..3]).as_slice(), &[0, 1, 2],);
545
    assert_eq!((&mut a[..4]).as_slice(), &[0, 1, 2, 3],);
546
}
547
548
#[test]
549
fn test_range_to_inclusive() {
550
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0, 1, 2, 3]);
551
    assert_eq!((&a[..=0]).as_slice(), &[0],);
552
    assert_eq!((&a[..=1]).as_slice(), &[0, 1],);
553
    assert_eq!((&a[..=2]).as_slice(), &[0, 1, 2],);
554
    assert_eq!((&a[..=3]).as_slice(), &[0, 1, 2, 3],);
555
}
556
557
#[test]
558
fn test_range_to_inclusive_mut() {
559
    let a: &mut Aligned<A2, [u8]> = &mut Aligned::<A2, _>([0, 1, 2, 3]);
560
    assert_eq!((&mut a[..=0]).as_slice(), &[0],);
561
    assert_eq!((&mut a[..=1]).as_slice(), &[0, 1],);
562
    assert_eq!((&mut a[..=2]).as_slice(), &[0, 1, 2],);
563
    assert_eq!((&mut a[..=3]).as_slice(), &[0, 1, 2, 3],);
564
}
565
566
#[test]
567
fn test_range_full() {
568
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0, 1, 2, 3]);
569
    assert_eq!((&a[..]).as_slice(), &[0, 1, 2, 3],);
570
}
571
572
#[test]
573
fn test_range_full_mut() {
574
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0, 1, 2, 3]);
575
    assert_eq!((&a[..]).as_slice(), &[0, 1, 2, 3],);
576
}
577
578
#[test]
579
fn test_range_from() {
580
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0, 1, 2, 3]);
581
    assert_eq!((&a[0..]).as_slice(), &[0, 1, 2, 3],);
582
    assert_eq!((&a[2..]).as_slice(), &[2, 3],);
583
    assert_eq!((&a[4..]).as_slice(), &[],);
584
585
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0, 1, 2]);
586
    assert_eq!((&a[0..]).as_slice(), &[0, 1, 2],);
587
    assert_eq!((&a[2..]).as_slice(), &[2],);
588
589
    let a: &Aligned<A4, [u8]> = &Aligned::<A4, _>([0, 1, 2, 3, 4, 5, 6, 7]);
590
    assert_eq!((&a[0..]).as_slice(), &[0, 1, 2, 3, 4, 5, 6, 7],);
591
    assert_eq!((&a[4..]).as_slice(), &[4, 5, 6, 7],);
592
    assert_eq!((&a[8..]).as_slice(), &[],);
593
594
    let a: &Aligned<A4, [u8]> = &Aligned::<A4, _>([0, 1, 2, 3, 4, 5, 6]);
595
    assert_eq!((&a[0..]).as_slice(), &[0, 1, 2, 3, 4, 5, 6],);
596
    assert_eq!((&a[4..]).as_slice(), &[4, 5, 6],);
597
598
    let a: &Aligned<A8, [u8]> =
599
        &Aligned::<A8, _>([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]);
600
    assert_eq!(
601
        (&a[0..]).as_slice(),
602
        &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
603
    );
604
    assert_eq!((&a[8..]).as_slice(), &[8, 9, 10, 11, 12, 13, 14, 15],);
605
    assert_eq!((&a[16..]).as_slice(), &[],);
606
607
    let a: &Aligned<A8, [u8]> =
608
        &Aligned::<A8, _>([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]);
609
    assert_eq!(
610
        (&a[0..]).as_slice(),
611
        &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
612
    );
613
    assert_eq!((&a[8..]).as_slice(), &[8, 9, 10, 11, 12, 13, 14],);
614
615
    let a: &Aligned<A16, [u8]> = &Aligned::<A16, _>([
616
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
617
        25, 26, 27, 28, 29, 30, 31,
618
    ]);
619
    assert_eq!(
620
        (&a[0..]).as_slice(),
621
        &[
622
            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
623
            24, 25, 26, 27, 28, 29, 30, 31
624
        ],
625
    );
626
    assert_eq!(
627
        (&a[16..]).as_slice(),
628
        &[16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31],
629
    );
630
    assert_eq!((&a[32..]).as_slice(), &[],);
631
632
    let a: &Aligned<A16, [u8]> = &Aligned::<A16, _>([
633
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
634
        25, 26, 27, 28, 29, 30,
635
    ]);
636
    assert_eq!(
637
        (&a[0..]).as_slice(),
638
        &[
639
            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
640
            24, 25, 26, 27, 28, 29, 30
641
        ],
642
    );
643
    assert_eq!(
644
        (&a[16..]).as_slice(),
645
        &[16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
646
    );
647
648
    let a: &Aligned<A32, [u8]> = &Aligned::<A32, _>([
649
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
650
        25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
651
        48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63,
652
    ]);
653
    assert_eq!(
654
        (&a[0..]).as_slice(),
655
        &[
656
            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
657
            24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
658
            46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63
659
        ]
660
    );
661
    assert_eq!(
662
        (&a[32..]).as_slice(),
663
        &[
664
            32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
665
            54, 55, 56, 57, 58, 59, 60, 61, 62, 63
666
        ]
667
    );
668
    assert_eq!((&a[64..]).as_slice(), &[],);
669
670
    let a: &Aligned<A32, [u8]> = &Aligned::<A32, _>([
671
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
672
        25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
673
        48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62,
674
    ]);
675
    assert_eq!(
676
        (&a[0..]).as_slice(),
677
        &[
678
            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
679
            24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
680
            46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62
681
        ]
682
    );
683
    assert_eq!(
684
        (&a[32..]).as_slice(),
685
        &[
686
            32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
687
            54, 55, 56, 57, 58, 59, 60, 61, 62
688
        ]
689
    );
690
691
    let a: &Aligned<A64, [u8]> = &Aligned::<A64, _>([
692
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
693
        25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
694
        48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
695
        71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
696
        94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
697
        113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127,
698
    ]);
699
    assert_eq!(
700
        (&a[0..]).as_slice(),
701
        &[
702
            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
703
            24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
704
            46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
705
            68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
706
            90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108,
707
            109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
708
            126, 127
709
        ]
710
    );
711
    assert_eq!(
712
        (&a[64..]).as_slice(),
713
        &[
714
            64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
715
            86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
716
            106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
717
            123, 124, 125, 126, 127
718
        ]
719
    );
720
    assert_eq!((&a[128..]).as_slice(), &[]);
721
722
    let a: &Aligned<A64, [u8]> = &Aligned::<A64, _>([
723
        0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
724
        25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
725
        48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70,
726
        71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93,
727
        94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112,
728
        113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126,
729
    ]);
730
    assert_eq!(
731
        (&a[0..]).as_slice(),
732
        &[
733
            0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
734
            24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45,
735
            46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
736
            68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
737
            90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108,
738
            109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125,
739
            126
740
        ]
741
    );
742
    assert_eq!(
743
        (&a[64..]).as_slice(),
744
        &[
745
            64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
746
            86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105,
747
            106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122,
748
            123, 124, 125, 126
749
        ]
750
    );
751
}
752
753
#[test]
754
#[should_panic(expected = "Unaligned start index")]
755
fn test_range_from_a2_invalid_alignment() {
756
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0u8; 4]);
757
    let _ = &a[1..];
758
}
759
760
#[test]
761
#[should_panic(expected = "Unaligned start index")]
762
fn test_range_from_a4_invalid_alignment() {
763
    let a: &Aligned<A4, [u8]> = &Aligned::<A4, _>([0u8; 8]);
764
    let _ = &a[6..];
765
}
766
767
#[test]
768
fn test_range_from_mut() {
769
    let a: &mut Aligned<A2, [u8]> = &mut Aligned::<A2, _>([0, 1, 2, 3]);
770
    assert_eq!((&mut a[0..]).as_slice(), &[0, 1, 2, 3],);
771
    assert_eq!((&mut a[2..]).as_slice(), &[2, 3],);
772
    assert_eq!((&mut a[4..]).as_slice(), &[],);
773
774
    let a: &mut Aligned<A2, [u8]> = &mut Aligned::<A2, _>([0, 1, 2]);
775
    assert_eq!((&mut a[0..]).as_slice(), &[0, 1, 2],);
776
    assert_eq!((&mut a[2..]).as_slice(), &[2],);
777
}
778
779
#[test]
780
#[should_panic(expected = "Unaligned start index")]
781
fn test_range_from_mut_invalid_argument() {
782
    let a: &mut Aligned<A2, [u8]> = &mut Aligned::<A2, _>([0u8; 4]);
783
    let _ = &mut a[1..];
784
}
785
786
#[test]
787
fn test_range() {
788
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0, 1, 2, 3]);
789
    assert_eq!((&a[0..0]).as_slice(), &[],);
790
    assert_eq!((&a[0..1]).as_slice(), &[0],);
791
    assert_eq!((&a[0..2]).as_slice(), &[0, 1],);
792
    assert_eq!((&a[0..3]).as_slice(), &[0, 1, 2],);
793
    assert_eq!((&a[0..4]).as_slice(), &[0, 1, 2, 3],);
794
    assert_eq!((&a[2..2]).as_slice(), &[],);
795
    assert_eq!((&a[2..3]).as_slice(), &[2],);
796
    assert_eq!((&a[2..4]).as_slice(), &[2, 3],);
797
    assert_eq!((&a[4..4]).as_slice(), &[],);
798
}
799
800
#[test]
801
#[should_panic(expected = "Unaligned start index")]
802
fn test_range_invalid_alignment() {
803
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0u8; 4]);
804
    let _ = &a[1..2];
805
}
806
807
#[test]
808
fn test_range_mut() {
809
    let a: &mut Aligned<A2, [u8]> = &mut Aligned::<A2, _>([0, 1, 2, 3]);
810
    assert_eq!((&mut a[0..0]).as_slice(), &[],);
811
    assert_eq!((&mut a[0..1]).as_slice(), &[0],);
812
    assert_eq!((&mut a[0..2]).as_slice(), &[0, 1],);
813
    assert_eq!((&mut a[0..3]).as_slice(), &[0, 1, 2],);
814
    assert_eq!((&mut a[0..4]).as_slice(), &[0, 1, 2, 3],);
815
    assert_eq!((&mut a[2..2]).as_slice(), &[],);
816
    assert_eq!((&mut a[2..3]).as_slice(), &[2],);
817
    assert_eq!((&mut a[2..4]).as_slice(), &[2, 3],);
818
    assert_eq!((&mut a[4..4]).as_slice(), &[],);
819
}
820
821
#[test]
822
#[should_panic(expected = "Unaligned start index")]
823
fn test_range_mut_invalid_alignment() {
824
    let a: &mut Aligned<A2, [u8]> = &mut Aligned::<A2, _>([0u8; 4]);
825
    let _ = &mut a[1..2];
826
}
827
828
#[test]
829
fn test_range_inclusive() {
830
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0, 1, 2, 3]);
831
    assert_eq!((&a[0..=0]).as_slice(), &[0],);
832
    assert_eq!((&a[0..=1]).as_slice(), &[0, 1],);
833
    assert_eq!((&a[0..=2]).as_slice(), &[0, 1, 2],);
834
    assert_eq!((&a[0..=3]).as_slice(), &[0, 1, 2, 3],);
835
    assert_eq!((&a[2..=2]).as_slice(), &[2],);
836
    assert_eq!((&a[2..=3]).as_slice(), &[2, 3],);
837
}
838
839
#[test]
840
#[should_panic(expected = "Unaligned start index")]
841
fn test_range_inclusive_invalid_alignment() {
842
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0u8; 4]);
843
    let _ = &a[1..=2];
844
}
845
846
#[test]
847
fn test_range_inclusive_mut() {
848
    let a: &mut Aligned<A2, [u8]> = &mut Aligned::<A2, _>([0, 1, 2, 3]);
849
    assert_eq!((&mut a[0..=0]).as_slice(), &[0],);
850
    assert_eq!((&mut a[0..=1]).as_slice(), &[0, 1],);
851
    assert_eq!((&mut a[0..=2]).as_slice(), &[0, 1, 2],);
852
    assert_eq!((&mut a[0..=3]).as_slice(), &[0, 1, 2, 3],);
853
    assert_eq!((&mut a[2..=2]).as_slice(), &[2],);
854
    assert_eq!((&mut a[2..=3]).as_slice(), &[2, 3],);
855
}
856
857
#[test]
858
#[should_panic(expected = "Unaligned start index")]
859
fn test_range_inclusive_mut_invalid_alignment() {
860
    let a: &mut Aligned<A2, [u8]> = &mut Aligned::<A2, _>([0u8; 4]);
861
    let _ = &mut a[1..=2];
862
}
863
864
#[test]
865
#[should_panic(expected = "out of range")]
866
fn test_range_from_out_of_bounds() {
867
    let a: &Aligned<A2, [u8]> = &Aligned::<A2, _>([0u8; 4]);
868
    let _ = &a[6..];
869
}