resource_table/
macro.rs

1#[macro_export]
2macro_rules! resource_table {
3    {$($(#[$attr:meta])* $v:vis static $i:ident : $t:ty = $e:expr;)*} => {
4        #[doc(hidden)]
5        mod _resource_table {
6            use super::*;
7
8            #[repr(C)]
9            #[allow(nonstandard_style)]
10            pub struct _ResourceTable {
11                _resource_table_header: $crate::types::Header<{
12                    [$(stringify!($i),)*].len()
13                }>,
14                $(pub $i: $crate::types::Resource<$t>,)*
15            }
16
17            #[unsafe(link_section = ".resource_table")]
18            #[unsafe(export_name = "_RESOURCE_TABLE")]
19            #[allow(dead_code)]
20            pub static mut _RESOURCE_TABLE: _ResourceTable = _ResourceTable {
21                _resource_table_header: $crate::types::Header::new([
22                    $(core::mem::offset_of!(_ResourceTable, $i) as u32,)*
23                ]),
24                $($i: {
25                    assert!(
26                        core::mem::align_of::<$t>() <= 4,
27                        concat!(
28                            "resource ",
29                            stringify!($t),
30                            " has bad alignment",
31                        ),
32                    );
33                    $crate::types::Resource::new($e)
34                },)*
35            };
36        }
37
38        $(
39            #[allow(dead_code)]
40            $(#[$attr])*
41            $v static $i: $crate::types::Handle<$t> = unsafe {
42                $crate::types::Handle::new(
43                    &raw mut _resource_table::_RESOURCE_TABLE.$i.data,
44                )
45            };
46        )*
47    };
48}