macro_rules! define_scalar_set {
(
$(#[$tag_meta:meta])*
$tag_vis:vis enum $tag:ident {
$(
$(#[$variant_meta:meta])*
$variant:ident => $ty:ty : $kind:ident $level:literal $width:literal
),+ $(,)?
}
$(#[$set_meta:meta])*
$set_vis:vis enum $set:ident;
$( external $ext_variant:ident($ext_ty:ty); )?
) => { ... };
}Expand description
Define a closed scalar set: its tag type, its value enum, and its membership.
The declaration lists each member once. The macro emits the tag enum, the
value enum whose variants hold a
host TypedTensor (TypedTensor<T, DynRank, Host>)
of the member type, and the
ScalarSet implementation. A downstream crate invokes this in its own
crate, so tenferro never needs to know the set.
ยงExamples
use tenferro_tensor::{define_scalar_set, DynRank, Host, ScalarSet, TypedTensor};
define_scalar_set! {
/// Tag for a two-member set.
pub enum PairTag {
/// Double precision.
F64 => f64 : Float 1 64,
/// Single precision.
F32 => f32 : Float 0 32,
}
/// Value enum for a two-member set.
pub enum Pair;
}
let value = Pair::F32(TypedTensor::<f32, DynRank, Host>::from_host_vec_col_major(
vec![1],
vec![1.0_f32],
)?);
assert_eq!(value.tag(), PairTag::F32);
assert_eq!(<Pair as ScalarSet>::TAGS, &[PairTag::F64, PairTag::F32]);