Skip to main content

define_scalar_set

Macro define_scalar_set 

Source
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]);