1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
use crate::error::Result;
use byteordered::Endianness;
use dicom_core::{DataElementHeader, Tag};
use std::io::Write;
pub mod basic;
pub trait BasicEncode {
fn endianness(&self) -> Endianness;
fn encode_us<S>(&self, to: S, value: u16) -> Result<()>
where
S: Write;
fn encode_ul<S>(&self, to: S, value: u32) -> Result<()>
where
S: Write;
fn encode_ss<S>(&self, to: S, value: i16) -> Result<()>
where
S: Write;
fn encode_sl<S>(&self, to: S, value: i32) -> Result<()>
where
S: Write;
fn encode_fl<S>(&self, to: S, value: f32) -> Result<()>
where
S: Write;
fn encode_fd<S>(&self, to: S, value: f64) -> Result<()>
where
S: Write;
#[inline]
fn with_encoder<T, F1, F2>(&self, f_le: F1, f_be: F2) -> T
where
F1: FnOnce(self::basic::LittleEndianBasicEncoder) -> T,
F2: FnOnce(self::basic::BigEndianBasicEncoder) -> T,
{
match self.endianness() {
Endianness::Little => f_le(self::basic::LittleEndianBasicEncoder),
Endianness::Big => f_be(self::basic::BigEndianBasicEncoder),
}
}
}
pub trait Encode {
type Writer: ?Sized + Write;
fn encode_tag(&self, to: &mut Self::Writer, tag: Tag) -> Result<()>;
fn encode_element_header(&self, to: &mut Self::Writer, de: DataElementHeader) -> Result<usize>;
fn encode_item_header(&self, to: &mut Self::Writer, len: u32) -> Result<()>;
fn encode_item_delimiter(&self, to: &mut Self::Writer) -> Result<()> {
self.encode_tag(to, Tag(0xFFFE, 0xE00D))?;
to.write_all(&[0u8; 4])?;
Ok(())
}
fn encode_sequence_delimiter(&self, to: &mut Self::Writer) -> Result<()> {
self.encode_tag(to, Tag(0xFFFE, 0xE0DD))?;
to.write_all(&[0u8; 4])?;
Ok(())
}
}