add get_state_part_kinds! macro

This commit is contained in:
Jacob Lifshay 2025-09-04 21:41:12 -07:00
parent 6d36698adf
commit f0e3aef061
Signed by: programmerjake
SSH key fingerprint: SHA256:HnFTLGpSm4Q4Fj502oCFisjZSoakwEuTsJJMSke63RQ
2 changed files with 172 additions and 0 deletions

View file

@ -23,6 +23,8 @@ use std::{
}; };
use vec_map::VecMap; use vec_map::VecMap;
pub(crate) mod parts;
pub(crate) type SmallUInt = u64; pub(crate) type SmallUInt = u64;
pub(crate) type SmallSInt = i64; pub(crate) type SmallSInt = i64;
pub(crate) const MIN_BITS_FOR_NEEDING_BIG: usize = SmallUInt::BITS as usize + 1; pub(crate) const MIN_BITS_FOR_NEEDING_BIG: usize = SmallUInt::BITS as usize + 1;

View file

@ -0,0 +1,170 @@
// SPDX-License-Identifier: LGPL-3.0-or-later
// See Notices.txt for copyright information
use crate::util::const_str_cmp;
#[rustfmt::skip]
macro_rules! make_get_state_part_kinds {
(
#![dollar = $d:tt]
$(state_part! {
singular_field = $state_singular_fields:ident;
plural_field = $state_plural_fields:ident;
kind = $state_kinds:ident;
singular_variant = $state_singular_variants:ident;
plural_variant = $state_plural_variants:ident;
})*
$(type_part! {
singular_field = $type_singular_fields:ident;
plural_field = $type_plural_fields:ident;
kind = $type_kinds:ident;
singular_variant = $type_singular_variants:ident;
plural_variant = $type_plural_variants:ident;
copy_insn = $copy_insn:ident;
})*
) => {
make_get_state_part_kinds! {
#![dollar = $d]
parts! {
[$(state_singular_fields = (#[state] $state_singular_fields),)* $(state_singular_fields = (#[type] $type_singular_fields),)*];
[$(type_singular_fields = ($type_singular_fields),)*];
[$(state_plural_fields = (#[state] $state_plural_fields),)* $(state_plural_fields = (#[type] $type_plural_fields),)*];
[$(type_plural_fields = ($type_plural_fields),)*];
[$(state_kinds = (#[state] $state_kinds),)* $(state_kinds = (#[type] $type_kinds),)*];
[$(type_kinds = ($type_kinds),)*];
[$(state_singular_variants = (#[state] $state_singular_variants),)* $(state_singular_variants = (#[type] $type_singular_variants),)*];
[$(type_singular_variants = ($type_singular_variants),)*];
[$(state_plural_variants = (#[state] $state_plural_variants),)* $(state_plural_variants = (#[type] $type_plural_variants),)*];
[$(type_plural_variants = ($type_plural_variants),)*];
[$(copy_insns = ($copy_insn),)*];
}
}
};
(
#![dollar = $d:tt]
parts! {
$([
$first_name:ident = ($($first_value:tt)*),
$($name:ident = ($($value:tt)*),)*
];)*
}
) => {
const _: () = {
$($(assert!(const_str_cmp(stringify!($first_name), stringify!($name)).is_eq());)*)*
};
macro_rules! get_state_part_kinds {
($d macro_ident:ident! {$d ($d args:tt)*}) => {
get_state_part_kinds! {
@expand
$d macro_ident! {}
($d ($d args)*)
()
}
};
($d macro_ident:ident!($d ($d args:tt)*)) => {
get_state_part_kinds! {
@expand
$d macro_ident!()
($d ($d args)*)
()
}
};
(
@expand
$d macro_ident:ident! {}
()
($d ($d args:tt)*)
) => {
$d macro_ident! {
$d ($d args)*
}
};
(
@expand
$d macro_ident:ident!()
()
($d ($d args:tt)*)
) => {
$d macro_ident!(
$d ($d args)*
)
};
(
@expand
$d macro_ident:ident! $d group:tt
(, $d ($d rest:tt)*)
($d ($d prev_args:tt)*)
) => {
get_state_part_kinds! {
@expand
$d macro_ident! $d group
($d ($d rest)*)
($d ($d prev_args)*,)
}
};
(
@expand
$d macro_ident:ident! $d group:tt
(custom = $d custom:tt $d ($d rest:tt)*)
($d ($d prev_args:tt)*)
) => {
get_state_part_kinds! {
@expand
$d macro_ident! $d group
($d ($d rest)*)
($d ($d prev_args)* custom = $d custom)
}
};
$((
@expand
$d macro_ident:ident! $d group:tt
($first_name $d ($d rest:tt)*)
($d ($d prev_args:tt)*)
) => {
get_state_part_kinds! {
@expand
$d macro_ident! $d group
($d ($d rest)*)
($d ($d prev_args)* $first_name = [$($first_value)*, $($($value)*,)*])
}
};)*
(
@expand
$d macro_ident:ident! $d group:tt
($d unexpected:tt $d ($d rest:tt)*)
($d ($d prev_args:tt)*)
) => {
compile_error! {concat!("Unexpected token: ", stringify!($d unexpected))}
};
}
pub(crate) use get_state_part_kinds;
};
}
make_get_state_part_kinds! {
#![dollar = $]
state_part! {
singular_field = memory;
plural_field = memories;
kind = StatePartKindMemories;
singular_variant = Memory;
plural_variant = Memories;
}
type_part! {
singular_field = small_slot;
plural_field = small_slots;
kind = StatePartKindSmallSlots;
singular_variant = SmallSlot;
plural_variant = SmallSlots;
copy_insn = CopySmall;
}
type_part! {
singular_field = big_slot;
plural_field = big_slots;
kind = StatePartKindBigSlots;
singular_variant = BigSlot;
plural_variant = BigSlots;
copy_insn = Copy;
}
}