use crate::native_types::Witness;
use msgpack_tagged::MsgpackTagged;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Hash, Copy, Default)]
#[derive(Serialize, Deserialize, MsgpackTagged)]
#[cfg_attr(feature = "arb", derive(proptest_derive::Arbitrary))]
pub struct BlockId(u32);
impl BlockId {
pub fn new(id: u32) -> Self {
BlockId(id)
}
pub fn as_u32(&self) -> u32 {
self.0
}
}
impl std::fmt::Display for BlockId {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "b{}", self.0)
}
}
#[derive(Clone, PartialEq, Eq, Debug, Hash, Copy)]
#[derive(MsgpackTagged)]
#[tagged(via(bool))]
#[cfg_attr(feature = "arb", derive(proptest_derive::Arbitrary))]
pub enum MemOpKind {
Read,
Write,
}
impl Serialize for MemOpKind {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_bool(matches!(self, MemOpKind::Write))
}
}
impl<'de> Deserialize<'de> for MemOpKind {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
Ok(if bool::deserialize(deserializer)? { MemOpKind::Write } else { MemOpKind::Read })
}
}
#[derive(Clone, PartialEq, Eq, Debug, Hash)]
#[derive(Serialize, Deserialize, MsgpackTagged)]
#[cfg_attr(feature = "arb", derive(proptest_derive::Arbitrary))]
pub struct MemOp {
#[serde(rename = "read")]
#[tag(0)]
pub operation: MemOpKind,
#[tag(1)]
pub index: Witness,
#[tag(2)]
pub value: Witness,
}
impl MemOp {
pub fn read_at_mem_index(index: Witness, value: Witness) -> Self {
MemOp { operation: MemOpKind::Read, index, value }
}
pub fn write_to_mem_index(index: Witness, value: Witness) -> Self {
MemOp { operation: MemOpKind::Write, index, value }
}
}