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