1use crate::{HeaderTagFlag, HeaderTagHeader, HeaderTagType};
2use multiboot2_common::{MaybeDynSized, Tag};
3
4#[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 #[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 #[must_use]
31 pub const fn typ(&self) -> HeaderTagType {
32 self.header.typ()
33 }
34
35 #[must_use]
37 pub const fn flags(&self) -> HeaderTagFlag {
38 self.header.flags()
39 }
40
41 #[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}