diff --git a/src/protocol/eval/value.rs b/src/protocol/eval/value.rs index 9d9d1736c3a51487dd77f3215782dd1149e0671b..d8bf773b7bc74426a37fa54ad573c4c0d6d8bd00 100644 --- a/src/protocol/eval/value.rs +++ b/src/protocol/eval/value.rs @@ -65,39 +65,26 @@ pub enum Value { Struct(HeapPos), } -macro_rules! impl_union_unpack_as_value { - ($func_name:ident, $variant_name:path, $return_type:ty) => { - impl Value { - pub(crate) fn $func_name(&self) -> $return_type { - match self { - $variant_name(v) => *v, - _ => panic!(concat!("called ", stringify!($func_name()), " on {:?}"), self), - } - } - } - } -} - -impl_union_unpack_as_value!(as_stack_boundary, Value::PrevStackBoundary, isize); -impl_union_unpack_as_value!(as_ref, Value::Ref, ValueId); -impl_union_unpack_as_value!(as_input, Value::Input, PortId); -impl_union_unpack_as_value!(as_output, Value::Output, PortId); -impl_union_unpack_as_value!(as_message, Value::Message, HeapPos); -impl_union_unpack_as_value!(as_bool, Value::Bool, bool); -impl_union_unpack_as_value!(as_char, Value::Char, char); -impl_union_unpack_as_value!(as_string, Value::String, HeapPos); -impl_union_unpack_as_value!(as_uint8, Value::UInt8, u8); -impl_union_unpack_as_value!(as_uint16, Value::UInt16, u16); -impl_union_unpack_as_value!(as_uint32, Value::UInt32, u32); -impl_union_unpack_as_value!(as_uint64, Value::UInt64, u64); -impl_union_unpack_as_value!(as_sint8, Value::SInt8, i8); -impl_union_unpack_as_value!(as_sint16, Value::SInt16, i16); -impl_union_unpack_as_value!(as_sint32, Value::SInt32, i32); -impl_union_unpack_as_value!(as_sint64, Value::SInt64, i64); -impl_union_unpack_as_value!(as_array, Value::Array, HeapPos); -impl_union_unpack_as_value!(as_tuple, Value::Tuple, HeapPos); -impl_union_unpack_as_value!(as_enum, Value::Enum, i64); -impl_union_unpack_as_value!(as_struct, Value::Struct, HeapPos); +union_cast_to_value_method_impl!(as_stack_boundary, isize, Value::PrevStackBoundary); +union_cast_to_value_method_impl!(as_ref, ValueId, Value::Ref); +union_cast_to_value_method_impl!(as_input, PortId, Value::Input); +union_cast_to_value_method_impl!(as_output, PortId, Value::Output); +union_cast_to_value_method_impl!(as_message, HeapPos, Value::Message); +union_cast_to_value_method_impl!(as_bool, bool, Value::Bool); +union_cast_to_value_method_impl!(as_char, char, Value::Char); +union_cast_to_value_method_impl!(as_string, HeapPos, Value::String); +union_cast_to_value_method_impl!(as_uint8, u8, Value::UInt8); +union_cast_to_value_method_impl!(as_uint16, u16, Value::UInt16); +union_cast_to_value_method_impl!(as_uint32, u32, Value::UInt32); +union_cast_to_value_method_impl!(as_uint64, u64, Value::UInt64); +union_cast_to_value_method_impl!(as_sint8, i8, Value::SInt8); +union_cast_to_value_method_impl!(as_sint16, i16, Value::SInt16); +union_cast_to_value_method_impl!(as_sint32, i32, Value::SInt32); +union_cast_to_value_method_impl!(as_sint64, i64, Value::SInt64); +union_cast_to_value_method_impl!(as_array, HeapPos, Value::Array); +union_cast_to_value_method_impl!(as_tuple, HeapPos, Value::Tuple); +union_cast_to_value_method_impl!(as_enum, i64, Value::Enum); +union_cast_to_value_method_impl!(as_struct, HeapPos, Value::Struct); impl Value { pub(crate) fn as_union(&self) -> (i64, HeapPos) { @@ -107,6 +94,14 @@ impl Value { } } + pub(crate) fn as_port_id(&self) -> PortId { + match self { + Value::Input(v) => *v, + Value::Output(v) => *v, + _ => unreachable!(), + } + } + pub(crate) fn is_integer(&self) -> bool { match self { Value::UInt8(_) | Value::UInt16(_) | Value::UInt32(_) | Value::UInt64(_) |