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