multiboot2_header/
end.rs

1use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
2use core::mem;
3use multiboot2_common::{MaybeDynSized, Tag};
4
5/// Terminates a list of optional tags in a Multiboot2 header.
6#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
7#[repr(C)]
8pub struct EndHeaderTag {
9    header: HeaderTagHeader,
10}
11
12impl Default for EndHeaderTag {
13    fn default() -> Self {
14        Self::new()
15    }
16}
17
18impl EndHeaderTag {
19    /// Constructs a new tag.
20    #[must_use]
21    pub const fn new() -> Self {
22        let header = HeaderTagHeader::new(
23            HeaderTagType::EntryAddress,
24            HeaderTagFlag::Required,
25            mem::size_of::<Self>() as u32,
26        );
27        Self { header }
28    }
29
30    /// Returns the [`HeaderTagType`].
31    #[must_use]
32    pub const fn typ(&self) -> HeaderTagType {
33        self.header.typ()
34    }
35
36    /// Returns the [`HeaderTagFlag`]s.
37    #[must_use]
38    pub const fn flags(&self) -> HeaderTagFlag {
39        self.header.flags()
40    }
41
42    /// Returns the size.
43    #[must_use]
44    pub const fn size(&self) -> u32 {
45        self.header.size()
46    }
47}
48
49impl MaybeDynSized for EndHeaderTag {
50    type Header = HeaderTagHeader;
51
52    const BASE_SIZE: usize = mem::size_of::<Self>();
53
54    fn dst_len(_header: &Self::Header) -> Self::Metadata {}
55}
56
57impl Tag for EndHeaderTag {
58    type IDType = HeaderTagType;
59    const ID: HeaderTagType = HeaderTagType::End;
60}
61
62#[cfg(test)]
63mod tests {
64    use crate::EndHeaderTag;
65
66    #[test]
67    fn test_assert_size() {
68        assert_eq!(core::mem::size_of::<EndHeaderTag>(), 2 + 2 + 4);
69    }
70}