use crate::error::Result;
use byteordered::Endianness;
use dicom_core::header::{DataElementHeader, Length, SequenceItemHeader};
use dicom_core::Tag;
use std::io::Read;
pub trait BasicDecode {
fn endianness(&self) -> Endianness;
fn erased_decode_us(&self, source: &mut dyn Read) -> Result<u16>;
fn erased_decode_ul(&self, source: &mut dyn Read) -> Result<u32>;
fn erased_decode_uv(&self, source: &mut dyn Read) -> Result<u64>;
fn erased_decode_ss(&self, source: &mut dyn Read) -> Result<i16>;
fn erased_decode_sl(&self, source: &mut dyn Read) -> Result<i32>;
fn erased_decode_sv(&self, source: &mut dyn Read) -> Result<i64>;
fn erased_decode_fl(&self, source: &mut dyn Read) -> Result<f32>;
fn erased_decode_fd(&self, source: &mut dyn Read) -> Result<f64>;
}
pub trait Decode: BasicDecode {
fn erased_decode(&self, source: &mut dyn Read) -> Result<DataElementHeader>;
fn erased_decode_item(&self, mut source: &mut dyn Read) -> Result<SequenceItemHeader> {
let tag = self.erased_decode_tag(&mut source)?;
let len = self.erased_decode_ul(&mut source)?;
let header = SequenceItemHeader::new(tag, Length(len))?;
Ok(header)
}
fn erased_decode_tag(&self, source: &mut dyn Read) -> Result<Tag> {
let group = self.erased_decode_us(source)?;
let elem = self.erased_decode_us(source)?;
Ok(Tag(group, elem))
}
}
impl<'s> super::BasicDecode for &'s dyn BasicDecode {
fn endianness(&self) -> Endianness {
(**self).endianness()
}
fn decode_us<S>(&self, mut source: S) -> Result<u16>
where
S: Read,
{
(**self).erased_decode_us(&mut source)
}
fn decode_ul<S>(&self, mut source: S) -> Result<u32>
where
S: Read,
{
(**self).erased_decode_ul(&mut source)
}
fn decode_uv<S>(&self, mut source: S) -> Result<u64>
where
S: Read,
{
(**self).erased_decode_uv(&mut source)
}
fn decode_ss<S>(&self, mut source: S) -> Result<i16>
where
S: Read,
{
(**self).erased_decode_ss(&mut source)
}
fn decode_sl<S>(&self, mut source: S) -> Result<i32>
where
S: Read,
{
(**self).erased_decode_sl(&mut source)
}
fn decode_sv<S>(&self, mut source: S) -> Result<i64>
where
S: Read,
{
(**self).erased_decode_sv(&mut source)
}
fn decode_fl<S>(&self, mut source: S) -> Result<f32>
where
S: Read,
{
(**self).erased_decode_fl(&mut source)
}
fn decode_fd<S>(&self, mut source: S) -> Result<f64>
where
S: Read,
{
(**self).erased_decode_fd(&mut source)
}
}