use core::marker::PhantomData;
use super::consts::GRP_COMDAT;
use super::format::{ElfFormat, Endian};
use super::section::SectionHeader;
#[derive(Debug)]
pub struct Group<'a, F: ElfFormat> {
pub index: u32,
pub header: SectionHeader,
pub flags: u32,
pub symtab: u32,
pub signature_symbol: u32,
members: &'a [[u8; 4]],
_format: PhantomData<F>,
}
impl<F: ElfFormat> Clone for Group<'_, F> {
fn clone(&self) -> Self {
*self
}
}
impl<F: ElfFormat> Copy for Group<'_, F> {}
impl<'a, F: ElfFormat> Group<'a, F> {
pub(crate) fn new(index: u32, header: SectionHeader, words: &'a [[u8; 4]]) -> Option<Self> {
let (flags, members) = words.split_first()?;
Some(Self {
index,
header,
flags: F::Endian::u32(*flags),
symtab: header.sh_link,
signature_symbol: header.sh_info,
members,
_format: PhantomData,
})
}
#[must_use]
pub fn is_comdat(&self) -> bool {
self.flags & GRP_COMDAT != 0
}
#[must_use]
pub fn member_count(&self) -> usize {
self.members.len()
}
pub fn members(&self) -> impl ExactSizeIterator<Item = u32> + use<'a, F> {
self.members.iter().map(|w| F::Endian::u32(*w))
}
}