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}