Skip to main content

multiboot2_header/
end.rs

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