1 use core::fmt::Debug;
2 
3 use crate::elf;
4 use crate::endian;
5 use crate::pod::Pod;
6 
7 /// A trait for generic access to `Dyn32` and `Dyn64`.
8 #[allow(missing_docs)]
9 pub trait Dyn: Debug + Pod {
10     type Word: Into<u64>;
11     type Endian: endian::Endian;
12 
d_tag(&self, endian: Self::Endian) -> Self::Word13     fn d_tag(&self, endian: Self::Endian) -> Self::Word;
d_val(&self, endian: Self::Endian) -> Self::Word14     fn d_val(&self, endian: Self::Endian) -> Self::Word;
15 }
16 
17 impl<Endian: endian::Endian> Dyn for elf::Dyn32<Endian> {
18     type Word = u32;
19     type Endian = Endian;
20 
21     #[inline]
d_tag(&self, endian: Self::Endian) -> Self::Word22     fn d_tag(&self, endian: Self::Endian) -> Self::Word {
23         self.d_tag.get(endian)
24     }
25 
26     #[inline]
d_val(&self, endian: Self::Endian) -> Self::Word27     fn d_val(&self, endian: Self::Endian) -> Self::Word {
28         self.d_val.get(endian)
29     }
30 }
31 
32 impl<Endian: endian::Endian> Dyn for elf::Dyn64<Endian> {
33     type Word = u64;
34     type Endian = Endian;
35 
36     #[inline]
d_tag(&self, endian: Self::Endian) -> Self::Word37     fn d_tag(&self, endian: Self::Endian) -> Self::Word {
38         self.d_tag.get(endian)
39     }
40 
41     #[inline]
d_val(&self, endian: Self::Endian) -> Self::Word42     fn d_val(&self, endian: Self::Endian) -> Self::Word {
43         self.d_val.get(endian)
44     }
45 }
46