Skip to main content

libutils_array/
references.rs

1//^
2//^ HEAD
3//^
4
5//> HEAD -> SUPER
6use super::Array;
7
8//> HEAD -> CORE
9use core::{
10    slice::{
11        from_raw_parts as fat,
12        from_raw_parts_mut as mutfat
13    },
14    borrow::{
15        Borrow,
16        BorrowMut
17    },
18    ops::{
19        Deref,
20        DerefMut,
21        DerefPure
22    }
23};
24
25
26//^
27//^ DEREF
28//^
29
30//> DEREF -> SLICE
31const impl<Type, const N: usize> Deref for Array<Type, N> {
32    type Target = [Type];
33    fn deref(&self) -> &Self::Target {return unsafe {fat(self.data.as_ptr() as *const Type, self.length)}}
34}
35
36//> DEREF -> MUTABLE SLICE
37const impl<Type, const N: usize> DerefMut for Array<Type, N> {
38    fn deref_mut(&mut self) -> &mut Self::Target {return unsafe {mutfat(self.pointer().as_ptr(), self.length)}}
39}
40
41//> DEREF -> PURE
42unsafe impl<Type, const N: usize> DerefPure for Array<Type, N> {}
43
44
45//^
46//^ REFERENCES
47//^
48
49//> REFERENCES -> SLICE
50const impl<Type, const N: usize> AsRef<[Type]> for Array<Type, N> {
51    fn as_ref(&self) -> &[Type] {return self.deref()}
52}
53
54//> REFERENCES -> MUTABLE SLICE
55const impl<Type, const N: usize> AsMut<[Type]> for Array<Type, N> {
56    fn as_mut(&mut self) -> &mut [Type] {return self.deref_mut()}
57}
58
59
60//^
61//^ BORROW
62//^
63
64//> BORROW -> CONSTANT
65const impl<Type, const N: usize> Borrow<[Type]> for Array<Type, N> {
66    fn borrow(&self) -> &[Type] {self.as_ref()}
67}
68
69//> BORROW -> MUTABLE
70const impl<Type, const N: usize> BorrowMut<[Type]> for Array<Type, N> {
71    fn borrow_mut(&mut self) -> &mut [Type] {self.as_mut()}
72}