use endianity::{Endianity, EndianBuf};
use lookup::{PubStuffParser, LookupEntryIter, DebugLookup, NamesOrTypesSwitch};
use parser::{Format, Result};
use unit::{DebugTypesOffset, parse_debug_types_offset};
use std::ffi;
use std::marker::PhantomData;
use std::rc::Rc;
#[derive(Debug, PartialEq, Eq)]
pub struct PubTypesHeader {
format: Format,
length: u64,
version: u16,
types_offset: DebugTypesOffset,
types_length: u64,
}
#[derive(Debug, Clone)]
pub struct PubTypesEntry<'input> {
offset: u64,
name: &'input ffi::CStr,
header: Rc<PubTypesHeader>,
}
impl<'input> PubTypesEntry<'input> {
pub fn name(&self) -> &'input ffi::CStr {
self.name
}
pub fn types_offset(&self) -> DebugTypesOffset {
self.header.types_offset
}
}
#[derive(Clone, Debug)]
pub struct TypesSwitch<'input, Endian>
where Endian: 'input + Endianity
{
phantom: PhantomData<&'input Endian>,
}
impl<'input, Endian> NamesOrTypesSwitch<'input, Endian> for TypesSwitch<'input, Endian>
where Endian: Endianity
{
type Header = PubTypesHeader;
type Entry = PubTypesEntry<'input>;
type Offset = DebugTypesOffset;
fn new_header(format: Format,
set_length: u64,
version: u16,
offset: DebugTypesOffset,
length: u64)
-> Rc<PubTypesHeader> {
Rc::new(PubTypesHeader {
format: format,
length: set_length,
version: version,
types_offset: offset,
types_length: length,
})
}
fn new_entry(offset: u64,
name: &'input ffi::CStr,
header: &Rc<PubTypesHeader>)
-> PubTypesEntry<'input> {
PubTypesEntry {
offset: offset,
name: name,
header: header.clone(),
}
}
fn parse_offset(input: EndianBuf<Endian>,
format: Format)
-> Result<(EndianBuf<Endian>, Self::Offset)> {
parse_debug_types_offset(input, format)
}
fn format_from(header: &PubTypesHeader) -> Format {
header.format
}
}
pub type DebugPubTypes<'input, Endian> = DebugLookup<'input,
Endian,
PubStuffParser<'input,
Endian,
TypesSwitch<'input, Endian>>>;
pub type PubTypesEntryIter<'input, Endian> = LookupEntryIter<'input,
Endian,
PubStuffParser<'input,
Endian,
TypesSwitch<'input,
Endian>>>;